警告 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