带auto/引用非类型模板参数的模板匹配模板模板参数的合规性疑问
模板模板参数匹配的标准合规性问题
第一个代码示例的疑问
给出的代码:
template<template<auto> class> struct A {}; template<int&> struct B {}; A<B> a; int main() {}
三款主流编译器(MSVC、GCC、Clang)的最新版本均接受该代码,但疑问点在于:auto作为非类型模板参数无法推导为引用类型,因此质疑该代码是否符合C++标准,编译器是否错误接受。
结论:该代码不符合C++标准
根据C++标准中模板模板实参的匹配规则,模板模板参数的参数与实参模板的对应参数类型必须兼容。auto作为非类型模板参数时,推导过程会剥离引用,无法解析为int&这类引用类型。因此,模板B的int&类型非类型模板参数,无法匹配模板A中template<auto> class的模板模板参数要求,A<B>的声明属于非法代码,编译器错误接受了它。
核心问题代码示例
纠正参数与实参混淆后,给出的核心代码:
template<template<int&> class> struct A {}; template<auto> struct B {}; A<B> a; int main() {}
该代码同样被三款编译器接受,但直觉上模板模板参数应至少与模板实参一样特化,因此质疑其标准合规性。
结论:该代码同样不符合C++标准
模板模板参数template<int&> class要求实参模板必须具备一个int&类型的非类型模板参数。而模板B的参数是auto占位符,当作为A的模板实参时,auto无法匹配int&类型:auto作为非类型模板参数推导时,只能得到对象类型(如int),而非引用类型。因此B无法满足A的模板模板参数约束,A<B>的声明非法,编译器错误接受了该代码。
内容的提问来源于stack exchange,提问作者user17732522
相关产品推荐
相关产品推荐

