Это связано с тем, как auto
выводит тип:
Из рабочего проекта CPP (N4713):
10.1.7.4.1 Тип заполнителядедукция [dcl.type.auto.deduct]
...
4. Если заполнитель является автоматическим спецификатором типа, выводимый тип T ', заменяющий T, определяется с использованием правил вывода аргументов шаблона.,
И:
17.9.2.1 Вывод аргументов шаблона из вызова функции [temp.deduct.call]
...
2. Если P не является ссылочным типом:
...
(2.3) - Если A является cv-квалифицированным типом, cv-квалификаторы верхнего уровня типа A игнорируются для вывода типа.
Если P является ссылочным типом, для вывода типа используется тип, на который ссылается P.
Так что auto в приведенном ниже выражении
auto res = Min(o1, o2);
выводит res
как Obj
, вызывая таким образом конструктор копирования при назначении.
Таким образом, изменив вышеприведенное значение следующим образом:
auto& res = Min(o1, o2);
позволит auto
выводить res
как const Obj&
.
Но если вы сделаете это, res
не может быть изменено в основном, так как это const
ссылка