`decltype (static_cast <T> (…))`이 항상`T`가 아닌 이유는 무엇입니까?


24

다음 코드의 경우 마지막 어설 션을 제외한 모든 어설 션이 전달됩니다.

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_castA는 int (&)(int)오히려 이상을 int (&&)(int).
Kevin

답변:


21

이것은 다음의 정의에 하드 코딩되어 있습니다 static_cast.

[expr.static.cast] (강조 광산)

1 표현식 static_­cast<T>(v)의 결과는 표현식 v을 유형 으로 변환 한 결과입니다 T. 경우 T좌변 참조 형 또는 함수 타입에 r- 수치 참조는, 결과는 좌변이다 ; 만약 T객체 유형에 r- 수치 참조는, 결과가 xValue는이고; 그렇지 않으면 결과는 prvalue입니다. static_­cast 연산자는 const와 멀리 던져 않습니다.

decltype 피연산자의 값 범주를 존중하고 lvalue 표현식에 대한 lvalue 참조를 생성합니다.

그 이유는 함수 이름 자체가 항상 lvalue이기 때문에 함수 유형의 rvalue가 "와일드하게"나타날 수는 없습니다. 따라서 해당 유형으로 캐스트하는 것은 거의 의미가 없습니다.


이 질문"실제로 나타나는 함수 유형의 rvalue [s]"
Eric
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.