我一直在阅读有效的现代C ++,以下内容引起了我的注意:

斯科特在第28项中写道:


  这些关于通用参考文献和
  左值/右值编码意味着对于此模板
  
  template<typename T> void func(T&& param);
  
  推导的模板参数T将编码
  传递给param的参数是左值还是右值。的
  编码机制很简单。当将左值作为参数传递时,
  T被推导为左值参考。传递右值时,T为
  推论为非参考。 (请注意,不对称性:左值是
  编码为左值引用,但右值被编码为
  非参考)。


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

我的意思是,如果我们遵循引用折叠规则,而不是使用上述带有rvalue的模板,则会产生rvalue参考。据我所知,如果将其推导为右值参考,那么一切都会一样。为什么将其编码为非引用?

最佳答案

假设您需要传递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/

10-11 22:38