История изменений
Исправление 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