LINUX.ORG.RU

[c++][ненависть] static const

 ,


0

2

какого, нельзя инициализировать внутри класса статический константный член, если он не интегрального типа? когда прочитал об этому у трупа страуса - прифигел. почему язык настолько не ортогонален?


Ответ на: комментарий от SSZB

>За то с красивой архитектурой. зато у нас ракеты строят

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

А где он будет храниться, если ты его не нигде не определил? Хорошему танцору всегда мешает что-то неортогональное.

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

>А где он будет храниться, если ты его не нигде не определил? Хорошему танцору всегда мешает что-то неортогональное.

а где я его должен определить?

чем принципиально отличается интегральный тип от плавающей точки, что появилось такое ограничение?

я догадываюсь, что логика есть, но не уродство тогда этот ваш си++. в других языках такого дебилизма нет.

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

Ну и пиши на других языках. Зачем жрёшь кактус? Есть языки без «дебилизмов», наслаждайся ими.

anonymous
()

Это не такой и страшный недостаток, вряд ли он стоит потраченного количества нервов :)

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

и ёжики типа тебя будут их с удовольствием кушать.

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

тут мне говорят, что gcc - компилит.

Но по Страуструпу это ошибка. И Вижуал Си++ тоже матерится.

а не знаете как по стандарту? может gcc ради прикола реализовали

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

Это расширение GCC и запрещено стандартом. Если сейчас очень надо константу, то double F () const {return 3.14; }. Такая функция будет в встроенная, но её значение нельзя будет использовать как константу во время компиляции.

В новом C++ будет среди прочего constexpr

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf

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

>Так что у Страуструпа что-то неправильно написано.

а программисты из мелкософта ошибку Страуструпа реализовали?

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

а не знаете как по стандарту?

C++ Standard, Section 9.4.2.4 :

If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constantinitializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions within its scope. 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.

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

да, страуструп вообще в с++ не очень разбирается походу

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

-pedantic (gcc 4.4.5) не пропускает class A { static const double r = 3;}

ISO C++ forbids initialization of member constant ‘r’ of non-integral type ‘const double’

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

>У тебя все плохие. Микрософт, Страуструп, С++. Одни уроды вокруг тебя.

то так оно и есть.

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

>можешь пример навести, красивого архитектурного решения в сипипи?

итераторы, например. Вообще многое из того, что не завязано на совместимость с си.

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

3.9.1/7
Types bool, char, wchar_t, and the signed and unsigned integer types are collectively called integral types. A synonym for integral type is integer type.

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

я процетировал Страуструпа. Интегральный тип является более общем, по отношению к целому

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

Александруску идею итераторов пытается расширить и углубить (в виде своих ranges). Но ranges нарушают концепцию «не платишь за то, что не используешь» (если второй конец диапазона не интересен, нет способа его не хранить, поправь, если я ошибаюсь). Я считаю, что Александреску не прав в этом вопросе. И уж точно, итераторы - большой шаг вперёд от for(int i=0;i<container.length) и шаг в более правильном направлении, чем while(elem=container.next()).

legolegs ★★★★★
()

Вам сложно их инициализировать вне класса? И при чём здесь язык и его ортогональность?

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

>Вам сложно их инициализировать вне класса? И при чём здесь язык и его ортогональность?

хочется понять, почему int можно, а float - нет.

kyz
() автор топика
Ответ на: комментарий от creepnee

float нельзя в ядре потому что ядро тоже одни уроды писали. kyz этих идиотов не проконсультировал, вот они и наделали поделок.

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

>float нельзя в ядре потому что ядро тоже одни уроды писали

Я думал что это из-за переключения контекстов. А вот оно как оказывается, из-за уродов. Ну буду знать, спасибо.

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

>хочется понять, почему int можно, а float - нет.
Фиг его знает, в новом стандарте можно будет хоть стринг. Но это специфика реализизации/синтаксиса, сам язык это не обедняет, так как язык это нечто большее чем синтаксис. Да и это такой сахарище, что как-то фиалетово.

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

>(если второй конец диапазона не интересен, нет способа его не хранить, поправь, если я ошибаюсь)

Почему нет? По-моему, ничто не мешает сделать range, одна из границ которого - бесконечность. Соответственно, хранить нужно только одно значение.

и шаг в более правильном направлении, чем while(elem=container.next())

очень спорно

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

>Почему нет? По-моему, ничто не мешает сделать range, одна из границ которого - бесконечность. Соответственно, хранить нужно только одно значение.

Видимо, я высе^W прожект Александрески до этого места не дочитал.

и шаг в более правильном направлении, чем while(elem=container.next())

очень спорно

Совершенно бесспорно. Во-первых, всегда хранится ненужный внутренний указатель на текущий элемент. Во-вторых, его надо «перематывать». Я в php багов с этим накушался. В третьих, нельзя обходить контейнер рекурсивно, т.е. во время обхода вызвать функцию, которая тоже попытается его обойти. В четвёртых, непонятно как такое параллелить. В пятых, синтаксис с while как я привёл не всегда применим, приходится более громоздко писать.

Конечно, самый труЪ-способ - это for_each(container, function), но мы же в реальном мире.

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

>нельзя обходить контейнер рекурсивно, т.е. во время обхода вызвать функцию, которая тоже попытается его обойти.

Одно это говорит об полнейшей отстойности while(elem=container.next())

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

Я когда писал предыдущий камент, тоже не дочитал - а просто подумал, что интерфейс { bool empty() const; void popFront(); T& front() const; } позволяет произвольную реализацию, в том числе - и «бесконечную».

А потом решил просмотреть до конца творение Александреску и увидел такой слайд:

Infinite ranges
• Notion of infinity becomes interesting with ranges
• Generators, random numbers, series, . . . are infinite
ranges
• Infinity is a trait distinct from the five classic categories;
any kind of range may be infinite
• Even a random-access range may be infinite!
• Statically knowing about infinity helps algorithms

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

>увидел такой слайд:

Бесконечные диапазоны

• Понятие бесконечности становится интересным с диапазонами

• Генераторы, случайные числа, ряды, . . . - это бесконечные диапазоны

• Бесконечность - характеристика отличная(?) от пяти классических категорий; любая разновидность диапазонов может быть бесконечной

• Даже диапазон с произвольным доступом может быть бесконечным!

• Статическое знание о бесконечности поможет алгоритмам

Я правильно перевёл? Вообще я всё равно не уверен, что, например, map::find сможет возвращать «экономный» итератор.

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