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

标签 c++ rvalue-reference move-constructor

我有这个结构

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/

相关文章:

C++ bad_cast 异常将 *this 转换为派生模板类

c++ - 需要 Meyers Effective C++ Widget 右值实例讲解

c++ - 当我取消注释移动构造函数 A(A&&) 时,下面的代码片段会发生什么?

c++ - 当派生对象绑定(bind)到基类引用时复制/移动/转换语义?

c++ - 在 C++ 中使用 strptime 时出错

c++ - 更有效地遍历原始视频

c++ - 为什么 xvalue 不绑定(bind)到非常量左值引用?

c++ - 右值引用模板推导

c++ - vector 类应该有什么构造函数/赋值运算符?

c++ - 在 win32 控制台应用程序中跟踪剪贴板更改数据?