В С++ 14 у меня есть следующий тип:
std::tuple<int[2], int>;
Как я могу правильно инициализировать его? Этот
std::tuple<int[2], int> a {{2,2},3};
дает мне эту ошибку:
/usr/include/c++/5/tuple:108:25: error: array used as initializer
Пока это:
std::tuple<std::array<int,2>, int> a {{2,2},3};
работает, но я хочу иметь возможность работать со стандартными массивами в стиле C
std::tuple не агрегирован, и int[2] не копируется :-/ ...
@NathanOliver, я согласен с тобой. Мне приходится работать с существующим кодом, который их использует, поэтому я пытаюсь выяснить, есть ли другие способы





std::tuple не является агрегатом и не предоставляет список-инициализатор конструктор. Это делает невозможной инициализацию списка с этим типом для C-массивов.
Однако вы можете использовать std::make_tuple:
auto a = std::make_tuple<int[2], int>({2,2},3);
или std::make_tuple<int[2]>({2,2},3); :). и make_* обычно позволяет компилятору выводить тип...
@ Jarod42 Это очень странно. Не буду использовать ;)
Тип оказывается std::tuple<int*, int>, так что, к сожалению, мы еще не там.
Зачем вам необработанные массивы?
std::array<int,2>решает проблему и с ним намного проще работать. Если вы беспокоитесь о скорости или эффективности, обратите внимание, чтоstd::arrayявляется абстракцией с нулевой стоимостью, и пока вы компилируете с оптимизацией, вы получаете тот же код сборки.