Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 Константы и агрегаты (С++)
Аватара пользователя
Объясните пожалуйста, почему не работает последняя строка следующего примера:

Используется синтаксис C++
const int i[] = { 1, 2, 3, 4 }
float f[i[3]]; // compile error
 


В объяснении говорится: "В таких ситуациях const означает "область памяти с неизменным содержимым". Тем не менее, это значение не может использоваться во время компиляции, поскольку компилятор может не знать содержимого этой памяти."

Вот это "тем не менее" сбивает столку и ничего мне не объясняет... :oops: :cry:
Почему массив f не может быть определен, если элемент i[3] константа и определена во время компиляции? Компилятор не может сгенерить код, рассчитывающий смещение до элемента и узнать его константное значение? Но с другой стороны, конструкция

Используется синтаксис C++
extern const int i = 5;
float f[i];
 


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

 Re: Константы и агрегаты (С++)
А какой компилятор? У меня gcc не ругается.

 Re: Константы и агрегаты (С++)
Аватара пользователя
VC2005. странно что не ругается... т.е. получается что это совершенно компилятор-зависимая штука не регулируемая стандартом?

 Re: Константы и агрегаты (С++)
Вполне возможно, что просто один из компиляторов этому самому стандарту не соответствует :) .

 Re: Константы и агрегаты (С++)
2volovzi
Цитата:
У меня gcc не ругается.

Просто вы тестируемый код добавили в функцию. :) А вот если его в глобальную область видимости положить, то тогда не скомпилируется (мой gcc пишет, мол, variable-size type declared outside of any function). Никаких расхождений со стандартом конечно же нет, к нему и отсылаю. :)

 Re: Константы и агрегаты (С++)
int i[] - это просто другая запись для int *i, таким образом вы объявляете константный указатель. А вот что будет содержаться в этом массиве вовсе не константно, следовательно вы и получаете ошибку.

 Re: Константы и агрегаты (С++)
2Mirdin
Вы немного ошибаетесь. Мало того, что тип int [], строго говоря, не эквивалентен int * (вы это уже знаете из соседней темы :) ) Но главное, тип константного указателя выглядит как int * const, а не как const int *. Такие объявления удобно читать справа налево, например const int * читается как "указатель (*) на целочисленную (int) константу (const)".

В стартовом же посте, на мой взгляд, другая проблема. В C слово const фактически просто запрещает компилятору допускать модификацию объекта, но в остальном же такие константы мало чем отличаются от переменных (в C++ ситуация несколько иная). :) Далее в стандартах оговаривается, что в общем случае приходится выделять память под массив констант из-за проблем с отслеживанием использования элементов такого массива. В этом отличие от примера с extern const int i = 5;. Кстати, я не понял, что в данном случае дает extern, ну учитывая наличие инициализирующего литерала; быть может подразумевалось static... В любом случае, при использовании чистого C, ничего подобного сделать не получится (если конкретный компилятор позволяет делать такое, то он обязан выдавать предупреждения об отклонении от стандарта), поэтому в C-программах так популярен #define. :)

Для меня остается открытым вопрос о том, противоречит ли стандарту (C++) компилятор, способный скомпилировать код, предложенный топикстатером, т.е. float f[i[3]]... Ведь, в-принципе, компилятор даже при необходимости выделить память под массив констант может разместить его в области, доступной только для чтения, и таким образом гарантировать, простите за тавтологию, константность констант. Сам буду рад разъяснениям. :)

 Re: Константы и агрегаты (С++)
Код:
i[3]
не является константным выражением.

 Re: Константы и агрегаты (С++)
Используйте динамическое выделение памяти по new

 Re: Константы и агрегаты (С++)
logout2d в сообщении #465392 писал(а):
Используйте динамическое выделение памяти по new

Правильнее использовать std::vector

 Re: Константы и агрегаты (С++)
Цитата:
Правильнее использовать std::vector

А чем правильнее?

Вы везде лепите std::... ?
ИМХО статический массив и шаблонные контейнеры принципиально разные вещи.

Мы уже отошли от вопроса :-)

 Re: Константы и агрегаты (С++)
logout2d в сообщении #467344 писал(а):
Цитата:
Правильнее использовать std::vector

А чем правильнее?

Тем, что не надо заботиться об освобождении памяти.

Цитата:
ИМХО статический массив и шаблонные контейнеры принципиально разные вещи.

Мы уже отошли от вопроса :-)

Мой комментарий относился исключительно к использования new.

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

 Re: Константы и агрегаты (С++)
Ну с грамматикой согласен.

Можно конечно использовать и вектор, но надо понимать и достоинства/недостатки :-)

 [ Сообщений: 13 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group