【发布时间】:2018-07-04 05:07:49
【问题描述】:
MWE:
struct A {
A() {std::cout << "constructor" << std::endl; }
A(const A& a) {std::cout << "copy constructor" << std::endl; }
A(A&& a) {std::cout << "move constructor" << std::endl; }
};
int main() {
A a1{};
A a2{ a1 };
A a3{ A{} };
A a4{ std::move(a3) };
return 0;
}
输出:
constructor
copy constructor
constructor
move constructor
fora2 使用了复制省略,这是对编译器的优化,一切似乎都很好。但是,当我注释掉移动构造函数时,会调用复制构造函数来代替移动构造函数。如何将右值转换为 const 左值引用?
输出:
constructor
copy constructor
constructor
copy constructor
程序编译在VS2017。
【问题讨论】:
-
“如何将右值转换为 const 左值引用?” 很容易。无时无刻不在发生。为什么你认为这会是个问题?好吧,“转换”可能是一个错误的术语:一个 const 左值引用可以绑定到一个临时对象。
-
@IgorTandetnik,是的,你是对的。这一切都是由于
const而发生的,以前不知道这一点。正如您在答案中提到的那样,也许您可以详细说明bounding。它是如何工作的? -
“如何将右值转换为 const 左值引用?” 这不是通过复制优化的基础吗?
-
@Jean-BaptisteYunès 什么是“逐个复制优化”?
-
@curiousguy 将
f(T v)替换为f(const T &v)以消除每次调用时的副本。
标签: c++11 copy-constructor move-semantics move-constructor copy-elision