右值构造函数没有被调用?

Rvalue constructor not being called?

我有这个结构

struct A {
    A()             { cout << "Default\n"; }
    A(const A& a)   { cout << "Const lvalue\n"; }
    A(const A&& a)  { cout << "Const rvalue\n"; }
    A(A& a)         { cout << "Lvalue\n"; }
    A(A&& a)        { cout << "Rvalue\n"; }
};

我用它来理解 rvalues/lvalues。

做的时候

A a1;
A a2{ a1 };

const A a3;
A a4{ a3 };

它正确输出

> Default
> lvalue
> Default
> Const lvalue

问题是当我做类似

的事情时
A a{ A() };

输出为默认值。但是 A() 不是右值吗?不应该调用 A::A(A&&)A::A(const A&&) 吗?这里发生了什么?

您没有看到 Rvalue 打印,因为编译器正在 eliding 移动。这是允许的即使构造函数有副作用

如果您将 -fno-elide-constructors 传递给 GCC 或 Clang,您将看到输出:

clang++ -std=c++14 -O2 -pedantic -fno-elide-constructors main.cpp && ./a.out
Default
Rvalue

clang++ -std=c++14 -O2 -pedantic main.cpp && ./a.out
Default