为什么来自rvalued-stl-container的元素获取者返回左值?

时间:2013-02-01 09:42:04

标签: c++ c++11 std rvalue

我有一个代码,必须处理rvalued stl容器。 我的问题是:为什么成员函数从rvalued-stl-container返回一个元素,如:

vector<int>{1}.front()

返回左值而不是右值? Standard指定rvalue对象的成员是rvalue。我知道我可以使用std::move显式移动返回的元素。但是当返回值显然为rvalue时,具有左值返回类型的逻辑是什么?

如果你使用这样的表达式作为一些有价值重载函数的参数,将选择错误的重载,并且调用函数将获得左值引用(很快就会变成悬空)。

2 个答案:

答案 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访问成员没有影响。