Можно ли написать руководство по дедукции, чтобы экземпляр Simple можно было объявить без аргументов шаблона? Я пробовал, но не могу получить правильную форму для извлечения типа элемента std::unique_ptr.
Проблема в другом.
Неявно сгенерированные руководства по дедукции прекрасно способны извлечь правильный параметр шаблона типа для Simple
.
Как указал Rakete1111, это своего рода «самая неприятная проблема разбора».
Пишу
Simple( upSimple );
ваше намерение состояло в том, чтобы получить инициализацию безымянного временного объекта типа Simple
(Simple<MyThing>
, благодаря новым неявно сгенерированным руководствам по дедукции C++17), инициализированного объектом upSimple
.
К сожалению, компилятор (visual-c++, но то же самое с g++ и clang++) интерпретирует это как объявление новой переменной (обратите внимание, что скобки, объявляющие переменные C++, излишни, но вполне допустимы; с помощью int (i);
вы объявляете переменную i
типа int
) назовите upSimple
и введите Simple
.
Это дает ошибку, потому что
(1) upSimple
определено в предыдущей строке, поэтому у нас есть повторное объявление upSimple
(2) неявно сгенерированные руководства по выводу не могут без аргумента конструктора вывести аргумент шаблона T
для Simple
.
Чтобы избежать этой двусмысленности и получить инициализацию объекта Simple<MyThing>
, вы можете сохранить значение в переменной с помощью
auto s = Simple(upSimple);
или также с
Simple s(upSimple);
поэтому компилятор больше не может интерпретировать строку как объявление переменной upSimple
.
Если вам действительно нужен безымянный временный объект, вы можете использовать универсальную инициализацию (вы можете использовать фигурные скобки вместо скобок)
//.....V..........V
Simple { upSimple };
это нельзя интерпретировать как объявление переменной.
И, да: также может быть полезно навязывание использования нового стандарта С++ 17 (через /std:c++17
или -std=c++17
или в зависимости от того, что требуется от конкретного компилятора).
person
max66
schedule
04.10.2018
Simple s ( upSimple );
, см.: wandbox.org/permlink/V4bp2fsfk49cYMSd< /а> - person Paul Sanders   schedule 04.10.2018