Адрес статического const не является выражением const? - PullRequest
3 голосов
/ 06 апреля 2011

Хотя адрес статического адреса был константным выражением, как в примере ниже, но я получаю ошибку компилятора (или это плохо для C ++ 0x?)

class X {
    static const int x;
    enum { y = &x };
};

Ответы [ 5 ]

5 голосов
/ 06 апреля 2011

Адрес переменной (будь то статический или нестатический) не является константой времени компиляции . enum требует константа времени компиляции . Вот почему это дает ошибку.

На самом деле, GCC выдает очень четкое сообщение об ошибке:

prog.cpp: 7: ошибка: «X :: x» не может появляться в константном выражении
prog.cpp: 7: ошибка: `& 'не может появляться в константном выражении

Посмотри на себя: http://ideone.com/FJk3C


Тем не менее, допускается :

class X {
    static const int x;
    enum { y = sizeof(x) }; //okay. sizeof(x) can be known at compile time!
};

Не путайте константы времени компиляции с константами времени исполнения. Это две разные вещи.

2 голосов
/ 06 апреля 2011

Чтение стандарта 1998 года, 5.19 (1): «В некоторых местах C ++ требует выражений, которые оценивают как целочисленную переменную или константу перечисления ... как инициализаторы перечислителя (7.2) ....» *

Далее, "Интегральное константное выражение может включать только .... В частности, за исключением sizeof выражений, функций, объектов классов, указателей или ссылок не должно использоваться ...."

Плавающие литералыявно перечислены как преобразуемые в целочисленный тип или тип перечисления, и ничто иное не является.

Преобразование даже выражения константы адреса для создания инициализатора перечислителя недопустимо в первом стандарте.

1 голос
/ 06 апреля 2011

Адрес статического объекта является константным выражением, но не является интегральным константным выражением, поскольку он не имеет целочисленного типа.И reinterpret_cast преобразование его в целочисленный тип по-прежнему не делает его интегральным постоянным выражением, поскольку reinterpret_cast не допускается в целочисленных константных выражениях.И инициализатору для значения enum требуется целочисленное константное выражение.

В сущности, причина, по которой вы получаете ошибку компилятора, заключается в том, что вы пытаетесь инициализировать значение enumс выражением, которое не имеет целочисленного типа и не имеет неявного преобразования в целочисленный тип.

1 голос
/ 06 апреля 2011

Это константное выражение, но его нельзя определить во время компиляции. Фактическое значение адреса будет зависеть от области памяти, в которую исполняемый файл в конечном итоге будет загружен каким-либо загрузчиком ОС. Члены перечисления должны иметь значения, которые могут быть определены компилятором.

Приветствия
J.

1 голос
/ 06 апреля 2011

Программа некорректна, потому что:

  • адрес объекта не является целочисленное постоянное выражение
  • для взятия адреса x требуется (n вне класса) определение
  • использование статического константного интегрального члена в любом месте, кроме интегрального требуется выражение константы, требуется определение.
...