C++17 HomoValueList模板参数未按预期限制同质类型问题
为什么
HomoValueList<1, 'a', true>没有触发编译错误? 先看你提到的模板定义:
template<auto V1, decltype(V1)... VS> class HomoValueList { };
作者设计这个模板的初衷是限制所有参数为同类型的非类型模板参数,但你的实例化能通过编译,核心原因在于C++对非类型模板参数的隐式转换规则:
- 当你传入第一个参数
1时,decltype(V1)被推导为int,因此参数包VS的每个位置都被声明为int类型的非类型模板参数。 'a'(char类型)和true(bool类型)虽然原始类型和int不同,但它们的字面量可以隐式转换为int:'a'会被转换为ASCII值97,true会被转换为1。这种转换是C++允许的非类型模板参数实参转换,所以编译器会接受这些参数作为int类型的模板实参。- 这个模板写法并没有强制要求
VS中每个参数的原始类型和V1完全一致,只是要求它们能被转换为decltype(V1)的类型。如果要实现严格的同类型约束,需要用C++20的概念来强化:
此时再实例化#include <concepts> template<auto V1, auto... VS> requires (std::same_as<decltype(V1), decltype(VS)> && ...) class HomoValueList { };HomoValueList<1, 'a', true>就会触发编译错误,因为char、bool与int不属于相同类型。
内容的提问来源于stack exchange,提问作者unegare
相关产品推荐
相关产品推荐

