Я считаю, что некоторые новые функции изменили способ работы объявления - в мельчайших деталях.
Например, это не только вводит некоторые имена, но также влияет на компиляцию кода.
struct A
{
int x;
};
struct B
{
A a;
static_assert(sizeof(a) > 10, "Wrong member size");
};
У нас также есть пустое объявление (которое, я полагаю, может использоваться только внутри класса) :
struct C
{
void f()
{ }; // Semicolon here is allowed, but is an empty declaration
};
Пустое объявление - это объявление, которое не вводит имя (потому что оно пустое).
Выяснил также "влияет на создание шаблона", я думаю:
template<class T>
class X
{
// some members
};
extern template class X<int>;
extern template class X<char>;
Сообщает компиляторучто X<int>
и X<char>
будут созданы где-то еще и не должны генерироваться здесь.