我有一个代码,必须处理rvalued stl容器。 我的问题是:为什么成员函数从rvalued-stl-container返回一个元素,如:
vector<int>{1}.front()
返回左值而不是右值? Standard指定rvalue对象的成员是rvalue。我知道我可以使用std::move
显式移动返回的元素。但是当返回值显然为rvalue时,具有左值返回类型的逻辑是什么?
如果你使用这样的表达式作为一些有价值重载函数的参数,将选择错误的重载,并且调用函数将获得左值引用(很快就会变成悬空)。
答案 0 :(得分:1)
对于出站价值,添加outplace_front()
和outplace_back()
可能会更好地为入境价值emplace_front()
和emplace_back()
提供更好的名称。
答案 1 :(得分:1)
一旦编译器决定调用特定的成员函数(例如int &std::vector<int>::front()
),类型系统只知道返回int &
,所以它必须将其视为左值,即使它寿命仅限于所有者的临时寿命。
在C ++ 11之前,成员函数不可能根据被调用对象的值类别(参见What is "rvalue reference for *this"?)进行重载,仅对对象的cv-qualification进行重载;并且非const临时显然不是const
所以非const
重载必须可用。
除了您已经确定的潜在悬空左值引用之外,这在C ++ 03中导致了operator<<
可以使用ostream
调用临时char
的情况(成员函数运算符)但不是string
(自由运算符); C ++ 11使用rvalue引用的自由运算符重载和成员函数的rvalue *this
重载来修复此问题。
Rvalue *this
允许front
的三次重载:
T &front() & { return data_[0]; }
const T &front() const & { return data_[0]; }
T &&front() && { return std::move(data_[0]); }
rvalue重载的不同函数体有点疣;这是因为ref-qualifier对成员函数体内的*this
访问成员没有影响。