Uyarı C26820

Bu, pahalı olabilecek bir kopyalama işlemidir. Bir kopya gerekmediği sürece başvuru kullanmayı göz önünde bulundurun (s.9)

Daha fazla bilgi için bkz . P.9: C++ Çekirdek Yönergeleri'nde zaman veya alan harcama.

Bu denetim, işaretli autobir değişkene başvuru atarken istenmeyen ve kaçırılması kolay davranışları kapsar. Değişkenin auto türü başvuru yerine bir değere çözümlenir ve örtük bir kopya oluşturulur.

Açıklamalar

  • Bu uyarı skalerler, akıllı işaretçiler veya görünümler için tetiklenmez. Ayrıca, boyutu platforma bağımlı işaretçi boyutunun iki katından fazla olmayan türler için de tetiklenmez.

  • Bu uyarı değişken mutasyona uğradığında tetiklenmemiştir, çünkü işaretlenmesi auto& mutasyona yan etkiler doğurur.

  • Bu uyarı, başvuru geçici bir nesneden geldiğinde tetiklenmemiştir, çünkü bu da sarkan bir başvuruyla sonuçlanmıştır. Örneğin:

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

Örnek

Bu örnek, bir başvuru atandığında pahalı olabilecek bir kopya oluşturan değişken tanımını gösterir:

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

Bu sorunu çözmek için değişkeni bildirmek için şunu kullanın const auto& :

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