|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
||||||
Двумерный массив <array>. const int value = array.size(); value не константа?14.05.2016, 16:15. Показов 6858. Ответов 36
Метки нет (Все метки)
0
|
||||||
| 14.05.2016, 16:15 | |
|
Ответы с готовыми решениями:
36
Расстановка девяти чисел (Turbo C) Выводит ошибку using Matrix = std::array<std::array<int, 3>, 3>; и bool NextSet Присвоить значения переменных в массив Array (class Array в Turbo C++) |
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
|
| 14.05.2016, 17:19 [ТС] | |
|
Я предпочту увидеть ответ на заданный вопрос. Пример не компилируется, почему?
Добавлено через 30 минут Всё. Вспомнил. Ответ не нужен.
0
|
|
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
||
| 14.05.2016, 19:33 | ||
const значение является Целочисленным Константным Выражением тогда и только тогда, когда его инициализатор является Целочисленным Константным Выражением.В вашем случае ROW инициализировано при помощи вызова constexpr метода std::array<>::size() через ссылку. Методы, вызванные через ссылку, не порождают Целочисленного Константного Выражения, даже если эти методы являются constexpr.
1
|
||
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
|
| 14.05.2016, 19:52 [ТС] | |
|
В моём случае: то, что я в ROW пихаю, неизвестно на этапе компиляции;
Вот и всё.
0
|
|
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
||
| 14.05.2016, 20:19 | ||
|
Сразу надо заметить, что ваш оригинальный код прекрасно компилируется gcc http://coliru.stacked-crooked.... 4ad15dc04f А вот clang выдает ошибку http://coliru.stacked-crooked.... 3a33d6f578 То есть вопрос несколько неоднозначный. Метод std::array<>::size() является constexpr, причем его результат напрямую определяется шаблонным параметром. Т.е. теоретически это значение прекрасно известно на этапе компиляции и теоретически у компилятора есть все необходимое для того, чтобы вычислить это constexpr именно как constexpr, т.е. именно на этапе компиляции. Что gcc и делает.Для clang, похоже, преградой тут является именно вызов constexpr метода через ссылку. Если в вашем примере убрать ссылку с объявления параметра, то пример начнет прекрасно компилироваться и в clang. А вот как правильно - надо разбираться...
2
|
||
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
|||
| 14.05.2016, 21:11 [ТС] | |||
|
Некоторые компиляторы при оптимизациях иногда умеют вычислять то, что предполагается константой ещё до выполнения. То есть фактически это так и выглядит, что вроде должно быть неизвестно, но как по мановению волшебной палочки почему-то известным становится ещё до компиляции. Как-то так. В общем, правильно как в clang, а оптимизации эти - это оптимизации. Добавлено через 3 минуты Если надо разбираться, я как бы не против. Добавлено через 41 минуту Студия так пишет:
0
|
|||
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
||
| 14.05.2016, 21:13 | ||
|
Когда же речь заходит о таких принципиальных качественных вопросах, как формирование Целочисленных Константных Выражений, т.е. решениях, влияющих на компилируемость кода, то тут спецификация языка никакой свободы компиляторам не предоставляет. Контексты, в которых const и constexpr обязаны порождать Целочисленные Константные Выражения (т.е. порождать значения, известные на стадии компиляции), оговорены однозначно.Вопрос в данном случае только в том, относится ли данный случай к набору таких контекстов.
2
|
||
|
|
|
| 14.05.2016, 21:31 | |
|
Сдаётся мне, если есть два массива
C++ array<int,10> a; array<int,20> b; shuffle_row(a); shuffle_row(b);
1
|
|
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
||
| 14.05.2016, 21:47 [ТС] | ||
|
Хотя по логике возможным быть не должно. Добавлено через 4 минуты Коли о ссылках рассуждать, то я бы и о && не хотел забывать. Там тоже как с &.
0
|
||
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
||||
| 14.05.2016, 22:06 | ||||
shuffle_row<T>, array<int,10> и array<int,20> - это два совершенно разных, совершенно независисмых типа Т. Поэтому в данном примере будет инстанциироваться две отдельных, ничего друг о друге не знающих специализации функции shuffle_row: скажем shuffle_row_std_array_int_10 и shuffle_row_std_array_int_20. В каждой будет свой массив temp и никаких неоднозначностей с его размером не будет.shuffle_row<int>. В этом коде инстанциируется именно shuffle_row<std::array<...>>, а это совсем другая история.
1
|
||||
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
||||||
| 14.05.2016, 23:03 [ТС] | ||||||
|
Итак, обсуждаем теперь
0
|
||||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 18.05.2016, 01:37 | |
|
daslex, я не спец как вот hoggy может вам ответить , но вроде бы ответ очевиден - ссылка это абстрактная сущность времени выполнении: для взятия размера нужен объект (дяда с адрессом, который оживает только вовремя выполнения)
0
|
|
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
|
| 18.05.2016, 01:43 [ТС] | |
|
А без ссылки не абстрактная сущность времени выполнения?
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 18.05.2016, 02:09 | ||||
ссылки - псевдонимы имен объектов. а компиляторы замечательно умеют различать объекты по их именам. 2. ссылки могут быть использованы в качестве параметров шаблона. 3. к конкретно данной ситуации (#13) ссылки не имеют ни малейшего отношения. код валидный, и успешно собирается компиляторами, которые поддерживают constexpr. проблема с компиляторами студии: они до сих пор его не осилили.
0
|
||||
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
|||||||
| 18.05.2016, 02:18 | |||||||
constexpr, однако не считает arr.size() константным выражением, пока вызов делается через ссылку.
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 18.05.2016, 02:45 | |||
|
Добавлено через 3 минуты
0
|
|||
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
|||
| 18.05.2016, 03:15 | |||
|
Добавлено через 12 минут А именно, согласно цитате, которую мне подсказали на StackOverflow, core constant expression e не должно содержать вычисления
1
|
|||
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
|
|||||||||||||||||
| 24.05.2016, 21:16 [ТС] | |||||||||||||||||
|
Я тут немного подумал, так как словечки выше какие-то заморские, непонятные, и вот что решил:
======================== Я может где немного неправильно выразился, но суть должна быть понятна. Если так рассуждать, то как-то легко всё встаёт на свои места и напрашивается вывод на глюк в тексте предупреждения.
0
|
|||||||||||||||||
| 24.05.2016, 21:16 | |
|
Помогаю со студенческими работами здесь
20
SIZE of array is not computable
Переписать программу через класс Array (двумерный массив).
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|