#include <optional>
bool f() {
std::optional<int> opt;
return opt;
}
Tidak mengkompilasi: 'return': cannot convert from 'std::optional<int>' to 'bool'
Referensi konsultasi Saya akan berpikir untuk menemukan penjelasan, tetapi saya membacanya sebagaimana mestinya ok.
Konversi tersirat dilakukan setiap kali ekspresi dari beberapa tipe T1 digunakan dalam konteks yang tidak menerima tipe itu, tetapi menerima beberapa tipe T2 lainnya; khususnya:
- ketika ekspresi digunakan sebagai argumen saat memanggil fungsi yang dideklarasikan dengan T2 sebagai parameter;
- ketika ekspresi digunakan sebagai operan dengan operator yang mengharapkan T2;
- saat menginisialisasi objek baru tipe T2, termasuk pernyataan pengembalian dalam fungsi mengembalikan T2;
- ketika ekspresi digunakan dalam pernyataan switch (T2 adalah tipe integral);
- ketika ekspresi digunakan dalam pernyataan if atau loop (T2 bool).
operator bool()
daristd::optional
adalahexplicit
.Jawaban:
std::optional
tidak memiliki fasilitas untuk melakukan konversi secara implisitbool
. (Mengizinkan konversi implisit kebool
umumnya dianggap sebagai ide yang buruk, karenabool
merupakan tipe integral sehingga sesuatu sepertiint i = opt
akan mengkompilasi dan melakukan hal yang sepenuhnya salah.)std::optional
tidak memiliki "konversi kontekstual" untuk bool, definisi yang terlihat mirip dengan operator cor:explicit operator bool()
. Ini tidak dapat digunakan untuk konversi tersirat; itu hanya berlaku dalam situasi spesifik tertentu di mana "konteks" yang diharapkan adalah yang boolean, seperti kondisi pernyataan-if.Yang Anda inginkan adalah
opt.has_value()
.sumber
Dari dokumen C ++ :
Baca tentang konversi kontekstual di sini :
Anda dapat melakukan retasan berikut:
karena konversi kontekstual terjadi dalam kasus operator logis bawaan, tetapi konversi kontekstual tidak menyertakan
return
pernyataan danstd::optional
dengan sendirinya tidak memiliki konversi implisit kebool
.Karena itu, yang terbaik adalah menggunakan
std::optional<T>::has_value
:sumber
return {opt}
? ataureturn bool{opt};
return {opt};
tidak akan berfungsi tetapireturn static_cast<bool>(opt);
ataureturn bool{opt};
akan bekerja. Namun, disarankan untuk menggunakanhas_value
fungsi anggota karena itu benar-benar menunjukkan niat yang jelas tentang apa yang ingin Anda lakukanreturn !!pot;
hack terkenal (has_value
lebih baik)Itu karena penutup implisit std :: opsional untuk bool tidak didukung: https://en.cppreference.com/w/cpp/utility/optional/operator_bool
Anda harus secara eksplisit mengkonversi ke bool sebagai
bool(opt)
atau hanya menggunakanopt.has_value()
saja.sumber
Ini bukan tentang konversi implisit, ini tentang jenis inisialisasi.
Apa yang opsional miliki adalah fungsi konversi eksplisit, yaitu
Dari N4849 [class.conv.fct] / p2
Di atas berarti bahwa kasus-kasus ini akan menggunakan fungsi konversi: [dcl.init] / p16
Namun, case-case ini tidak akan menggunakan fungsi konversi: [dcl.init] / p15
Contoh dalam pertanyaan termasuk dalam kasus inisialisasi salinan dan tidak menggunakan fungsi konversi opsional.
sumber