Mer*_*rni 13 c++ default-constructor undefined-behavior c++11
打印b.k时为什么打印会发出警告a.k?我使用VS2013
//warning C4700: uninitialized local variable 'b' used
#include<iostream>
using namespace std;
struct A {
A() {};
int k;
};
struct B {
B() = default;
int k;
};
int main() {
A a;
cout << a.k << endl;
B b;
cout << b.k << endl; // this gives a warning, uninitialized local variable
return 0;
}
Run Code Online (Sandbox Code Playgroud)
访问未初始化的变量是未定义的行为,不需要诊断.这意味着您可以获得b.k(MSVC++),a.k(g ++)或两者(Clang)的警告.
标准报价:
12.6.2初始化基数和成员[class.base.init]
8在非委托构造函数中,如果给定的非静态数据成员或基类未由mem-initializer-id指定(包括没有mem-initializer-list的情况,因为构造函数没有ctor-initializer然后,实体不是抽象类(10.4)的虚基类
[一堆不适用的条款]
- 否则,实体默认初始化(8.5).
8.5初始值设定项[dcl.init]
7默认初始化T类型的对象意味着:
[一堆不适用的条款]
- 否则,不执行初始化.
12.6.2/8引用有这个例子:
struct C {
C() { } // initializes members as follows:
A a; // OK: calls A::A()
const B b; // error: B has no default constructor
int i; // OK: i has indeterminate value // <---------- your code
int j = 5; // OK: j has the value 5
};
Run Code Online (Sandbox Code Playgroud)