另一个C++问题,我试图弄清楚在构造对象时使用"=“会产生什么影响。考虑:
class Foo {
private:
int bar;
int baz;
public:
Foo(int bar, int baz)
:bar(bar), baz(baz) {}
};
int main() {
Foo foo1{4, 2};
Foo foo2 = {4, 2};
Foo foo3 = Foo{4, 2}; // I prefer this one for aesthetic reasons.
return 0;
}有什么不同之处,我应该坚持哪一个作为最佳实践?
此外,当我们讨论最佳实践时,我听说在构造函数中添加explicit是个好主意,因为™具有隐式转换的奇怪行为。因此,我将explicit添加到Foo的构造函数中。
public:
explicit Foo(int bar, int baz)
:bar(bar), baz(baz) {}突然之间,这个:
Foo foo2 = {4, 2};无法使用错误进行编译:
error: chosen constructor is explicit in copy-initialization为什么会这样呢?
发布于 2016-07-17 09:44:59
有什么不同? Foo foo1{4,2};
我是直接初始化(2)。
在下列情况下执行直接初始化: 2)在列表初始化过程中,如果没有提供初始化器-列表构造函数,并且可以访问匹配的构造函数,那么所有必要的隐式转换都是不收窄的。
Foo foo2 = {4,2};
我是复制列表初始化(6)。对于非直接列表初始化,不考虑显式构造函数。这解释了为什么当您显式地更改构造函数时,程序没有编译。
复制列表初始化(只能调用非显式构造函数) 6)在等号之后用大括号初始化命名变量。
Foo foo3 = Foo{4,2};
这是一个临时对象的直接列表初始化(2),然后是来自临时对象的复制初始化(1)。
直接列表初始化(同时考虑显式和非显式构造函数) 2)初始化带有大括号的未命名临时表。
在下列情况下执行副本初始化:
2)当非引用类型T的命名变量(自动、静态或线程局部)被声明时,初始化器由一个等号组成,后面跟着一个表达式。
首先是最简单的,这也是我喜欢的原因。
第二个构造函数需要一个隐式构造函数,但在其他情况下是可以的。
第三种是重复类型(违反干的),并构造一个不必要的临时(实际上,该副本可能被优化器删除,但该类型必须是可复制的)。
我听说向构造函数添加显式是一个好主意,™。因此,我将显式添加到Foo的构造函数中。
如果要防止隐式转换,向单个参数构造函数添加显式是一个好主意。对于两个参数构造器来说,显式并不是普遍有用的,但我不怀疑在某些情况下您会需要它。
https://stackoverflow.com/questions/38419830
复制相似问题