Тип неконвертируемый из списка аргументов, если изобретенная переменная объявление
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 {};
Здесь static_cast
от B const
до D&&
должен использоваться оператор преобразования, но выражение приведения может обойти оператор преобразования и поэтому не является исключением. Таким образом, пропуск static_cast
даст неверный результат для is_nothrow_constructible<D&&, B const>
.