gpt4 book ai didi

c++ - 返回转发引用参数 - 最佳实践

转载 作者:可可西里 更新时间:2023-11-01 15:21:25 29 4
gpt4 key购买 nike

在下面的场景中

template <class T>
? f(T&& a, T&& b)
{
return a > b ? a : b;
}

最佳返回类型是什么?到目前为止,我的想法是:

  1. 通过 r 值 refs 返回,完美转发函数参数:

    template <class T>
    decltype(auto) f(T&& a, T&& b)
    {
    return a > b ? forward<T>(a) : forward<T>(b);
    }
  2. move 构造返回值:

    template <class T>
    auto f(T&& a, T&& b)
    {
    return a > b ? forward<T>(a) : forward<T>(b);
    }
  3. 尝试找到启用 (N)RVO 的方法(尽管我认为因为我想使用不可能的函数参数)

这些解决方案有问题吗?有更好的吗?最佳做法是什么?

最佳答案

对于选项 1,您需要使用两个模板参数以在两个参数具有不同的值类别时启用转发。应该是

template <typename T, typename U>
decltype(auto) f(T&& a, U&& b)
{
return a > b ? std::forward<T>(a) : std::forward<U>(b);
}

此处实际返回的内容很难算出来。首先你需要知道ab 的值类别,以及TU 被推导为什么。然后,无论您选择什么配对,都会通过三元运算符的非常复杂的规则。最后,它的输出通过 decltype 规则为您提供函数的实际返回类型。

我确实坐下来解决了所有问题,with a little help from SO .根据我的内存,它是这样的:当且仅当 ab 是兼容类型的左值引用时,结果将是一个可变的左值引用;如果 ab 之一是 const 左值引用而另一个是任何类型的引用,则结果将是 const 左值引用;否则 f 将返回一个新值。

换句话说,它对任何给定的参数对都做正确的事情——可能是因为有人坐下来准确地写下规则,以便它在所有情况下都做正确的事情。

选项 2 与选项 1 完全相同,除了 decltype 规则不会起作用,函数将始终返回一个新值 -- plain auto 从不推断为引用。

我想不出在 RVO 方面可行的选项 3,因为正如您所说,您正在使用参数。

总而言之,我认为 (1) 是您正在寻找的答案。

关于c++ - 返回转发引用参数 - 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36053628/

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