Neden "decltype (static_cast <T> (…))" her zaman "T" değil?


24

Aşağıdaki kod için, son iddia hariç tümü geçer:

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
}

Bu son iddia neden başarısız oluyor ve static_cast<T>her zaman geri dönmüyor T?


Ben eklemek T_cast i{1};alıyorum invalid initialization of non-const reference of type 'T_cast' {aka 'int (&)(int)'} from an rvalue of type '<brace-enclosed initializer list>'sebebi ne olursa olsun, yani T_castbir olduğunu int (&)(int)ziyade daha int (&&)(int).
Kevin

Yanıtlar:


21

Bu, tanımında sabit kodlanmıştır static_cast:

[expr.static.cast] (benimkini vurgulayın)

1 İfadenin static_­cast<T>(v)sonucu, ifadenin vtüre dönüştürülmesinin sonucudur T. Bir Tlvalue referans türü veya işlev türüne bir rvalue referansı ise, sonuç bir lvalue olur ; Eğer Tnesne türü için bir rvalue referans, sonuç xValue olduğu; aksi takdirde sonuç bir ön değerdir. static_­cast Operatör constness fırlatıp olmayacaktır.

decltype işleneninin değer kategorisine saygı duyar ve değer ifadeleri için bir değer referansı üretir.

Akıl yürütme, işlev adlarının kendilerinin daima değer olması nedeniyle olabilir ve bu nedenle bir işlev türünün değeri "vahşi doğada" görünemez. Bu nedenle, bu tipte döküm yapmak muhtemelen çok az mantıklıdır.


bu soru daha ayrıntılı "bir işlev türü [değil] rvalue [s]" vahşi ["] görünür"
Eric
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.