Rvalue构造函数没有被调用?

问题描述:

我有这样的结构Rvalue构造函数没有被调用?

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"; } 
}; 

我使用的是理解右值/左值它。

在做

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&&)?这里发生了什么?

+3

请允许我为你指点['标准:: move'(http://en.cppreference.com/ w/cpp/utility/move) – InternetAussie

+0

谢谢,解决了这个问题,但是为什么在这个例子中我没有给任何构造函数调用? – Garmekain

+0

复制构造函数不一定会被调用。在这种情况下,编译器可能会在不复制的情况下直接创建'A()'来代替'a'。 – zoska

你没有看到Rvalue打印,因为编译器是eliding的举动。即使构造函数具有副作用,也允许使用

如果传递-fno-elide-constructors到GCC或锵然后你会看到输出:

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