Это ошибка в зависимом разрешении имен в 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.