Может ли тип шаблона по умолчанию быть универсальной ссылкой?

В следующем && универсальная ссылка?

template <class Function = std::greater<int> > void f(Function&& f = Function());

3

Решение

Семестр universal reference это выдуманный Скоттом Мейерсом термин, делающий различие между обычными ссылочными значениями, т. е. int&& и rvalue ссылки в коде шаблона, т.е. T&&, Это важно из-за правил свертывания ссылок, которые вступают в игру с кодом шаблона, поэтому этот термин используется для помощи в обучении. Причина это называется unversal reference потому что это может связывать с чем угодно.

Просто имейте в виду, что нет такой вещи как universal reference на языке C ++, Function&& это Rvalue ссылка что касается языка. Тем не менее, да, в терминологии Скотта Мейера, Function&& это universal reference в вашем примере.

7

Другие решения

является && универсальная ссылка?

Вроде, как бы, что-то вроде. Как пасхальный кролик и Санта-Клаус, на самом деле не существует такой вещи, как универсальная ссылка (извините, если я испортил это для вас). Семестр универсальная ссылка не отображается в стандарте. Это термин, придуманный Скоттом Мейерсом, для описания шаблонных ссылок на значения, когда активны «специальные правила вывода».

Что вы показываете является действительный код И в этом случае применяются специальные правила удержания. То есть, когда вы передаете аргумент lvalue A в f, Function выведет к A&, Так что по определению Скотта, да, Function это «универсальная ссылка».

3

Похоже на то, std::forward<Function> правильно передает тип аргумента при вызове в вашей функции.

1
По вопросам рекламы [email protected]