Статическое поле неполного типа - это законно? - PullRequest
16 голосов
/ 09 ноября 2011

Является ли объявление статического поля типа, который является неполным на момент определения класса, допустимым в C ++? Например:

foo.h:

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

foo.cpp:

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

Foo::Bar Foo::something;

// some more code

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

Ответы [ 2 ]

14 голосов
/ 09 ноября 2011

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

3 голосов
/ 09 ноября 2011

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

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

...