다음 코드의 경우 마지막 어설 션을 제외한 모든 어설 션이 전달됩니다.
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
}
왜이 마지막 주장은 실패하고, static_cast<T>
항상을 반환하지 T
?
T_cast i{1};
내가 할invalid initialization of non-const reference of type 'T_cast' {aka 'int (&)(int)'} from an rvalue of type '<brace-enclosed initializer list>'
어떤 이유 때문에,T_cast
A는int (&)(int)
오히려 이상을int (&&)(int)
.