相关疑难解决方法(0)

允许使用char*对T*进行别名化.是否也允许反过来?

注意:此问题已重命名并缩小,以使其更具针对性和可读性.大多数评论都涉及旧文本.


根据标准,不同类型的对象可能不共享相同的存储位置.所以这不合法:

std::array<short, 4> shorts;
int* i = reinterpret_cast<int*>(shorts.data()); // Not OK
Run Code Online (Sandbox Code Playgroud)

但是,该标准允许此规则的例外:可以通过指向char或的指针访问任何对象unsigned char:

int i = 0;
char * c = reinterpret_cast<char*>(&i); // OK
Run Code Online (Sandbox Code Playgroud)

但是,我不清楚这是否也允许反过来.例如:

char * c = read_socket(...);
unsigned * u = reinterpret_cast<unsigned*>(c); // huh?
Run Code Online (Sandbox Code Playgroud)

c++ strict-aliasing language-lawyer type-punning

27
推荐指数
2
解决办法
3024
查看次数

这是使用std :: array未定义的行为吗?

可能重复:
允许使用`char*`别名`T*`.是否也允许反过来?

我使用std::arraychars到持有未知的原始类型,这是不超过10个字节长,像这样的一个值:

std::array<char, 10> val;
*reinterpret_cast<double*>(val.data()) = 6.3;
//blah blah blah...
double stuff = *reinterpret_cast<double*>(val.data());
Run Code Online (Sandbox Code Playgroud)

我已经读过,来回转换char *并不是未定义的,因为编译器假设char *可以为任何类型的值设置别名.当值放在(我假设的)char对象内部的s 数组时,这仍然有效吗?

注意:我知道我可以在这里使用union,但这会导致我正在做的大量样板代码,并且我想在必要时避免它,因此问题.

c++ undefined-behavior c++11

8
推荐指数
1
解决办法
505
查看次数