gpt4 book ai didi

c++ - 即使 XZY 具有非复制约束,构造助手 make_XYZ 也允许 RVO 和类型推导

转载 作者:IT老高 更新时间:2023-10-28 21:43:14 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com