Gcc'nin is_nothrow_constructible uygulamasında neden static_cast gereklidir?


11

GCC uygulamasından alınan type_traitsneden static_castburada gereklidir?

template <typename _Tp, typename... _Args>
struct __is_nt_constructible_impl
    : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {};

template <typename _Tp, typename _Arg>
struct __is_nt_constructible_impl<_Tp, _Arg>
    : public integral_constant<bool,
                               // Why is `static_cast` needed here?
                               noexcept(static_cast<_Tp>(declval<_Arg>()))> {};

Tutarsızlık tuhaf görünüyor
Yörüngede Hafiflik Yarışları

4
İlgili libstdc ++ posta listesindeki bu soruları sormalısınız
Orbit'teki Lightness Races

Yanıtlar:


12

Bir icat, değişken değişken bildirimi icat edildiğinde argüman listesinden oluşturulamaz

T t(declval<Args>()...);

olacağını iyi biçimli ve istisnalar atmak değil bilinen . Çoğul argüman durumunda bu, tip dönüşüm ifadesinin iyi oluşmuşluğuna ve çürümesine eşittir (modulo noex destructibility, bkz. LWG 2116 ).

T(declval<Args>()...)

Bununla birlikte tek bir bağımsız değişken halinde sentezleme T(declval<Args>())bir şekilde işlenir döküm ifade çağırabilir, const_castvereinterpret_cast ; açık kullanımı static_castbeyan formuna eşdeğerliği geri yükler.

Bir itibariyle somut örnekte , türlerini göz önünde bulundurun:

struct D;
struct B { operator D&&() const; };
struct D : B {};

Burada static_castgelen B constiçin D&&dönüştürme işleci, dönüştürme operatör baypas bir döküm sentezleme kutu kullanmalıdır ve bu noexcept olup. Yani ihmal etmek static_castyanlış sonuç verirdi is_nothrow_constructible<D&&, B const>.


Yani static_castifade her zaman as direct initializationyerine cast expression?
João Pires

1
@ JoãoPires evet, bu doğru. Hala standart için gerekli olan şey değildir, çünkü noexceptoperatörü kullanarak bir beyanın yapılmasını test etmek mümkün değildir , ancak çok daha yakındır.
ecatmur

yardım için teşekkürler! : D
João Pires
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.