c++ - 为什么在 C++1z 的这个例子中,clang 和 g++ 为 a1.v 和 a2.v 打印 0?

标签 c++ c++17

请参阅 [class.base.init]/11 中的示例

struct A {
  A() = default;          // OK
  A(int v) : v(v) { }     // OK
  const int& v = 42;      // OK
};
A a1;                     // error: ill-formed binding of temporary to reference
A a2(1);                  // OK, unfortunately

clang 和 g++ 都编译代码(clang 带有警告),但我想了解为什么它们为成员 a1.v 打印 0a2.v?参见 demo .

最佳答案

他们打印 0 并不重要。

对于 a1,初始化的格式不正确。对于 a2,您将引用绑定(bind)到一个临时引用,因此您最终得到一个悬空引用。 0 没有任何意义 - 它是引用恰好指向该点的垃圾内存。一旦你违反了先决条件,程序就是未定义的行为。

未定义的行为是未定义的。没有理由期望打印有特定的行为。例如,gcc 7 打印 32764 而 clang 4 打印 32765。为什么?为什么不。

关于c++ - 为什么在 C++1z 的这个例子中,clang 和 g++ 为 a1.v 和 a2.v 打印 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40663320/

相关文章:

python - 使用 OpenShift 进行公共(public)客户端应用程序端口转发

c++ - 静态变量无法解析

c++ - 获取用户输入以在私有(private)部分 C++ 中定义变量的值

c++ - C++中一行命令的执行没有返回预期的结果

c++ - ObjC++ 中的原子属性线程安全吗

c++ - 为什么没有为函数参数省略拷贝

c++ - 在什么时候将 unique_lock 与 shared_mutex 一起使用?

c++ - 为什么不能使用结构化绑定(bind)分解 lambda 表达式的捕获列表

c++ - 通过右值引用返回与通过值返回

c++ - 由于C++17支持数组的shared_ptr,这是否意味着ctor和reset中不再需要T[]的显式删除器?