我只是觉得需要另一个愚蠢的 litb 帖子。
string str1 = "foo";
被称为copy-initialization,因为如果编译器不删除任何临时变量,它的作用是:
string str1(string("foo"));
除了检查使用的转换构造函数是隐式的。事实上,所有隐式转换都是由标准根据复制初始化定义的。据说从 U 类型到 T 类型的隐式转换是有效的,如果
T t = u; // u of type U
有效。
相比之下,
string str1("foo");
完全按照所写的进行,称为直接初始化。它也适用于显式构造函数。
顺便说一句,您可以使用 -fno-elide-constructors 来禁用对临时对象的省略:
-fno-elide-constructors
The C++ standard allows an implementation to omit creating a temporary which
is only used to initialize another object of the same type. Specifying this
option disables that optimization, and forces G++ to call the copy constructor
in all cases.
标准说两者之间几乎没有区别
T a = u;
和
T a(u);
如果 T 和 u 的类型是原始类型。所以你可以使用这两种形式。我认为正是它的风格使人们使用第一种形式而不是第二种形式。
有些人可能在某些情况下使用第一个,因为他们想消除声明的歧义:
T u(v(a));
可能会将某人视为变量u 的定义,该变量使用v 类型的临时变量进行初始化,该变量为其构造函数获取一个名为a 的参数。但实际上,编译器的作用是这样的:
T u(v a);
它创建一个函数声明,该声明接受一个类型为v 的参数,并带有一个名为a 的参数。所以人们会这样做
T u = v(a);
消除歧义,即使他们本可以这样做
T u((v(a)));
同样,因为函数参数周围从来没有括号,编译器也会将其作为变量定义而不是函数声明来读取:)