【发布时间】:2019-10-05 21:39:34
【问题描述】:
对于以下代码,除了最后一个断言之外的所有代码都通过了:
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是int (&)(int)而不是int (&&)(int)。
标签: c++ static-cast