Несколько определений зависят от declval
, дающего разумные результаты для cv-квалифицированного void
. Примером является is_assignable
:
template <class T, class U>
struct is_assignable;
Выражение declval<T>() = declval<U>()
хорошо сформировано при обработке
как неоцененный операнд ...
Намерение состоит в том, что "правильно сформированный" относится к правильно сформированному выражению присваивания, а не к тому, является ли сам declval<T>
правильно сформированным. То есть мы хотим беспокоиться только об одной вещи за один раз.