在C++
中,以下3种初始化方法之间是否存在语义差异?
T t;
T t = T();
auto t = T();
我对w.r.t.的差异感兴趣复制构造函数,析构函数和赋值操作符行为。
答案 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
关于复制构造函数和赋值运算符的问题:第二个和第三个片段可能会调用其中一个(或者可能不会,因为复制省略),因此它们中的任何一个(或两者)都需要可用。