来自复制构造函数的维基百科页面:
X a = X();
// valid given X(const X& copy_from_me) but not valid given X(X& copy_from_me)
// because the second wants a non-const X&
// to create a, the compiler first creates a temporary by invoking the default constructor
// of X, then uses the copy constructor to initialize as a copy of that temporary.
// For some compilers both versions actually work but this behaviour should not be relied
// upon because it's non-standard.
具体来说部分:
" 编译器首先通过调用默认值创建一个临时 X 的构造函数,然后使用复制构造函数初始化为 该临时的副本。"
我的问题是(假设这是正确的)为什么会这样? 从代码中,我猜编译器在构造 X 后会使用赋值运算符。
我猜是因为赋值发生在与初始化相同的表达式中?
另外,使用此公式的原因是什么,而不仅仅是正常的初始化X a;
或者如果您想复制X a(b);
?
因为代码正在构造一个对象。这里的 = 符号正在初始化,而不是分配。您只能分配给现有对象,而不能分配给正在构建的对象。
这只是理解C++语法的问题。语句 X a = X();
是带有初始值设定项的声明语句,而不是赋值表达式。此语句的语法含义是声明一个 X
类型的变量a
,并从表达式 X()
复制初始化它。这里不以任何方式涉及任何任务。