对于原始类型都是等价的,它对于用户定义的类类型是有差别的。在这两种情况下,执行的代码都是相同的(在执行基本优化之后),但如果我们正在初始化的元素不是我们正在构建的类型,则对类型的要求会有所不同。
的复制初始化(T t = u;
)相当于从临时T
类型已被隐式地从u
转换为t
的复制结构。另一方面,直接初始化相当于直接调用相应的构造函数。
虽然在大多数情况下,不会有任何区别,如果采取u
构造函数声明explicit
或者如果拷贝构造无法访问,然后复制初始化将失败:
struct A {
explicit A(int) {}
};
struct B {
B(int) {}
private:
B(B const &);
};
int main() {
A a(1); // ok
B b(1); // ok
// A a2 = 1; // error: cannot convert from int to A
// B b2 = 1; // error: B(B const &) is not accessible
}
对于一些历史背景,初始原始类型必须用复制初始化进行初始化。当* initializer-list *被添加到语言中以初始化类中的成员属性时,决定使用与保持初始化程序列表中的语法统一且简单的类相同的语法来初始化基本类型。同时允许通过复制初始化对类进行初始化,使得用户定义的类型更接近原始类型。两种初始化格式的区别很自然:int a = 5.0;
被处理为从5.0
到int
的转换,然后从int
初始化a
。用户定义类型也是如此:T u = v;
作为从v
到T
的转换处理,然后从该转换后的值中复制u
的构造。
这不是一个声明,它的定义。沟教程和[阅读一本体面的书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。用C++进行思考是免费的,可以从作者的页面获得。 –
@Cat Plus Plus:这是一个定义,但这并不意味着它不是一个声明。 –
@JamesMcNellis:它应该是一个教程,调用定义声明无助于摆脱两者之间的混淆。也许我今天只是胡思乱想而已。 :+ –