- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
UPDATE1: C++17 为构造函数添加了类型推导 - 这并不意味着自由函数是一个劣质的解决方案。
UPDATE2: C++17 增加了保证复制省略(复制在概念上甚至不会发生)。因此,使用 C++17,我的代码实际上可以工作并且具有最佳性能。但是我相信 Martinho 的代码使用大括号初始化返回值仍然是更干净的解决方案。但结帐this answer from Barry以及 T.C. 的评论
OLD POST:类型推导不适用于构造函数(至少在 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;
}
最佳答案
如果有非显式构造函数,确实可以按值返回不可复制和不可移动的类型。查看实时示例:http://coliru.stacked-crooked.com/a/89ef9d3115924558 .
template <typename T>
XYZ<T> make_XYZ (T && i)
{
return { std::forward<T>(i) };
}
这里的棘手之处在于 { ... }
没有构造一个临时值并将其移动到返回值。 直接初始化返回值。没有复制也没有移动,这与是否应用任何优化无关(如果需要优化才能工作,它将无法编译)。
但是,由于该类型不可复制或移动,您将无法按值将其存储在局部变量中。但是,您可以使用旧的临时生命周期延长技巧来持有它:
auto&& x = make_XYZ(1);
关于c++ - 即使 XZY 具有非复制约束,构造助手 make_XYZ 也允许 RVO 和类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19427196/
UPDATE1: C++17 为构造函数添加了类型推导 - 这并不意味着自由函数是一个劣质的解决方案。 UPDATE2: C++17 增加了保证复制省略(复制在概念上甚至不会发生)。因此,使用 C++
我是一名优秀的程序员,十分优秀!