在MSVC中,为什么我不能把静态成员函数的引用作为参数传递?

编程语言 2026-07-07

这段代码为何会产生以下错误?

struct F
{
    static int f();
};

template <auto &F>
int r()
{
    return 0;
}

int main() {
    r<F::f>();
}
<source>(13): error C2672: 'r': no matching overloaded function found
<source>(7): note: could be 'int r(void)'
<source>(13): note: Failed to specialize function template 'int r(void)'
<source>(13): note: With the following template arguments:
<source>(13): note: 'F=int F::f(void)'

https://godbolt.org/z/oaYzYvhjj

解决方案

这显然是MSVC的一个bug,因为MSVC accepts 同样的变量形式 auto &F = F::f,但在NTTP情况下使用 auto 时会被拒绝。因为按照标准,NTTP情况下的 auto 与写出变量声明形式并非完全相同,但在语义上等价。

这可以从 [temp.arg.nontype] 看出:

如果一个 模板参数(13.2)的类型 T 包含占位类型(9.2.9.6)或用于推导类类型的占位符(9.2.9.7),该参数的类型就是在人为构造的声明中为变量 x 推导出的类型

T x = template-argument ;

如果推导出的参数类型不被允许用于 模板参数 声明(13.2),程序将不符合要求。


以下是新提交的MSVC缺陷报告:

https://developercommunity.visualstudio.com/t/MSVC-rejects-valid-template-non-type-arg/11116775

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章