【问题标题】:Is std::decay_t<T> decay_copy(T&&) equivalent to auto decay_copy(auto&&)?std::decay_t<T> decay_copy(T&&) 是否等同于 auto decay_copy(auto&&)?
【发布时间】:2021-12-12 04:14:36
【问题描述】:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3255.html 定义decay_copy 如下:

template<typename T>
std::decay_t<T> decay_copy(T&& v)
{ 
    return std::forward<T>(v);
}

我只是想知道:

是否等同于以下更简单的?

auto decay_copy(auto&& v)
{
    return v;
}

【问题讨论】:

    标签: c++ language-lawyer c++20 auto template-argument-deduction


    【解决方案1】:

    不是在 2011 年,因为:

    • 我们没有 auto 函数的返回类型推导(这是 C++14 功能),并且
    • 我们没有用于函数的 auto&amp;&amp; parameters(这是 C++20 功能),并且
    • 在 return 语句中没有隐式移动右值引用(这也是 C++20 的一项功能)

    但是在 C++20 中,是的,现在这是实现 decay_copy 的有效方式。 auto 推演确实衰减,return v; 隐式转发,其他都一样。


    我想从技术上讲有一个边缘情况,例如:

    struct X {
        X();
        X(X&);
    };
    

    使用decay_copy(X{}) 的原始公式,这是不正确的(没有可行的构造函数可以从右值X 构造X)。使用现有 C++20 规则下的新公式,它变得格式良好并调用非常量复制构造函数(因为我们这样做 two-step overload resolution)。

    如果采用P2266,那么它们将完全等效,因为return v;始终v 视为右值,就像现有公式一样。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2013-09-01
      • 1970-01-01
      • 2020-04-22
      • 2023-02-16
      • 1970-01-01
      • 2016-03-27
      • 2021-08-29
      • 1970-01-01
      相关资源
      最近更新 更多