在 cppreference.com 上,提供了以下代码作为解释依赖名称解析的示例:
#include <iostream>
void g(double) { std::cout << "g(double)n"; }
template<class T>
struct S {
void f() const {
g(1); // "g" is a non-dependent name, bound now
}
};
void g(int) { std::cout << "g(int)n"; }
int main()
{
g(1); // calls g(int)
S<int> s;
s.f(); // calls g(double)
}
当前版本的可视C++ (19.0.23918.0) 生成以下输出:
g(int)
g(int)
这是标准允许的,还是 MSVC 中的错误?
"依赖名称解析"在这里具有误导性。 g
是一个非依赖名称,因此适用的规则是 temp.nondep 而不是 temp.dep.res:
模板定义中使用的非依赖名称使用 通常的名称查找并在使用它们时绑定。[ 示例:
void g(double); void h(); template<class T> class Z { public: void f() { g(1); // calls g(double) h++; // ill-formed: cannot increment function; // this could be diagnosed either here or // at the point of instantiation } }; void g(int); // not in scope at the point of the template // definition, not considered for the call g(1)
— 结束示例 ]
这实际上与 cpp 首选项上的示例相同。所以是的,这是 MSVC 中的一个错误。