Untuk kode berikut, semua kecuali pernyataan terakhir berlalu:
template<typename T>
constexpr void assert_static_cast_identity() {
using T_cast = decltype(static_cast<T>(std::declval<T>()));
static_assert(std::is_same_v<T_cast, T>);
}
int main() {
assert_static_cast_identity<int>();
assert_static_cast_identity<int&>();
assert_static_cast_identity<int&&>();
// assert_static_cast_identity<int(int)>(); // illegal cast
assert_static_cast_identity<int (&)(int)>();
assert_static_cast_identity<int (&&)(int)>(); // static assert fails
}
Mengapa pernyataan terakhir ini gagal, dan static_cast<T>
tidak selalu mengembalikan a T
?
c++
static-cast
Eric
sumber
sumber
T_cast i{1};
saya dapatkaninvalid initialization of non-const reference of type 'T_cast' {aka 'int (&)(int)'} from an rvalue of type '<brace-enclosed initializer list>'
, jadi untuk alasan apa punT_cast
adalahint (&)(int)
bukanint (&&)(int)
.Jawaban:
Ini sulit dikodekan dalam definisi
static_cast
:decltype
menghormati kategori nilai operannya, dan menghasilkan referensi nilai lv untuk ekspresi nilai l.Alasannya mungkin karena nama fungsi itu sendiri selalu menjadi nilai, dan nilai dari jenis fungsi tidak dapat muncul "di alam liar". Karena itu, casting ke tipe itu mungkin tidak masuk akal.
sumber