LINUX.ORG.RU

История изменений

Исправление 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