Почему `decltype (static_cast (…))` не всегда `T`?

Для следующего кода первое утверждение проходит, но второе не выполняется

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?

20
задан Eric 5 October 2019 в 21:39
поделиться

1 ответ

Это трудно кодируется в определении static_cast:

[expr.static.cast] (шахта акцента)

1 результатом выражения static_­cast<T>(v) является результат преобразования выражения v к типу T. , Если T lvalue ссылочный тип или rvalue ссылка на функциональный тип, результатом является lvalue; если T rvalue ссылка на тип объекта, результатом является xvalue; иначе результатом является prvalue. static_­cast оператор не должен выбрасывать constness.

decltype отношения категория значения его операнда, и производит lvalue ссылку для lvalue выражений.

обоснование может произойти из-за самих имен функций, всегда являющихся lvalues, и таким образом, rvalue функционального типа не может появиться "в дикой природе". По сути, кастинг к тому типу, вероятно, имеет мало смысла.

20
ответ дан 29 November 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: