Для следующего кода проходят все, кроме последнего утверждения:
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>
не всегда возвращает a T
?
c++
static-cast
Эрик
источник
источник
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)
.Ответы:
Это жестко закодировано в определении
static_cast
:decltype
уважает категорию значения своего операнда и создает ссылку lvalue для выражений lvalue.Причина может быть в том, что сами имена функций всегда являются lvalues, и поэтому rvalue типа функции не может появляться «в дикой природе». Таким образом, приведение к этому типу, вероятно, не имеет большого смысла.
источник