Это ошибка в зависимом разрешении имен в MSVC?

На 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?

1 ответ

"Зависимое разрешение имен" вводит в заблуждение здесь. 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.

Другие вопросы по тегам