UPDATE1: C++17 为构造函数添加了类型推导——这并不意味着 free 函数是一个劣质的解决方案。
UPDATE2: C++17 增加了保证复制省略(复制在概念上甚至不发生)。因此,使用 C++17,我的代码实际上可以工作并且具有最佳性能。但是我相信 Martinho 的代码使用大括号初始化返回值仍然是更干净的解决方案。但是请查看Barry 的这个答案和 TC 的评论
旧帖子:类型推导不适用于构造函数(至少在 C++11 之前并包括在内)。常见的解决方案是依靠 RVO(返回值优化),编写一个 make_XYZ 模板函数,将其参数转发给构造函数。一个例子是std::make_tuple
。
任何模板 acrobat 知道在 nocopy 策略妨碍时使这项工作正常工作的解决方法吗?一个有效的解决方案必须仍然允许 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;
}