Apa pernyataan itu
return {};
di C ++ 11 menunjukkan, dan kapan menggunakannya sebagai ganti (katakanlah)
return NULL;
atau
return nullptr;
Apa pernyataan itu
return {};
di C ++ 11 menunjukkan, dan kapan menggunakannya sebagai ganti (katakanlah)
return NULL;
atau
return nullptr;
return;
tanpa nilai?return;
Di sisi lainreturn{};
valid jika Anda memiliki tipe pengembalian.Jawaban:
return {};
menunjukkan "mengembalikan objek dari jenis fungsi yang diinisialisasi dengan penginisialisasi daftar kosong ". Perilaku tepatnya bergantung pada tipe objek yang dikembalikan.Dari cppreference.com (karena OP diberi tag C ++ 11, saya mengecualikan aturan di C ++ 14 dan C ++ 17; lihat tautan untuk detail lebih lanjut):
Sebelum C ++ 11, untuk fungsi yang mengembalikan a
std::string
, Anda harus menulis:Menggunakan sintaks brace di C ++ 11, Anda tidak perlu mengulangi tipe:
return NULL
danreturn nullptr
harus digunakan ketika fungsi mengembalikan tipe penunjuk:Namun,
NULL
tidak digunakan lagi sejak C ++ 11 karena ini hanya alias ke nilai integer (0), sedangkannullptr
tipe pointer sebenarnya:sumber
Ini mungkin membingungkan:
Ini mungkin bukan:
sumber
initializer_list
konstruktor, bukankah itu akan digunakan jika konstruktor default tidak tersedia?return {}
TIDAK setara denganreturn SomeObjectWithADefaultConstructor{};
return {};
berarti itu{}
adalah penginisialisasi untuk nilai kembali . Nilai kembali diinisialisasi daftar dengan daftar kosong.Berikut adalah beberapa latar belakang pada nilai kembalian , berdasarkan [stmt.return] dalam Standar C ++:
Untuk fungsi yang mengembalikan dengan nilai (yaitu tipe yang dikembalikan bukan referensi dan bukan
void
), ada objek sementara yang disebut nilai yang dikembalikan . Objek ini dibuat olehreturn
pernyataan, dan penginisialisasinya bergantung pada apa yang ada di pernyataan return.Nilai yang dikembalikan bertahan hingga akhir ekspresi penuh dalam kode yang memanggil fungsi; jika ia memiliki tipe kelas, maka destruktornya akan berjalan kecuali ia memiliki masa pakai diperpanjang oleh pemanggil yang mengikat referensi langsung padanya.
Nilai kembali dapat diinisialisasi dengan dua cara berbeda:
return some_expression;
- nilai kembalian diinisialisasi dari salinansome_expression
return { possibly_empty_list };
- nilai kembali diinisialisasi daftar dari daftar.Dengan asumsi
T
adalah jenis kembalian fungsi, maka catatan yangreturn T{};
berbeda denganreturn {}
: di sebelumnya, sementaraT{}
dibuat, dan kemudian nilai kembalian diinisialisasi salinan dari sementara itu.Ini akan gagal untuk dikompilasi jika
T
tidak memiliki copy / move-constructor yang dapat diakses, tetapireturn {};
akan berhasil bahkan jika konstruktor tersebut tidak ada. Dengan demikian,return T{};
mungkin menunjukkan efek samping dari copy-konstruktor dll, meskipun ini adalah konteks penghapusan salinan jadi mungkin tidak.Berikut rekap singkat dari daftar-inisialisasi di C ++ 14 (N4140 [dcl.init.list] / 3), di mana penginisialisasi adalah daftar kosong:
T
merupakan agregat, maka setiap anggota diinisialisasi dari brace-or-equal-initializer jika ada, sebaliknya seolah-olah oleh{}
(jadi terapkan langkah-langkah ini secara rekursif).T
adalah tipe kelas dengan konstruktor default yang disediakan pengguna, konstruktor tersebut akan dipanggil.T
adalah tipe kelas dengan= default
konstruktor default yang didefinisikan secara implisit, atau ed default, objek tersebut diinisialisasi nol dan kemudian konstruktor default dipanggil.T
adalahstd::initializer_list
, nilai yang dikembalikan adalah daftar kosong tersebut.T
tipe non-kelas - tipe kembalian tidak bisa berupa array), nilai kembalian diinisialisasi nol.sumber
{}
, yang mungkin bernilai atau tidak.Ini semacam kependekan untuk contoh baru dari tipe kembalian metode.
sumber