【发布时间】:2016-12-16 04:04:37
【问题描述】:
我知道标准中明确允许以下内容:
int n = 0;
char *ptr = (char *) &n;
cout << *ptr;
这个怎么样?
alignas(int) char storage[sizeof(int)];
int *ptr = (int *) &storage[0];
*ptr = 0;
cout << *ptr;
本质上,我问的是别名规则是否允许通过指向另一种类型的指针访问一系列字符。如果可能的话,我想参考标准中指明一种或另一种方式的部分。
标准的某些部分让我感到矛盾; (3.10.10) 似乎表明假设storage 的动态类型不是int,这将是未定义的行为。然而,动态类型的定义我并不清楚,std::aligned_storage 的存在会让我相信这是可能的。
【问题讨论】:
-
投反对票的人可以离开 cmets 吗?
-
我不知道您是否可以这样做,但是标准定义了以您尝试的方式访问
aligned_storage中的变量 -
我没有投票,但如果要求参考标准,我希望您展示您自己的研究并引用您认为相关的部分 - 并描述您自己不确定的结论.
-
@chbaker0 查看我在上面给出的链接,示例实现(希望符合标准)与您在这里所做的几乎相同
-
@user2079303 好点,我会在我的研究中添加让我感到矛盾的研究
标签: c++ language-lawyer strict-aliasing