Параметр Const недостаточно - PullRequest
0 голосов
/ 04 сентября 2018

Этот код

#include <array>

void foo(const int length) {
    std::array<int, length> arr;  //line 4
}


int main(){
    const int length = 10;
    std::array<int,length> arr;
}

завершается с сообщением об ошибке

: в функции 'void foo (size_t)':

: 4: 27: ошибка: длина не является постоянным выражением

 std::array<int, length> arr;

https://gcc.godbolt.org/z/MMQXHx

Параметр length помечен как const.

Почему невозможно передать константную длину локального std::array в качестве параметра функции?

Почему это работает в основном методе?

Я знаю, что такой шаблонный подход будет работать

template <size_t length>
void foo() {
    std::array<int, length> arr;
}

1 Ответ

0 голосов
/ 04 сентября 2018

const не означает «константа времени компиляции» или «константное выражение».

Это означает, что «не позволяйте мне изменять значение этого объекта времени выполнения».

Иногда a const объект может считаться постоянным "достаточным" для ваших нужд, и компилятор разрешит код в этих случаях. Аргумент шаблона не относится к таким случаям.

В main, используйте constexpr вместо ; это ключевое слово, которое было добавлено к языку для этой цели.

Это не поможет вам с foo, в котором вы просто не можете делать то, что пытаетесь сделать. Эквивалентно сделать foo шаблоном функции, а length - параметром шаблона.

...