Здравствуйте, Аноним, Вы писали:
А>Вопрос, а какими практическими соображениями вызвано данное ограничение? А>В Java, к примеру, так делать можно.
class Y {
const int c3 = 7; // error: not staticstatic int c4 = 7; // error: not conststatic const float c5 = 7; // error not integral
};
...
So why do these inconvenient restrictions exist? A class is typically declared in a header file and
a header file is typically included into many translation units. However, to avoid complicated linker rules,
C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in-class definition of entities
that needed to be stored in memory as objects. See D&E for an explanation of C++'s design tradeoffs.
В общем, как я понял, это запрещено, т.к. нарушает ODR и создает проблемы линкеру.
С интегральными константами проблем нет, наверное, потому что компилятор подставляет их как define-макросы.
C++ можно выучить за 21 день! ...если дни — полярные.
Re[3]: Инициализация статических членов
От:
Аноним
Дата:
28.11.05 09:47
Оценка:
Здравствуйте, lLPl, Вы писали:
LP>Здравствуйте, lLPl, Вы писали:
LP>В общем, как я понял, это запрещено, т.к. нарушает ODR и создает проблемы линкеру. LP>С интегральными константами проблем нет, наверное, потому что компилятор подставляет их как define-макросы.
Здравствуйте, Аноним, Вы писали:
А>При инициализации статических членов, С++ позволяет это делать внутри себя только для константных интегральных типов.
А>То есть нельзя написать
А>class SomeClass А>{ А>const static std::string Str = "Str"; А>};
А>а надо инициализировать Str в единице трансляции
А>Вопрос, а какими практическими соображениями вызвано данное ограничение?
Никакими. Это просто историческая традиция.
А>В Java, к примеру, так делать можно.
On Mon, 28 Nov 2005 09:16:05 -0000, wrote:
> При инициализации статических членов, С++ позволяет это делать внутри себя только для константных интегральных типов. > > То есть нельзя написать > > class SomeClass > { > cons static std::string Str = "Str"; > }; > > а надо инициализировать Str в единице трансляции > > Вопрос, а какими практическими соображениями вызвано данное ограничение? > В Java, к примеру, так делать можно.
И в С++ можно сделать. Нужно лишь вспомнить, что для статических членов шаблонов ODR ослаблен.