Обоснование статического константного (нецелого) синтаксиса инициализации члена? - PullRequest
3 голосов
/ 26 августа 2010

Я знаю, как инициализировать статический член, который не является целым числом, но мне интересно, каково обоснование этого синтаксиса?Я хотел бы иметь возможность просто поместить значение в класс, как вы можете с целочисленным членом, например:

class A {
  static const int i = 3;
};

Я понимаю, что это может означать больше перестроения, если я изменю значение, так какизменение в заголовке - но в некоторых случаях это довольно маловероятно - и так же плохо, как и изменение #define в заголовке в любом случае.

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

Ответы [ 2 ]

6 голосов
/ 26 августа 2010

Потому что это объявление класса . У вас еще нет объектов.

Вам нужно определить значение где-то --- где-то конкретное.

Так как это static, оно фактически занимает место где-то. Но поскольку файл .H с таким объявлением может быть #included во многих исходных файлах, какой из них определяет фактическое пространство, которое он использует? Если компилятор автоматически определит пространство в каждом объектном файле, а компоновщик разберут его, это будет нарушением " One Definition Rule ".

1 голос
/ 26 августа 2010

Статический член класса имеет связь, поэтому он должен находиться в исходном файле.То, что вы объявляете его const, не означает, что он действительно не может измениться (посмотрите, например, volatile).

Это может помочь вам:

class A {
    enum { i = 3 }; // use an enum to set a constant value in the class declaration
    void f() { int k = int(i); }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...