Мой компилятор позволяет "T & ...".Это расширение? - PullRequest
12 голосов
/ 05 февраля 2011

Я был удивлен, когда сработало следующее

template<typename T>
void f(T &...);

Я подумал, что я должен объявить "T" как "typename ... T", и это работает только в C ++ 0x. Но вышесказанное скомпилировано в строгом режиме C ++ 03. Что происходит?

Ответы [ 2 ]

20 голосов
/ 05 февраля 2011

Это просто плохой старый синтаксис C varargs; грамматика позволяет пропустить запятую. Следующие значения эквивалентны:

int printf(const char* fmt, ...);
int printf(const char* fmt...);
3 голосов
/ 05 февраля 2011

Вы вызывали функцию? Шаблонные функции не компилируются, пока вы не вызовете их. А в Visual Studio 2010 IntelliSense показывает, что реальный синтаксис этой функции будет

template <class T> void f(T&, ...)

Пахнет как старый синтаксис аргумента переменной.

...