C++11引入了新的通用初始化方式,这可能会很好用。问题是:旧语法中的任何一种初始化对象的方式是否被认为已经过时了。在C++03中,一个对象可以被初始化为:
Foo bar(x)
Foo bar=Foo(x)
选项(1)更受欢迎,因为它不涉及复制。在C++11中还有更多的方法:
Foo bar{x}
auto bar=Foo{x}
有了移动构造函数和赋值运算符,选项(4)也应该没问题了。是(1)被认为已过时,而推荐使用(3)或(4)吗?
此外,在C++03中,规则是所有只接受一个参数的构造函数都应该是显式的(除了拷贝构造函数)。其他构造函数总是显式的。使用通用初始化方式后,任何构造函数都可以是隐式的。新规则是到处都放显式吗,还是只在转换会导致副作用(分配大量内存、创建文件等)或丢失信息(double到float)时才放显式?
Foo bar = x
(这样就和第一种写法完全一致了)。为什么要显式地创建一个临时对象,然后再调用复制构造函数呢? - luk32Foo bar = x
将无法编译。不管怎样,在选项(2)和(4)中的复制或移动通常会被省略,所以不用担心。 - Brandlingo