cppreference中add_rvalue_reference实现里int参数(0)的作用是什么?
为什么
add_rvalue_reference的实现要用int参数而非无参数? 核心是靠函数重载的优先级差异实现SFINAE逻辑,让编译器能正确选择对应重载版本:
- 调用时传
0(int类型),会优先匹配接受int参数的重载,尝试生成T&&类型。 - 但如果
T是不能被右值引用修饰的类型(比如void、固定大小数组int[3]),T&&无效,此时这个重载会被SFINAE规则排除,编译器自动 fallback 到接受...(可变参数)的重载,返回原类型T。
- 调用时传
要是改成无参数的重载直接会出问题:
- 两个无参数的模板重载签名完全一致,编译器无法区分,会报歧义错误。
- 加个
int参数后,精确匹配的优先级远高于可变参数匹配,只有当精确匹配的重载因类型不合法被排除时,才会选可变参数版本,完美实现了“能加右值引用就加,不行就返回原类型”的逻辑。
举两个实际例子:
- 当
T = void时,void&&不合法,int参数的重载被排除,最终add_rvalue_reference<void>::type就是void,符合标准要求。 - 当
T = int时,int&&合法,优先选int参数的重载,add_rvalue_reference<int>::type就是int&&。
- 当
内容的提问来源于stack exchange,提问作者user3882729
相关产品推荐
相关产品推荐

