模板参数auto&& arg是通用/转发引用还是右值引用?
问题解答
在给定的C++模板定义中:
template<auto&& arg> struct test {};
模板参数arg属于右值引用,而非通用/转发引用。
关键原因:
通用/转发引用的核心要求是:声明必须为形如T&&的形式,其中T是一个模板类型参数(或在函数的auto&&参数推导场景中),且依赖模板参数的类型推导来触发引用折叠。
而这里的auto&&是作为非类型模板参数的声明,auto的作用是推导非类型参数的具体类型,而非作为模板类型参数参与推导。这种情况下,auto&&不会触发通用引用的规则,它就是一个单纯的右值引用:
- 当传入右值(比如
test<5>)时,arg的类型是int&&,绑定到右值常量; - 若尝试传入左值(比如
int a=5; test<a>),会直接编译失败,因为右值引用无法绑定到左值——这完全不符合通用引用可以同时绑定左值、右值的特性。
内容的提问来源于stack exchange,提问作者Martin Fehrs
相关产品推荐
相关产品推荐

