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>()));
};
问题:
std::decay
和by-value参数传递有什么区别?std::decay
设计是不是要完全按照值参数传递模型?答案 0 :(得分:7)
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
- 不可复制的类型 - 但似乎更好的设计允许这个编译。