У меня есть следующий код на С++:
//Define to 1 to make it work
#define WORKS 0
#if WORKS
template< typename T > struct Foo;
#else
template< typename T >
struct Foo {
T t;
};
#endif
class Bar; //Incomplete type
void fFooBar(Foo<Bar> const & foobar) { }
void f(Foo<Bar> const & foobar) {
fFooBar(foobar);
}
int main() {
return 0;
}
Если WORKS определяется как 0 (шаблон структуры задан), код не компилируется, поскольку он пытается создать экземпляр в fFooBar(foobar);
и терпит неудачу, потому что Bar
является неполным.
Если WORKS определяется как 1 (шаблон структуры undefined), код компилируется.
В соответствии со стандартом шаблон не должен устанавливаться, если не требуется полный тип (что не относится к const&
) или это изменит семантику кода (что опять не так, и againt, то же самое должно произойти, если шаблон был undefined).
Кроме того, странно, что программа может быть скомпилирована путем удаления информации из блока компиляции. Но тот факт, что MSVC, gcc и clang все делают то же самое, заставляет меня думать, что для этого должна быть причина.