我正在用C ++测试我的知识并遇到了问题。请考虑以下代码:
class A
{
public:
A(int n = 0)
: m_n(n)
{
std::cout << 'd';
}
A(const A& a)
: m_n(a.m_n)
{
std::cout << 'c';
}
A(A&& a){
std::cout<<'r';
}
private:
int m_n;
};
int main()
{
A a = A();
std::cout << std::endl;
return 0;
}
显然,A()构造函数是一个rvalue,因为没有创建永久对象。所以我认为首先我必须看到&#34; d&#34;作为输出。然后我们将rvalue复制到我们的新对象,该对象尚未初始化。我已经实现了一个复制构造函数,它接受一个rvalue作为参数,但我没有看到证据(没有&#34; r&#34;输出)。
有人可以解释为什么会这样吗?
答案 0 :(得分:1)
您正在看到一种复制省略形式 - 实际上,编译器需要通过使用构造函数表达式的参数({{1})直接初始化A a = A()
来优化和实现a
。在这种情况下)而不是创建一个临时的,并将其复制到一个。如果要强制执行要复制的未命名对象,则需要使用不是简单构造函数调用的表达式初始化()
。
请注意,即使这样,编译器也可能会通过as-if规则忽略construtor调用(如果唯一可见的副作用在复制/移动构造函数/析构函数中。最好的选择是&#34;强制&#34; a调用移动ctor是使用命名值a
:
std::move