☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

函数返回值不应为右值引用

8.29 ID_returnRValueReference
目录 › next › previous

函数返回右值引用的实际价值有限,且易产生错误。

示例:

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) 两种事务合在一个函数中,在某种程度上违反了“单一职责原则”。

相关

ID_localAddressFlowOut

参考

C++ Core Guidelines F.45
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.