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&&)
?这里发生了什么?
答
你没有看到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
请允许我为你指点['标准:: move'(http://en.cppreference.com/ w/cpp/utility/move) – InternetAussie
谢谢,解决了这个问题,但是为什么在这个例子中我没有给任何构造函数调用? – Garmekain
复制构造函数不一定会被调用。在这种情况下,编译器可能会在不复制的情况下直接创建'A()'来代替'a'。 – zoska