Является ли это ошибкой в ​​разрешении зависимых имен в 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?


person kinokijuf    schedule 08.06.2016    source источник
comment
clang++ дает вывод g(int) и g(double). См. живую демонстрацию здесь   -  person Destructor    schedule 08.06.2016
comment
temp.nondep. Не так сложно погуглить.   -  person uh oh somebody needs a pupper    schedule 08.06.2016
comment
Это середина 2016 года. Все, у кого достаточно знаний, чтобы понять зависимое и независимое разрешение имен, должны быть хорошо осведомлены об особенностях MSVC в отношении двухэтапного создания экземпляра шаблона.   -  person SergeyA    schedule 08.06.2016


Ответы (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.

person uh oh somebody needs a pupper    schedule 08.06.2016
comment
@М.М. имеет очень интересную точку зрения, утверждая, что она подпадает под «программа неправильно сформирована, диагностика не требуется» и, следовательно, не является ошибкой MSVC. - person SergeyA; 08.06.2016
comment
@SergeyA Я не вижу ссылку? - person uh oh somebody needs a pupper; 08.06.2016
comment
@SergeyA Отсутствие необходимости в диагностике не является взаимоисключающим с ошибкой. Здесь мы видим пример, противоречащий поведению MSVC, поэтому это ошибка. Стандарт не говорит о неправильном формате, поэтому диагностика здесь не требуется. - person uh oh somebody needs a pupper; 08.06.2016
comment
Я не знаю, как связать конкретный комментарий, поэтому вот ссылка на вопрос: stackoverflow.com/questions/37599877/ и там открытые комментарии под моим ответом. И я ошибся, это был не М.М., а @T.C. - person SergeyA; 08.06.2016
comment
@SergeyA Это здесь не применимо. См. CWG 1850, чтобы узнать, на самом деле должно означать. - person uh oh somebody needs a pupper; 08.06.2016
comment
Боюсь, это немного потеряно для меня. Не могли бы вы дать упрощенное объяснение? (если у вас есть на это время и силы, конечно). - person SergeyA; 08.06.2016
comment
@SergeyA Вычеркнутый текст показывает, что он применяется в основном к неполным типам (что было проблемой в вопросе, который вы связали). Но ни один из расширенных маркированных пунктов в новом тексте не относится к ситуации ОП здесь. - person uh oh somebody needs a pupper; 08.06.2016
comment
Понятно! Большое спасибо. - person SergeyA; 08.06.2016