LINUX.ORG.RU

[C++] [Страуструпп] [Стандарты] static const double

 ,


0

0
class MyConstants
{
public :
    static const long constant1 = 1;      //всё ок 
    static const double constant2 = 2.2;  //ругается при g++ -pedantic
};

Ругается так: «ISO C++ запрещает инициализацию элемента-константы ‘constant2’ нецелочисленного типа ‘const double’».

Смотрим в стандарт:

ANSI C++ 98, 9.2 «Class Members» item 4

A member-declarator can contain a constant-initializer only if it declares a static member (9.4) of const integral or const enumeration type, see 9.4.2.

ANSI C++ 98, 9.4.2 «Static Data Members» item 2

If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions. The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer.

Объясните, пожалуйста, к чему в стандарте такое странное ограничение?

★★★★★

class MyConstants
{
public :
static const long constant1;
static const double constant2;
};

const long MyConstants ::constant1 = 1;
const double MyConstants ::constant2 = 2.2;

там же где то..

anonymous2 ★★★★★
()
Ответ на: комментарий от anonymous2

да я знаю, как это обходится... ещё enum hack есть из вариантов.

мне интересно знать, к чему это ограничение.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

у меня есть предположение, что это для того чтобы максимально разнести definition и implementation. или как это правильно сказать...

antony986
()
Ответ на: комментарий от Obey-Kun

Это ограничение, в частности, было связано с отсутствием гарантий того, что результаты вычисления одного и того же float-выражения, при компиляции и на целевой машине, будут равны.

summatus
()

По моим воспоминаниям -pedantic означает соответствие практически всем ISO стандартам (даже 90-го года), лучше его использовать вместе с явным указанием стандарта, что-то типа -std=gnu99 или что приличнее.

io ★★
()
Ответ на: комментарий от Obey-Kun

> алсо в c++0x это ограничение снимут

template<double X> до сих пор запрещено, вроде бы по тем же соображениям... Понятно, что лучше перебдеть, чем недобдеть, но порой ограничения выглядят странно :)

const86 ★★★★★
()
Ответ на: комментарий от io

>По моим воспоминаниям -pedantic означает соответствие практически всем ISO стандартам (даже 90-го года), лучше его использовать вместе с явным указанием стандарта, что-то типа -std=gnu99 или что приличнее.

Для C++ пока есть всего один ISO стандарт 98 года, а gnu99 это C, а не C++.

anonymous
()
Ответ на: комментарий от anonymous

+ bug fixing

и что? изменения есть, некоторые достаточно существенные; принята новая редакция стандарта в 2003 году. или ты C++0x тоже будешь считать bug fixing'ом, так как он тоже основан на ISO/IEC 14882:1998?

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Про bug fixing не я придумал.

«ISO/IEC JTC1/SC22/WG21 has produced the standard ISO/IEC 14882:1998 on the programming language C++. It was published 1998-09-01. A technical corrigendum was approved in 2003. A draft for the combined C++ standard and corrigendum is available in N1316.»

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.