LINUX.ORG.RU

Баг компилитора или со мной что-то?

 


1

2

Привет.

Хотел написать так, чтобы создавался массив размером == шаблонному параметру и все его элементы инициализировались некоторым значением (в момент создания, а не потом обходом, т.к массив юзер типов, надо через конструктор). Написал:

#include <array>
#include <utility>
#include <iostream>
using namespace std;

template <size_t I>
struct Init_val {
    static int f(int val) {return val;}
    static constexpr int i = 9;
};

template <size_t num>
struct S {
    void f(int val) {
        [val]<size_t ...I>(index_sequence<I...>) {
            array ar{(Init_val<I>::f(val) , ...)};
            array ar2{(Init_val<I>::i , ...)};

            // check
            for (int a : ar)
                cout << a;
            cout << endl;
            for (int a : ar2)
                cout << a;
            cout << endl;

        }(make_index_sequence<num>{});
    }
};

int main() {
    S<5> s;
    s.f(7);
}

шланг и ГЦЦ компилирует без ошибок, но при запуске ожидалось пять семёрок и пять девяток, но:

$ g++ 2.cpp -std=c++20  &&  ./a.out 
7
9

Надо багрепорт писать?

PS: я там два массива сделал, вообще мне нужен тот что с функцией, но т.к. с функцией конструкция шибко хитрая, то написал вариант с константой - тоже не работает.

★★

Надо для начала с ключами

g++ 2.cpp -std=c++20 -pedantic -Wall -Wextra
и почитать что компилятор скажет на такое

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

компиль говорит:

warning: left operand of comma operator has no effect [-Wunused-value]

Но как бы я не согласен, мне ведь нужен не comma operator, контекст иной, я массив инициализирую.

kvpfs ★★
() автор топика
Ответ на: комментарий от Siborgium

Всё, понял. С фолдами всё смешалось. Логично, и до 17 паки раскрывали. Жаль, что фолды не сделали в 11 стандарте, тогда бы раскрытие было бы однообразным, а так получилось два способа под разные цели.

kvpfs ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.