我有这个结构
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,那么您将看到输出:
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
关于c++ - 右值构造函数没有被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43849612/