为什么我的右值复制构造函数不起作用?

时间:2018-01-03 19:08:42

标签: c++

我正在用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;输出)。

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

您正在看到一种复制省略形式 - 实际上,编译器需要通过使用构造函数表达式的参数({{1})直接初始化A a = A()来优化和实现a。在这种情况下)而不是创建一个临时的,并将其复制到一个。如果要强制执行要复制的未命名对象,则需要使用不是简单构造函数调用的表达式初始化()

请注意,即使这样,编译器也可能会通过as-if规则忽略construtor调用(如果唯一可见的副作用在复制/移动构造函数/析构函数中。最好的选择是&#34;强制&#34; a调用移动ctor是使用命名值a

std::move