ОБНОВЛЕНИЕ 1. В C ++ 17 добавлен вывод типов для конструкторов, что не означает, что бесплатная функция является второстепенным решением.
ОБНОВЛЕНИЕ 2: C ++ 17 добавил гарантированное исключение копии (копирование даже не происходит концептуально). Итак, с C ++ 17 мой код действительно работает и с оптимальной производительностью. Но код Мартиньо, использующий инициализацию скобок для возвращаемого значения, по-прежнему является более чистым решением, я считаю. Но ознакомьтесь с этим ответом Барри и комментарием T.C.
СТАРЫЙ ЗАПИСЬ: определение типа не работает для конструкторов (по крайней мере, до C ++ 11 включительно). Распространенное решение - полагаться на RVO (оптимизация возвращаемого значения) и писать шаблонную функцию make_XYZ, которая пересылает свои параметры конструктору. Пример - std::make_tuple
.
Любой шаблонный акробат, который знает обходной путь, чтобы заставить эту работу работать, когда политика запрета на копирование мешает? Действительное решение должно по-прежнему позволять RVO происходить.
Кроме того, исчезнет ли требование make_XYZ в C ++ 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;
}
auto const&
на сайте вызова. - person John Zwinck   schedule 17.10.2013const
не позволяет использовать refs для возвращенных локальных жителей. - person Lightness Races in Orbit   schedule 17.10.2013auto const &
явно неоптимально, а constref у меня даже не работает. Однако почему здесь нельзя применять этот ответ? Кажется, я все еще чего-то упускаю (что-то, что мне было ясно, когда я знал меньше). - person Patrick Fromberg   schedule 17.10.2013T f(); T const& r = f();
это работает, потому чтоf()
создает временное, привязано кr
и продлевает время жизни. Но дляT const& f(); T const& r = f();
это не так, потому чтоf()
дает ссылку, а не временную ссылку. - person R. Martinho Fernandes   schedule 17.10.2013