Я тестирую код в стандарте 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
Спасибо,
Джеффри