函数返回值不应为右值引用
8.29 ID_returnRValueReference
函数返回右值引用的实际价值有限,且易产生错误。
示例:
class A { .... };
A&& foo() { // Non-compliant
return A();
}
void bar() {
A&& a = foo();
access(a); // Undefined behavior, ‘a’ refers to an invalid object
}
例中 foo 函数返回临时对象的右值引用,临时对象在返回前析构,返回的是无效引用。
也不应返回局部对象的右值引用,如:
A&& baz() { // Non-compliant
A a;
....
return std::move(a);
}
和返回临时对象一样,对象 a 在函数返回前析构,返回的也是无效引用。
应直接返回对象,而不是对象的右值引用:
A foo() { // Compliant
return A();
}
A baz() { // Compliant
A a;
....
return a;
}
对于函数引用的参数,或函数作用域之外的对象,如果通过 move 返回右值引用,如:
A&& baz(A& a) { // Non-compliant
access(a);
return std::move(a);
}
这种情况在运行机制上可能没有问题,但满足的实际需求较为有限,而且相当于将 access(a) 和 move(a) 两种事务合在一个函数中,在某种程度上违反了“单一职责原则”。