Этот код, безусловно, плохо сформирован, потому что Foo
специализируется после точки создания:
template <typename T>
struct Foo {
int a;
};
Foo<int> x = { 42 };
template <>
struct Foo<int> {
const char *a;
};
Foo<int> x = { "bar" };
Он плохо сформирован из-за той части стандарта, которую я сделал акцент:
Специализация шаблона функции, шаблона функции-члена или функции-члена или статического элемента данных шаблона класса может иметь несколько точек инстанцирования внутри единицы перевода и в дополнение к точкам создания, описанным выше, для любого такого специализация, которая имеет точку инстанцирования в пределах единицы перевода, конец единицы перевода также считается точкой инстанцирования. Специализация шаблона класса имеет не более одной точки инстанцирования внутри единицы перевода. Специализация для любого шаблона может иметь точки инстанцирования в нескольких единицах перевода. Если две разные точки инстанцирования дают шаблонную специализацию разным значениям в соответствии с правилом одного определения, программа плохо сформирована, а диагностика не требуется.
Теперь, этот код плохо сформирован?
struct A;
template <typename> class Foo { };
Foo<A> foo; // note A is incomplete here
struct A {};
Изменяется ли неправильная формальность, если Foo
объявлен таким образом?
struct A;
template <typename T>
struct Foo {
Foo() {
new T;
}
};
Foo<A> foo; // note A is incomplete here
struct A {};
Я задал этот вопрос из-за обсуждения по этому вопросу.
Обратите внимание, что это не дубликат. Этот вопрос касается того, почему компиляция кода, этот вопрос касается того, плохо ли он сформирован. Они отличаются друг от друга, потому что плохо сформированная программа не обязательно является некомпилирующей программой.
Обратите внимание, что с clang и gcc мой пример с new T
компиляторами new T
, в то время как в этом примере (T
как член) нет:
struct A;
template <typename T>
struct Foo {
T t;
};
Foo<A> foo; // note A is incomplete here
struct A {};
Может быть, оба плохо сформированы, и диагностика дается только для этого последнего случая?