Saya sedang mengerjakan proyek dengan C ++ 11 dan saya mencoba kode berikut
#include <atomic>
struct A {
std::atomic_int idx = 1;
};
int main() {
return 0;
}
Saya mendapatkan kesalahan kompilator
error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
std::atomic_int idx = 1;
^
Hasil yang sama adalah dengan C ++ 14. Ketika saya beralih ke C ++ 17 berfungsi: wandbox
Saya memeriksa perbedaan preferensi:
Tetapi tidak ada perbedaan yang didokumentasikan antara C ++ 14 dan C ++ 17. Mengapa ini bekerja dengan C ++ 17 dan tidak dengan C ++ 14?
main
(atau fungsi apa pun, tidak perlu menjadimain
), bukan konstruktor struct. Dentang memberikan pesan kesalahan yang sama, menjadi lebih eksplisit bahwa itu mencoba menggunakan konstruktor salinan dihapus daripada inisialisasi atau konstruktor polos: godbolt.org/z/SBGf9w dengan libc ++Jawaban:
Karena di C ++ 17 ada RVO yang dijamin. Dalam C ++ 14 pernyataan suka
Foo x = Foo(args)
danFoo x (args)
secara teknis tidak sama, tetapi dalam C ++ 17.Anda dapat membaca lebih lanjut tentang ini di sini: https://en.cppreference.com/w/cpp/language/copy_elision
Khususnya bagian
(since C++17)
:Untuk membuat kode C ++ 14 berfungsi, Anda dapat menggunakan
sumber