12.8 复制和移动类对象 [class.copy] §31 和 §32 说:
在具有类返回类型的函数的 return 语句中,当表达式是具有与函数返回类型相同的 cv 非限定类型的非易失性自动对象(函数或 catch 子句参数除外)的名称时,通过将自动对象直接构造到函数的返回值中,可以省略复制/移动操作
当满足或将满足复制操作的省略标准时,除了源对象是函数参数的事实,并且要复制的对象由左值指定时,选择复制构造函数的重载决策是首先执行好像对象是由右值指定的。
因此我们可以写:
unique_ptr<int> make_answer()
{
unique_ptr<int> result(new int(42));
return result; // lvalue is implicitly treated as rvalue
}
但是,我注意到 g++ 4.6.3 也接受不是名称的左值,例如:
return (result);
return *&result;
return true ? result : result;
相比之下,return rand() ? result : result;
行不通。编译器的优化器是否干扰了语言语义?正如我解释的标准,return (result);
不应该编译,因为(result)
不是一个名字,而是一个带括号的表达式。我是对还是错?