Почему C ++ запрещает инициализацию нецелого члена данных в точке определения? - PullRequest
1 голос
/ 23 декабря 2009
class Interface {
public: 
  static const int i = 1;
  static const double d = 1.0;
    //! static const string *name = new string("Interface name");
    virtual string getName() = 0;
}

Поскольку C ++ является традиционным действительно скомпилированным языком программирования, можно легко убедиться, что он допускает инициализацию объектов (?). Но почему C ++ запрещает двойную инициализацию в точке определения? Я вижу, что g ++ теперь поддерживает двойную инициализацию в точка определения, но не msvc.

Мой вопрос таков: поскольку легко поддерживать примитивные типы - инициализация с плавающей запятой / двойная в точке определения, и это может сделать жизнь программиста на С ++ проще и счастливее с этим удобным, почему С ++ запрещает это?

P.S: Ссылка - раздел 9.2.4 стандарта C ++ 2003.

Член-декларатор может содержать константа-инициализатор, только если он объявляет статический член (9.4) из константный интеграл или константное перечисление тип, см. 9.4.2.

Ответы [ 2 ]

2 голосов
/ 23 декабря 2009

Потому что иначе возник бы вопрос, в какой единице компиляции (например, объектном файле) находится значение. Каждый файл, содержащий заголовок с определением класса, будет пытаться создать объект, который будет присвоен статическому значению при создании, потенциально вызывая непредсказуемое поведение.

Это не просто назначение , которое не работает;Вам также все еще нужно определить статическое значение вне объявления класса.например,

class Foo
{
  static std::string s;
};

std::string Foo::s = "foo";

Я не знаю, является ли это хорошей причиной, но я все равно подозреваю, что в этом вся логика.

1 голос
/ 23 декабря 2009

Я не думаю, что вы получите значимый ответ здесь. Просто так случилось. И новый стандарт C ++ 0x снимает это ограничение, что является признаком того, что нет веской причины.

На самом деле, это ограничение также унаследовано от C - вы не можете инициализировать элементы структуры , например .

Редактировать : теперь в вашем примере есть подсказка, которая предполагает, что вы говорите о статических членах. В вашем конкретном примере вы назначаете указатель на строку, на строку. Кроме этого я буду голосовать за ответ Скотчи сейчас. За этим, безусловно, стоит логика.

...