gpt4 book ai didi

c++ - 为什么在右值的情况下转发引用不推导出右值引用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:50 24 4
gpt4 key购买 nike

我理解,给定一个初始化转发/通用引用的表达式,左值被推断为 T& 类型,右值被推断为 T (而不是 T&&).

因此,为了只允许右值,需要这样写

template<class T, enable_if<not_<is_lvalue_reference<T> >,OtherConds... > = yes>
void foo(T&& x) {}

不是,

template<class T, enable_if<is_rvalue_reference<T>,OtherConds... > = yes>
void foo(T&& x) {}

我的问题是,为什么对于转发引用,右值被推导为 T 而不是 T&& 类型?我想,如果它们被推断为 T&& 那么同样的引用折叠规则也可以作为 T&& &&T&& 相同。

最佳答案

因为在当时,将右值 A 参数推导为 A&& 而不是 A 被视为不必要的复杂化并且偏离了正常规则扣除:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm

我们真的不知道我们是否可以得到一个推导规则的异常(exception)(对于左值 A 的情况),我们甚至从未想过我们敢要求两个异常(exception).这样做的好处必须是:它使不可能成为可能。

毕竟,如果没有针对左值情况的单一特殊推导规则,完美转发是不可能的,正如 N1385 如此恰本地证明的那样。

即使是今天的事后看来,添加另一个特殊扣除规则以使客户可以避免不得不否定模板约束,似乎也不是一个非常高的 yield /成本比。特别是与我们在 2002 年所追求的 yield /成本比率相比。

关于c++ - 为什么在右值的情况下转发引用不推导出右值引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16373881/

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