std :: decay和pass-by-value之间有什么区别?

时间:2015-05-24 02:10:24

标签: c++ c++11

N4296中的std::decay规范留下以下注释:

  

[注意:这个   行为类似于   左值到右值(4.1),   数组到指针(4.2),和   函数到指针(4.3)转换   在左值表达式时应用   用作右值,也用于条带   类类型的cv-qualifiers按顺序排列   更接近地模拟按价值   论证传递。 - 结束说明]

在我看来,理想情况下std::decay会模拟通过完全的按值参数,但由于某种原因,它没有这样定义。

我认为它可以用模板参数推导来定义,在这种情况下,也可以定义实现,以便将模板参数推导用于完全模型按值参数传递。

template <typename T>
struct decay {
  private:

  template <typename U>
  static U impl(U);

  public:

  using type = decltype(impl(std::declval<T>()));
};

问题:

  1. std::decay和by-value参数传递有什么区别?
  2. std::decay 设计是不是要完全按照值参数传递模型?
  3. 上面的实现是否会完全模拟它?

1 个答案:

答案 0 :(得分:7)

N2069中提出了

std::decay,其中一个动机示例std::make_pair返回了一对decay - ed类型,这几乎与std::make_pair的{{3}}类似在C ++ 11中实现(reference_wrapper略有例外)。请注意提案最初没有删除 cv - 限定符或顶级引用 - 我认为这只是一种疏忽。

至于它只是模型 by-value参数传递而不是 duplicates 的原因,我只能猜测后者可能过于严格。考虑:

struct A {
    A(const A& ) = delete;
};

using T1 = std::decay<A>::type; // T1 == A
using T2 = your_decay<A>::type; // compile error
                                // use of deleted function A(const A&)

我不能说是否以这种方式明确指定允许decay - 不可复制的类型 - 但似乎更好的设计允许这个编译。