Diambil dari implementasi GCC type_traits
mengapa static_cast
diperlukan di sini?
template <typename _Tp, typename... _Args>
struct __is_nt_constructible_impl
: public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {};
template <typename _Tp, typename _Arg>
struct __is_nt_constructible_impl<_Tp, _Arg>
: public integral_constant<bool,
// Why is `static_cast` needed here?
noexcept(static_cast<_Tp>(declval<_Arg>()))> {};
c++
typetraits
libstdc++
static-cast
João Pires
sumber
sumber
Jawaban:
Suatu tipe bukan merupakan konstruksi dari daftar argumen jika deklarasi variabel yang ditemukan
akan terbentuk dengan baik dan diketahui tidak melemparkan pengecualian . Dalam kasus argumen jamak, ini setara (modulo noexcept destructibility, lihat LWG 2116 ) untuk pembentukan yang baik dan bukan dari ekspresi konversi tipe
Namun dalam kasus argumen tunggal ekspresi
T(declval<Args>())
diperlakukan sebagai cast-expression , yang dapat memanggilconst_cast
danreinterpret_cast
; penggunaan eksplisitstatic_cast
mengembalikan kesetaraan ke bentuk deklarasi.Sebagai contoh nyata , pertimbangkan jenis-jenisnya:
Di sini,
static_cast
dariB const
ke keD&&
harus menggunakan operator konversi, tetapi ekspresi pemain dapat memintas operator konversi dan begitu pula kecuali. Jadi mengabaikanstatic_cast
akan memberikan hasil yang salahis_nothrow_constructible<D&&, B const>
.sumber
static_cast
itu diperlukan agar ungkapan itu selalu diperlakukan sebagaidirect initialization
bukan sebagaicast expression
?noexcept
operator, tetapi jauh lebih dekat.