有人可以在http://en.cppreference.com/w/cpp/types/aligned_storage中解释关于铸造的一些代码吗?
可以使用以下代码
return *static_cast<const T*>(static_cast<const void*>(&data[pos]));
Run Code Online (Sandbox Code Playgroud)
被替换为
return *reinterpret_cast<const T*>(&data[pos]);
Run Code Online (Sandbox Code Playgroud)
?
为什么这里使用两个铸件?非常感谢.
香港
struct A{};
struct B : A{};
int main()
{
A a;
A& a_ref = a;
static_cast<B>(a); // *1
static_cast<B&>(a_ref); // *2
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(*1)产生错误,我理解为什么.(*2)编译好,但为什么?并且,只要它编译并假设B包含一些属性,如果我a_ref转换B&然后尝试访问属性怎么办?我想我会遇到运行时错误.
所以,正如我所看到的,有一种情况会导致崩溃并且没有办法避免崩溃,这与dynamic_cast人们可以检查转换为null的结果或将代码放在某个try-catch区域中的情况不同.我如何处理这种情况,我需要投射参考,并确保我真正得到正确的参考.
取自 GCC 实现type_traits为什么static_cast需要这里?
template <typename _Tp, typename... _Args>
struct __is_nt_constructible_impl
: public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {};
template <typename _Tp, typename _Arg>
struct __is_nt_constructible_impl<_Tp, _Arg>
: public integral_constant<bool,
// Why is `static_cast` needed here?
noexcept(static_cast<_Tp>(declval<_Arg>()))> {};
Run Code Online (Sandbox Code Playgroud) 我有一个结构模板,它采用两种类型(T和S),并在某些时候使用a static_cast从一种类型转换为另一种类型.它往往是那么回事T,并S属于同一类型.
设置的简化示例:
template <typename T, typename S = T>
struct foo
{
void bar(T val)
{
/* ... */
some_other_function(static_cast<S>(val));
/* ... */
}
};
Run Code Online (Sandbox Code Playgroud)
在S与类相同的情况下,是否T可以static_cast引入额外的开销,或者它是否总是被忽略的空操作?
如果它确实引入了开销,是否有一个简单的模板元编程技巧,static_cast只在需要时执行,或者我是否需要创建部分特化以应对T == S案例?foo如果可能的话,我宁愿避免整个模板的部分特化.
将双数组转换为由双精度构成的结构是否可以?
struct A
{
double x;
double y;
double z;
};
int main (int argc , char ** argv)
{
double arr[3] = {1.0,2.0,3.0};
A* a = static_cast<A*>(static_cast<void*>(arr));
std::cout << a->x << " " << a->y << " " << a->z << "\n";
}
Run Code Online (Sandbox Code Playgroud)
这打印1 2 3.但它是否保证每次都可以与任何编译器一起工作?
编辑:根据
9.2.21:指向标准布局结构对象的指针,适当转换?使用reinterpret_cast,指向其初始成员(...),反之亦然.
如果我用我的代码替换
struct A
{
double & x() { return data[0]; }
double & y() { return data[1]; }
double & z() { return data[2]; }
private:
double data[3];
}; …Run Code Online (Sandbox Code Playgroud) 我正在尝试(并已解决)包含SSE优化成员的类的16字节对齐问题.但令我烦恼的是,我在网上找到的大部分例子都包含一行代码,对我来说似乎完全是多余的,但在很多地方都会重复.
public:
void* operator new (size_t size)throw (std::bad_alloc)
{
void * p = _aligned_malloc(size, 16);
if (p == 0) throw std::bad_alloc();
return p;
}
void operator delete (void *p)
{
Camera* pC = static_cast<Camera*>(p);
_aligned_free(p);
}
Run Code Online (Sandbox Code Playgroud)
这条线是
Camera* pC = static_cast<Camera*>(p);
Run Code Online (Sandbox Code Playgroud)
由于pC从未被引用并且在函数结束时超出范围,所以有什么意义呢?我试过把这条线拿出去,它似乎完全没有区别,但这一行出现在很多例子中!我是否遗漏了一些非常明显的东西,或者有一些异常的代码被盲目地从一个例子复制到另一个例子并在很多"教程"中变得流行?
我试图使用奇怪的重复模板模式实现静态多态性,当我注意到static_cast<>,通常在编译时检查一个类型是否实际可以转换为另一个,在基类声明中错过了一个错误,允许代码向下转换基础与其中一个兄弟姐妹同课:
#include <iostream>
using namespace std;
template< typename T >
struct CRTP
{
void do_it( )
{
static_cast< T& >( *this ).execute( );
}
};
struct A : CRTP< A >
{
void execute( )
{
cout << "A" << endl;
}
};
struct B : CRTP< B >
{
void execute( )
{
cout << "B" << endl;
}
};
struct C : CRTP< A > // it should be CRTP< C >, but typo …Run Code Online (Sandbox Code Playgroud) 在当前的标准草案(和C++ 17)中,这是关于static_casting的void *:
类型"指针的prvalue CV1空隙"可以被转换成类型的prvalue"指针CV2 T",其中T是一个对象类型和CV2是相同的CV-资格,或更大的CV-资格比,CV1.如果原始指针值表示存储器中字节的地址A而A不满足T的对齐要求,则未指定结果指针值.否则,如果原始指针值指向对象a,并且存在类型为T(忽略cv-qualification)的对象b,该对象b是指针可互换的,则结果是指向b的指针.否则,转换指针值不变.
我想知道,转换是指针可互换的有什么区别?有没有一种情况,当一个void *东西指向一个指针 - 可互换实际上改变指针值?这种区别的意图是什么?
对于完整性指针可互换:
如果出现以下情况,则两个对象a和b是指针可互换的:
- (4.1)它们是同一个对象,或者
- (4.2)一个是union对象,另一个是该对象的非静态数据成员([class.union]),或者
- (4.3)一个是标准布局类对象,另一个是该对象的第一个非静态数据成员,或者,如果该对象没有非静态数据成员,则该对象的任何基类子对象([class. mem]),或
- (4.4)存在对象c,使得a和c是指针可互换的,并且c和b是指针可互换的.
如果两个对象是指针可互换的,则它们具有相同的地址,并且可以通过reinterpret_cast从指向另一个的指针获得指向一个对象的指针.
我对以下代码段有疑问:
long l=9223372036854775807L;
float f=static_cast<float>(l);
Run Code Online (Sandbox Code Playgroud)
根据IEEE754,不能完全表示long值。
我的问题是如何处理有损转换:
我知道这个问题 ,将int转换为float时在后台会发生什么,但这不会解决我的问题。
ISO/IEC 14882:2020
22.2.1.16 注 8:分配器中的默认构造将调用::new ((void*)p) T(args),但专用分配器可以选择不同的定义。
请您告诉我是否有任何原因不可以::new (static_cast<void*>(p)) T(args)?