未初始化的局部变量,默认为c ++ 11

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)

Tem*_*Rex 8

访问未初始化的变量是未定义的行为,不需要诊断.这意味着您可以获得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)