Чому static_cast потрібен при впровадженні gcc в програмі is_nothrow_constructible?


11

type_traitsЧому випливає з реалізації GCC, навіщо це static_castпотрібно тут?

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>()))> {};

Ця суперечливість здається дивною
гонки легкості на орбіті

4
Вам слід задати подібні запитання у відповідному списку розсилки libstdc ++
Гонки легкості в Орбіті

Відповіді:


12

Тип не може бути сконструйований зі списку аргументів, якщо винайдена декларація змінної

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

було б добре сформовано і, як відомо, не кидає винятків . У випадку аргументу множини це еквівалентно (по модулю без винищення руйнування, див. LWG 2116 ) добре сформованій форми і не врізання виразу перетворення типу

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

Однак у випадку одного аргументу вираз T(declval<Args>())трактується як вираз лита , який може викликати const_castіreinterpret_cast ; явне використання static_castвідновлює еквівалентність форми декларації.

В якості конкретного прикладу розглянемо типи:

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

Тут a static_castз B constto D&&повинен використовувати оператор перетворення, але виразний вираз може обійти оператор перетворення, і тому не є винятком. Тож пропущення цього static_castдало б неправильний результат is_nothrow_constructible<D&&, B const>.


Тож static_castпотрібне, щоб вираз завжди трактувався як direct initializationзамість як cast expression?
Жоао Пірес

1
@ JoãoPires так, це правильно. Це все ще не зовсім те, що вимагає стандарт, тому що неможливо перевірити noexcept декларації за допомогою noexceptоператора, але це набагато ближче.
екатмур

Дякую за допомогу! : D
Жоао Пірес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.