局部变量的初始化:这些方法在语义上是不同的吗?

时间:2014-08-23 17:56:00

标签: c++

C++中,以下3种初始化方法之间是否存在语义差异?

T t;
T t = T();
auto t = T();

我对w.r.t.的差异感兴趣复制构造函数,析构函数和赋值操作符行为。

1 个答案:

答案 0 :(得分:2)

它们并不等同。如果它是POD类型,则第一个会离开t 未初始化,而后两个将无论如何都会对对象进行值初始化。例如:

#include <iostream>

using namespace std;

int main()
{
    int a = int();

    cout << a << endl;
    return 0;
}

结果:

$ clang++ -O2 -o init init.cpp
$ ./init
0

而这:

#include <iostream>

using namespace std;

int main()
{
    int a;

    cout << a << endl;
    return 0;
}

会输出一些垃圾(或崩溃,或让恶魔飞出你的鼻子),因为它有未初始化对象引起的未定义行为:

$ clang++ -O2 -o init init.cpp
$ ./init
1348959264

关于复制构造函数和赋值运算符的问题:第二个和第三个片段可能会调用其中一个(或者可能不会,因为复制省略),因此它们中的任何一个(或两者)都需要可用。