为什么不将RVALUE引用定义为RVALUE表达
Why not define rvalue reference to be rvalue expression?
让我们考虑以下代码:
class X {
std::vector<int> _v;
public:
X(std::vector<int>&& v): _v(std::move(v)) {}
};
编译器仅针对可以移动的对象调用此构造函数。那么,为什么不将rvalue引用定义为rvalue表达式,也不要每次写下std ::移动呢?
CTOR成员初始化列表看起来像:
_v(v)
,但这仍然是一个动作,而不是副本。
虽然在这种常见情况下需要std::move
有些不幸,但人们认为在某些情况下导致运行时错误的隐性移动会更有害处。
例如:
class Y
{
public:
Y(const std::vector<int>& v);
};
class X {
std::vector<int> v_;
Y y_;
public:
X(std::vector<int>&& v): v_(v), y_(v) {}
};
在此修改后的示例中,X
的构造函数两次使用v
。如果v
的首次使用隐式移动,那么v
的第二次使用很可能不会获得预期值。
因此,为了避免偶然的"移动后使用",如果它具有名称,则可以多次使用,因此将其视为lvalue。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- '||'之前的预期主要表达
- 使用C++模板时表达约束
- 这个表达是什么意思?
- Boost.Spirit将表达转换为AST
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 为什么我不能表达 10 次方 10
- C++表达SFINAE和ostream操纵器
- C++20理念:要求表达和完美转发
- 表达没有enable_if的SFINAE?
- 比使用 s.str().c_str() 更好的表达?
- 我想表达 2by2 矩阵的乘积
- 如何在linux平台上表达openGL glDebugOutput / glDebugMessageCallback
- 高于给定值的最小可表达值
- c++17倍表达点积简化
- 为什么评估一个表达可能会产生副作用
- "__typeof__"之前的预期主要表达
- 在 C++14 中,这种 C++17 倍表达的好选择是什么?
- 为什么不将RVALUE引用定义为RVALUE表达
- 该表达是lvalue还是rvalue