右值引用与“&& &&”合并的示例
Example of rvalue reference collapsing with "&& &&"
根据 some rules,当您有模板和引用时,您可以得到像 T & &&
这样的类型,这些类型会被折叠。
基本上,除了 T && &&
之外的所有内容都折叠为 T&
,后者折叠为 T&&
触发 && &&
案例的真实示例是什么?
我找到了一个 artificial example:
template <typename T> void func(T&& a);
auto fp = func<int&&>;
但到目前为止,在我的研究中,我还没有很好地了解这个案例实际出现的时间。
当参数类型是不受约束的 auto
时转发将是一个真实世界的例子。例如,在 lambda 中。
[](auto && arg) {
return foobar(std::forward<decltype(arg)>(arg));
}
当使用右值调用 lambda 时,decltype(arg)
会是一些 T&&
。引用折叠规则最终将在 std::forward
的实现中发挥作用,并将 T && &&
正确地转换为 return 类型的 T&&
。
根据 some rules,当您有模板和引用时,您可以得到像 T & &&
这样的类型,这些类型会被折叠。
基本上,除了 T && &&
之外的所有内容都折叠为 T&
,后者折叠为 T&&
触发 && &&
案例的真实示例是什么?
我找到了一个 artificial example:
template <typename T> void func(T&& a);
auto fp = func<int&&>;
但到目前为止,在我的研究中,我还没有很好地了解这个案例实际出现的时间。
当参数类型是不受约束的 auto
时转发将是一个真实世界的例子。例如,在 lambda 中。
[](auto && arg) {
return foobar(std::forward<decltype(arg)>(arg));
}
当使用右值调用 lambda 时,decltype(arg)
会是一些 T&&
。引用折叠规则最终将在 std::forward
的实现中发挥作用,并将 T && &&
正确地转换为 return 类型的 T&&
。