Исправление fsb4000, (текущая версия) :
именно за счет этого оно и работает? А насколько нужен declvar ?
Да. Именно из-за наинизшего приоритета это и работает.
declvar
нужен чтобы в контексте decltype
появилась переменная типа T. Если есть ещё условия, например, тип T обязан также иметь конструктор по-умолчанию, то можно declvar
заменить на T{}
(поэтому чтобы ввести переменную типа double, я просто написал 1.0, а не через declvar<double>()
), но тогда для типа T, который имеет оператор * с double
но не имеет конструктора по-умолчанию вернётся false
.
я не понимаю зачем вводить U (почему нельзя везде просто написать T), но без него не работает;-(
Если у нас будет только один тип T, то тип typename enable_if<has_double_multiply<U>(nullptr), int>::type
будет использован во время инстанциирования A. enable_if
работает только когда тип выводится компилятором. https://en.cppreference.com/w/cpp/language/template_argument_deduction
Исходная версия fsb4000, :
именно за счет этого оно и работает? А насколько нужен declvar ?
Да. Именно из-за наинизшего приоритета это и работает.
declvar
нужен чтобы в контексте decltype
появилась переменная типа T. Если есть ещё условия, например, тип T обязан также иметь конструктор по-умолчанию, то можно declvar
заменить на T{}
, но тогда для типа T, который имеет оператор * с double
но не имеет конструктора по-умолчанию вернётся false
.
я не понимаю зачем вводить U (почему нельзя везде просто написать T), но без него не работает;-(
Если у нас будет только один тип T, то тип typename enable_if<has_double_multiply<U>(nullptr), int>::type
будет использован во время инстанциирования A. enable_if
работает только когда тип выводится компилятором. https://en.cppreference.com/w/cpp/language/template_argument_deduction