4

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)
}

当前版本的 Visual C++ (19.0.23918.0) 产生以下输出:

g(int)
g(int)

这是标准允许的,还是 MSVC 中的错误?

4

1 回答 1

3

“从属名称解析”在这里具有误导性。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)

结束示例]

这与 cppreference 上的示例几乎相同。所以是的,这是 MSVC 中的一个错误。

于 2016-06-08T13:11:44.917 回答