gpt4 book ai didi

c++ - std::decay 和按值传递之间有什么区别?

转载 作者:搜寻专家 更新时间:2023-10-30 23:55:45 24 4
gpt4 key购买 nike

N4296std::decay 的规范留下以下注释:

[ Note: This behavior is similar to the lvalue-to-rvalue (4.1), array-to-pointer (4.2), and function-to-pointer (4.3) conversions applied when an lvalue expression is used as an rvalue, but also strips cv-qualifiers from class types in order to more closely model by-value argument passing. — end note ]

在我看来,理想情况下,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 和按值参数传递之间有什么区别?
  2. std::decay 是否设计不对按值参数传递进行精确建模?
  3. 上面的实现是否可以准确建模?

最佳答案

std::decay 是在 N2069 中提出的,激励示例是 std::make_pair 返回一对 decay-ed 类型,这与 std::make_pair 非常接近在 C++11 中实现(reference_wrapper 略有异常(exception))。请注意该提案最初没有删除 cv 限定符或顶级引用 - 我认为这只是一个疏忽。

至于它只是建模按值参数传递而不是复制的原因,我只能猜测可能是后者限制太多。考虑:

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-ing 不可复制的类型 - 但似乎更好的设计允许它编译。

关于c++ - std::decay 和按值传递之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30419426/

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