You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:31:12