严格的别名冲突
Strict aliasing violation
以下程序是否违反了严格的别名规则?
#include <cstdint>
int main()
{
double d = 0.1;
//std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation
//auto n{*reinterpret_cast<std::int64_t*>(&d)}; // aliasing violation
auto nptr{reinterpret_cast<std::int64_t*>(&d)};
auto& n{*nptr};
++n;
}
VS2015、clang 或 gcc 未发出警告。
以下程序是否违反了严格的别名规则?
是的,确实如此。您正在使用std::int64_t*
取消引用double*
(&d
)。
违反严格别名规则的行是:
auto& n{*nptr};
在处理该行时,编译器不一定知道如何设置nptr
的值。在处理该行时,它是double*
的别名这一事实并不明显。
是的,这违反了严格的混叠。您正在访问double
类型的对象d
,尽管指针nptr
不是指向double
或与之相关的任何类型的指针。
仅仅因为编译器不发出警告并不意味着它不是违规。严格产生的违规是 UB(因为它们是运行时行为的问题),因此不需要诊断。
相关文章:
- 部分定义/别名模板模板参数
- 写入位置0x0000000C时发生访问冲突
- 如何在C++20中创建模板别名的推导指南
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 告诉c++编译器该参数没有别名
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- 继承模板类中的类型别名
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- C++尝试深度复制唯一指针时出现内存访问冲突
- 错误:使用通用引用的声明冲突
- 解耦嵌套类:使用模板别名时出现"模板声明冲突"错误
- 严格的别名冲突
- C++名称与typedef别名和继承的名称冲突