gpt4 book ai didi

c++ - 通用引用的左值/右值-nes编码

转载 作者:太空宇宙 更新时间:2023-11-04 13:28:54 27 4
gpt4 key购买 nike

我一直在阅读 Effective Modern C++,以下内容引起了我的注意:

在第 28 项中,Scott 写道:

Together, these observations about universal references andlvalue/rvalue encoding mean that for this template

template<typename T> void func(T&& param);

the deduced template parameter T will encodewhether the argument passed to param was an lvalue or an rvalue. Theencoding mechanism is simple. When an lvalue is passed as an argument,T is deduced to be an lvalue reference. When an rvalue is passed, T isdeduced to be a non-reference. (Note the asymmetry: lvalues areencoded as lvalue references, but rvalues are encoded asnon-references.)

有人可以解释为什么选择这种编码机制吗?

我的意思是,如果我们遵循引用折叠规则,而不是将上述模板与右值一起使用会产生右值引用。据我所知,如果将其推导为右值引用,一切都会正常工作。为什么编码为非引用?

最佳答案

假设您需要传递 param大约。事实上,您需要将其存储以供终生使用。实际上,您只需使用 T :

template <typename T>
struct store { T val; };

template<typename T> void func(T&& param) {
store<T> s{std::forward<T>(param)};
}

这是可行的,因为如果 param被左值传入,T将是左值引用类型,我们只是复制引用。如果param由右值传入,我们需要取得所有权 - T是一个非引用类型,所以我们最终移动构造成 s .

事实上我可以使用 T这里作为 store 的模板参数, 而不是 std::conditional_t<std::is_lvalue_reference<T>::value, T, std::remove_reference_t<T>>大概不是意外。

关于c++ - 通用引用的左值/右值-nes编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32284570/

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