1

Тема: Питання щодо std::array

Коли створюю масив ось так:

    const int &first_half_size = middle - start + 1;
    const int &second_half_size = end - middle;

    std::array<int, first_half_size> first_half;
    std::array<int, second_half_size> second_half;

Видає помилку, що змінні, які визначають розмір масиву є неконстантними виразами.
Але якщо зробити ось так:

    const int &first_half_size = middle - start + 1;
    const int &second_half_size = end - middle;
    int first_half[first_half_size];
    int second_half[second_half_size];

Тут усе працює без помилок.
Чому так?

2

Re: Питання щодо std::array

А, чому ви вирішили, що другий варіант працює без помилок?

3

Re: Питання щодо std::array

Подякували: koala1

4

Re: Питання щодо std::array

wander написав:

А, чому ви вирішили, що другий варіант працює без помилок?

Бо там не було повідомлень про помилку.

5

Re: Питання щодо std::array

Teg Miles написав:
wander написав:

А, чому ви вирішили, що другий варіант працює без помилок?

Бо там не було повідомлень про помилку.

Таааак, з таким підходом до навчання ви далеко не просунетесь..

leofun01 написав:

масив змінної довжини (VLA) це синтаксний цукор

VLA – це не синаксичний цукор, а повноцінне розширення системи типів в С, але не в С++.

Подякували: leofun011

6 Востаннє редагувалося steamwater (04.08.2024 18:27:53)

Re: Питання щодо std::array

const int &first_half_size = middle - start + 1;
                   const int &second_half_size = end - middle;

порерше, нащо вам констпнтнi посилання? Чому нi:

const int first_half_size = middle - start + 1;
         const int second_half_size = end - middle;

?
Подруге, покажiть объяви middle, start  та end.

7

Re: Питання щодо std::array

steamwater написав:
const int &first_half_size = middle - start + 1;
                   const int &second_half_size = end - middle;

порерше, нащо вам констпнтнi посилання? Чому нi:

const int first_half_size = middle - start + 1;
         const int second_half_size = end - middle;

?
Подруге, покажiть объяви middle, start  та end.

middle, start i end  — це аргументи рекурсивної функції.

8

Re: Питання щодо std::array

middle, start i end  — це аргументи рекурсивної функції.

Тож вони не константи часу компiляцiї, а ви їх робите параметрами шаблону. З ними навiть C-масив об'я вити не мозжна. Зробiть функцiю шаблоном та приймайте масив по посиланню. Ось приклад без рекурсiї:

#include <array>
using std::cout;
using  std::endl;

template<typename T, unsigned size>
void show(const std::array<T, size> &arr)
{
    for(const auto val:arr) cout<<val<<' ';
    cout<<'\n';
}

int main()
{
    std::array<int, 3> arr1{1, 2, 3};
    show(arr1);
    std::array<int, 4> arr2{1, 2, 3, 4};
    show(arr2);
    return 0;
}
Подякували: Teg Miles1