【发布时间】:2011-10-31 17:18:24
【问题描述】:
前段时间有人告诉我,实现二元运算符的常用模式在返回时需要一个最终的move。
Matrix operator+(const Matrix &a, Matrix &&b) {
b += a;
return std::move(b);
}
但现在有一个特殊规则,即在 return 中,编译器可能会将返回值视为临时值,然后就没有必要这样做了——一个简单的 return b 就足够了。
但话又说回来,b 在这个函数中有一个 name,因此,它是一个 LValue——这会阻碍编译器将其视为临时变量, move 是必需的。
在最新版本的 C++0x 标准中仍然是这种情况吗? 我们需要move 来实现上述模式吗?
【问题讨论】:
-
根据this answer,
std::move不是必须的。 -
虽然参数是
Matrix&&而不是Matrix可能会有所不同... -
它是复杂的,是的。是的,我认为你是对的。如果它是一个值参数,比如
Matrix,那么你就有了一个原始副本——一个临时文件。编译器知道你可以从中获取。对于Matrix&&,我不确定那个-
标签: operator-overloading rvalue-reference c++11