GCC, Clang и IBM не согласны с тем, как выполнить поиск имени зависимого от параметра шаблона. Какой из них прав?

Рассмотрим этот пример, который я нашел на веб-сайте IBM:

#include 
using namespace std;

void f(double) { cout << "Function f(double)" << endl; }

template void g(T a) {
  f(123);
  h(a);
}

void f(int) { cout << "Function f(int)" << endl; }
void h(double) { cout << "Function h(double)" << endl; }

void i() {
  extern void h(int);
  g(234);
}

void h(int) { cout << "Function h(int)" << endl; }

int main(void) {
    i();
}

Что будет печатать?

  • IBM Документация я адаптировал этот пример, доступный здесь , говорит, что он будет печать:

     Функция f (Двойной)
    Функция h (двойной)
     

    Обоснование этого - это то, что шаблон-параметр, зависящий от параметра, зависящий от имени, выполняется прямо перед призрением I () , так что он находит H (двойной) , но не h (int) .

  • Когда я составляю его с помощью GCC 4.4.1, он печатает:

     Функция f (Двойная)
    Функция h (int)
     

    GCC, похоже, смотрит вверх по шаблонам-параметрам, зависячавным имена в шаблоне после того, как все остальное было скомпилировано, поэтому он находит как H (Double) и H (int) и предпочитает последнее.

  • Когда я компилирую его с помощью Clang 2.8, он не скомпенсируется. Ошибка компилятора:

     IBM_EXAMPLE.CC:8:3: ОШИБКА: Использование незаменимого идентификатора «H»
      h (а);
      ^
    IBM_EXAMPLE.CC:16:3: Примечание: в приведении присмотров функции шаблон специализации «G » запрашивается здесь
      g  (234);
      ^
    1 сгенерирована ошибка.
     

    Clang, похоже, воспринимает имена, зависящие от шаблона-параметра в шаблоне в точке, когда шаблон объявлен, поэтому он не находит ни H (Double) , ни H (int) .

Какой из них прав?

22
задан M.M 27 November 2014 в 22:20
поделиться