在this question中,我们了解到RVO无法应用于p.first
这样的表达式。
在评论中,还建议在r
之类的声明之后,RVO通常不会应用于auto& r = p.first
这样的表达式。标准是否规定了这种行为还不太清楚。
在具有类返回类型的函数的return语句中,当表达式是非易失性自动对象的名称时(除了函数参数或异常引入的变量之外)处理程序声明([except.handle]))具有与函数返回类型相同的类型(忽略cv-qualification),通过将自动对象直接构造到函数返回中,可以省略复制/移动操作值
在以下代码中,r
对象的名称也称为o
,只要在return
中形成表达式时允许使用RVO {1}}陈述?
int o = 42;
int& r = o;
答案 0 :(得分:18)
CWG #633解决了这样一个事实:与对象不同,引用没有实际名称。它由N2993解决,它将变量的概念扩展为包含引用,从而赋予它们名称 现在[基本] / 6读(我都强调):
变量是由非静态数据成员或对象以外的引用声明引入的。 变量的名称表示对象或引用 。
引用的名称表示该变量 - 引用 - 而不是引用所引用的对象。虽然引用通常被解释为"对象/函数的其他名称",但在标准术语中,定义是完全错误的。
即。复制省略不适用于您的示例。
由于上述论文直到2009年才被采用,并且你标记了c++03:人们可以认为该论文是对C ++ 03的回顾性修正。但是,在C ++ 03中,严格来说,引用不是实体(这是由CWG #485纠正的),因此其声明中的标识符永远不会被视为名称(参见[basic] / 4,a名称必须表示标签或实体) - 因此复制省略不再适用。