const_cast для массива stati c для добавления константности - PullRequest
0 голосов
/ 17 января 2020

Я столкнулся с необходимостью передать неконстантный массив stati c в константный аргумент. Как я обнаружил, const_cast может использоваться не только для удаления, но и для добавления константности к типу. Итак, вот упрощенная версия того, что я пытаюсь сделать:

int a[3] = { 1, 2, 3 };
const int b[3] = const_cast<const int[3]&>( a );

Однако кажется, что компилятор не может проанализировать это с ошибками типа

5:43: error: expected '>' before '&' token
5:43: error: expected '(' before '&' token
5:44: error: expected primary-expression before '>' token
5:50: error: expected ')' before ';' token

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

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

UPD:

Благодаря комментариям я обнаружил, что причина root в моем случае не была связана с const_cast. Если кому-то интересно, я пытался инициализировать вектор списком массивов stati c разных размеров, что, по-видимому, невозможно.

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

Ответы [ 2 ]

3 голосов
/ 17 января 2020

Во-первых, ваш синтаксис для ссылки на массив неверен. Правильная форма const int (&)[3]. Во-вторых, массив не может быть инициализирован из другого массива. В-третьих, как правило, нет необходимости приводить non-const к const, потому что такое преобразование неявно.

Самый простой способ сделать const-копию массива - это использовать класс-оболочку для массива. Стандартная библиотека предоставляет шаблон для такой оболочки: std::array. Пример:

std::array a { 1, 2, 3 };
const std::array b = a;
0 голосов
/ 17 января 2020

Это не синтаксис ссылки на массивы. Это будет записано так:

int a[3] = {1, 2, 3};
const_cast<const int(&)[3]>(a);

Но ваш массив не может быть скопирован. Вы должны иметь ссылку на него или использовать std::array:

int a[3] = {1, 2, 3};
auto& b = const_cast<const int(&)[3]>(a);

// or use std::array

std::array a = {1, 2, 3};
auto const b = a;
...