就个人而言,我不同意将const
返回值独立于移动语义的建议:该值已经是一个右值,因此意外修改它的危险不大。这就是为什么const
在非内置类型上放置 a 的部分原因:它们可能包含某种值的后门。例如,std::vector<T>
有一个swap()
方法可以用来“窃取”非常量右值的内容:
std::vector<int> f();
std::vector<int> value;
f().swap(value);
同样,流有一些成员运算符,允许您将它们与某些内置函数一起使用,这些函数可以有效地从流中提取引用,例如:
std::string word;
std::istringstream("hello, world") >> std::skipws >> word;
没有std::skipws
流是一个右值,它不能绑定到的第一个参数,std::operator>> (std::istream&, std::string&)
但使用操作符的成员运算符会返回对流的非常量引用。
const
on 内置类型实际上根本没有效果。特别是,当将函数的结果传递给函数模板(在 C++2003 中)时,它无法区分传递的返回值const
还是非返回值。const
因此,它可能看起来好像const
对内置返回有影响,但实际上并没有。
正如我所说,我不同意该规则,并且在 C++2011 中它绝对不成立,因为您希望能够移出无论如何都会被const
返回阻止的非内置。