Я можу визначити довжину масиву за допомогою константи, так чому б не працює int d [b]?


11
int a = 5;
const int b = a, c = 4;

int e[a];
int d[b];
int f[c];

Визначення f[c]є дійсним.
Змінна bтакож є постійною int, але компілятор дав мені помилку "вираз повинен мати постійне значення" для рядка int d[b]. Які відмінності між bі c?

Відповіді:


16

які відмінності між b і c?

c має константний ініціалізатор часу компіляції, тоді як b - ні. Об'єкт const з ініціалізатором постійної тривалості компіляції є самим постійним значенням часу компіляції.

Оскільки я можу визначити тривалість масиву за допомогою константи, то чому б це не працювати?

Не будь-яка константа зробить. constКваліфікатор передбачає стабільність виконання (тобто значення може визначатися під час виконання, але не змінюватись протягом всього терміну експлуатації об'єкта). Тільки значення константи часу компіляції можуть використовуватися як розмір масиву.


6

Ви використовуєте непостійну змінну для присвоєння значення константі. Тому значення цієї змінної неможливо визначити часом компіляції . Я знаю, що ви не змінюєтесь a, але компілятор не думає так.


4

Діагностика компілятора дійсно повинна бути постійною експресією, що оцінюється часом .

Оскільки оригінальний об'єкт, якому bпризначено, не є постійним вираженням const, що bоцінюється часом компіляції, тому компіляція завершиться невдачею, оскільки масиви змінної довжини не підтримуються у стандарті C ++.


1

"Const" просто означає, що змінна не змінюватиметься під час виконання, і не означає, що її значення можна визначити під час компіляції.

Я здогадуюсь, що ви шукаєте, це "constexpr". Можливо, ви можете спробувати це так:

constexpr int b = 4; // can't be assigned from a!
int d[b];

Натомість "constexpr" означає "реальний const", а "const" означає лише "var, що не змінюється", оскільки це є деяка історична причина. Потрібно пам’ятати, що нативний масив у c ++ завжди має фіксовану довжину, як сказав @Bathsheba.


Про які інші мови ви говорите?
Брайан

1
@Brian Вибачте, це не актуально. Я змінив свою відповідь.
Леон

"Немає справжнього шотландця ..." - дозвольте мені не погодитися з вашим "constexpr", а натомість означає "реальний const", а "const" означає лише твердження "незміна вару" . "const" означає "const", "constexpr" означає "constexpr" - вони мають два різних значення і значення в контексті мови c ++. "const" означає "Об'єкт неможливо змінити" , "constexpr" означає "можна оцінити значення функції або змінної під час компіляції"
CharonX

Вибачте, можливо, я висловив це неправильно. Англійська мова не є моєю рідною мовою.
Леон

1

Термін "константа" дійсно неоднозначний, а ключове слово constвводить в оману.

constозначає: "не дозволяйте, щоб значення цього об'єкта не було змінено після ініціалізації". Це не означає "константа часу компіляції". Його початкове значення все ще може надходити з джерел виконання.

Вам потрібна константа часу компіляції для зв'язаного масиву.

Іноді можливо мати об'єкт з ім'ям, fooякий є константа часу компіляції, якщо він є, const і він був ініціалізований з постійного виразу, як буквальний чи constexprріч. Це так для c; це не так b.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.