警告 C26820

这可能是一个昂贵的复制操作。 请考虑使用引用,除非需要副本(p.9)

有关详细信息,请参阅 C++ Core Guidelines 中的P.9:不要浪费时间或空间

此检查涵盖了在将引用分配给标记为 auto 的变量时不明显且容易遗漏的行为。 auto 变量的类型被解析为值而不是引用,并进行隐式复制。

注解

  • 对于标量、智能指针或视图,不会引发此警告。 对于大小不超过平台相关指针大小两倍的类型,也不引发此警告。

  • 当变量发生突变时,不会引发此警告,因为将其标记为 auto& 会对突变产生副作用。

  • 当引用来自临时对象时,不会引发此警告,因为这会导致一个悬空引用。 例如:

    std::optional<int> TryGetNumber();
    ...
    const auto& val = TryGetNumber().value();
    val++; // Temporary from TryGetNumber() is destroyed and val is now dangling
    

示例

此示例显示了一个变量定义,当分配一个引用时,该变量定义可能会产生一个昂贵的副本:

const Object& MyClass::getRef() { ... }
...
auto ref = myclass.getRef(); // C26820 (`ref` takes a copy of the returned object)

要解决此问题,请改为使用 const auto& 声明该变量:

const Object& MyClass::getRef() { ... }
...
const auto& ref = myclass.getRef(); // OK