Фактический результат разрешения имен в шаблоне класса отличается от стандарта c ++ 03

Я тестирую код в стандарте C ++ ISO / IEC 14882-03 14.6.1 / 9 на Xcode 4.1 и Visual Studio 2008. Результаты обоих компиляторов отличаются от ожидаемого результата стандарта .

Код вставлен ниже.

#include 
#include 
using namespace std;

void f(char);

template  void g(T t)
{
    f(1);
    f(T(1));
    f(t);
}

void f(int);
void h()
{
    g(2);
    g('a');
}

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


void f(char)
{
    cout << "f char" << endl;
}


int main() { 
    h();  
    return 0;
}

Как описание стандарта. Ожидаемый результат должен быть

f char
f int
f int
f char
f char
f char

Построить и запустить код в Xcode 4.1. Результат такой, как показано ниже. В настройках сборки я попытался изменить «Компилятор для C / C ++ / Object-C» на Apple LLVM Compiler 2.1, Gcc 4.2 и LLVM GCC 4.2. Выходы такие же.

f char
f char
f char
f char
f char
f char

Скомпилируйте и запустите код в Microsoft Visual Studio 2008. Результат показан ниже.

f int
f int
f int
f int
f char
f char

Описание (14.6.1 / 9) стандарта вставлено ниже.

Если имя не зависит от параметра-шаблона (как определено в 14.6.2), объявление (или набор объявлений) для этого имени должно быть в области видимости в точке, где имя появляется в шаблоне. определение; имя привязано к объявлению (или объявлениям), найденному в этой точке, и на эту привязку не влияют объявления, видимые в момент создания экземпляра. [Пример:

void f(char);
template void g(T t)
{
f(1); // f(char) 
f(T(1)); // dependent 
f(t); // dependent 
dd++; // not dependent
}
void f(int);
double dd;
void h()
{
// error: declaration for dd not found
g(2); // will cause one call of f(char) followed // by two calls of f(int)
g(’a’); // will cause three calls of f(char) 

—конечный пример]

Код хорошо сформирован для компиляторов, но выходные данные разные. Переносить этот код на разные платформы было бы очень опасно.

У кого-нибудь есть предыстория, почему эти компиляторы не следуют стандарту?

Редактировать от 11.10.2011

Per http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#197 , пример в стандарт неверен. Я тестирую приведенный ниже код на Clang и Gcc.

#include 
#include 
using namespace std;

void f(char);

template  void g(T t)
{
    f(1);
    f(T(1));
    f(t);
}

enum E{ e };

void f(E );
void h()
{
    g(e);
    g('a');
}

void f(E )
{
    cout << "f E" << endl;
}

void f(char)
{
    cout << "f char" << endl;
}

int main() { 
    h();  
    return 0;
}

Результат ожидаемый.

f char
f E
f E
f char
f char
f char

Спасибо,

Джеффри

14
задан Jeffrey 11 October 2011 в 11:23
поделиться