Подтвердить что ты не робот

Статическое поле неполного типа - это законно?

Объявляет статическое поле типа, которое является неполным в момент определения класса, законного в С++? Например:

foo.h:

class Foo
{
public:
  // ...
private:
  class Bar;
  static Bar something;
};

foo.cpp:

class Foo::Bar
{
  // ...
};

Foo::Bar Foo::something;

// some more code

Компиляторы, похоже, согласны с этим, и я не вижу причин, по которым его следует отклонить, но что говорит стандарт о такой ситуации? Я бы очень хотел, чтобы кто-то дал прямую цитату из стандарта, предпочтительно из "старой" (той, которая была с 2003 года).

4b9b3361

Ответ 1

Да, то, что вы делаете, специально разрешено (§9.4.2/2): "Объявление статического члена данных в его определении класса не является определением и может иметь неполный тип, отличный от cv-qual пустота".

Ответ 2

Я не могу привести цитату из стандарта, но я могу дать вам совет "подумать, как компилятор".

В момент, когда вы объявляете something, что компилятор должен знать о типе? Если бы это был нормальный член, ему нужно было бы знать размер, чтобы он мог включать его в определение класса, но это не так для статических членов, потому что их хранилище не является частью класса. Ему не нужно знать, как его построить, потому что он не будет построен как часть построения класса. На самом деле компилятор не должен знать об этом статическом классе в то время, когда он был объявлен, поэтому прямое декларирование работает очень хорошо.