UPDATE1: С++ 17 добавлен вывод типа для конструкторов, что не означает, что свободная функция является более низким решением.
UPDATE2: С++ 17 добавлен гарантированный экземпляр копии (копия даже не выполняется концептуально). Так что с С++ 17 мой код действительно работает и с оптимальной производительностью. Но код Martinho, использующий инициализацию скобки для возвращаемого значения, по-прежнему является более чистым решением, которое я считаю. Но проверьте этот ответ от Барри и комментарий от T.C.
OLD POST: Вывод типа не работает для конструкторов (по крайней мере до и включая С++ 11). Общим решением является полагаться на RVO (Оптимизация возвращаемого значения) и писать функцию шаблона make_XYZ, которая пересылает свои параметры в конструктор. Пример: std::make_tuple
.
Любой шаблон acrobat, который знает обходное решение, чтобы сделать эту работу, когда политика nocopy мешает? Допустимое решение должно по-прежнему допускать RVO.
Кроме того, исчезнет ли необходимость в make_XYZ с С++ 14?
#include <iostream>
template <typename T>
struct XYZ
{
// remove following two lines to make the code compile
XYZ (XYZ const & rhs) = delete;
XYZ (XYZ && rhs) = delete;
T i;
XYZ (T i):i(i)
{
}
};
template <typename T>
XYZ<T> make_XYZ (T && i)
{
return XYZ<T>(std::forward<T>(i));
}
int main ()
{
auto x = make_XYZ(1);
std::cout << x.i << std::endl;
}