Bagikan melalui


Peringatan C26820

Ini adalah operasi penyalinan yang berpotensi mahal. Pertimbangkan untuk menggunakan referensi kecuali salinan diperlukan (p.9)

Untuk informasi selengkapnya, lihat P.9: Jangan buang waktu atau ruang dalam Panduan Inti C++.

Pemeriksaan ini mencakup perilaku yang tidak berbahaya dan mudah dilewatkan saat menetapkan referensi ke variabel yang ditandai auto. Jenis auto variabel diselesaikan ke nilai daripada referensi, dan salinan implisit dibuat.

Keterangan

  • Peringatan ini tidak dimunculkan untuk skalar, penunjuk cerdas, atau tampilan. Ini juga tidak dinaikkan untuk jenis yang ukurannya tidak lebih dari dua kali ukuran pointer yang bergantung pada platform.

  • Peringatan ini tidak dimunculkan ketika variabel dimutasi, karena menandainya auto& akan memperkenalkan efek samping pada mutasi.

  • Peringatan ini tidak dimunculkan ketika referensi berasal dari objek sementara, karena itu menghasilkan referensi yang menjuntai. Contohnya:

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

Contoh

Sampel ini menunjukkan definisi variabel yang membuat salinan yang berpotensi mahal saat diberi referensi:

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

Untuk mengatasi masalah ini, deklarasikan variabel dengan menggunakan const auto& sebagai gantinya:

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