Проблема здесь в том, что когда тип выводится непосредственно из списка фигурных скобок инициализации, выведенный тип является специализацией std::initializer_list
, а std::initializer_list
разрешает const
только доступ к его элементам.
Более подробно, ваш оператор for
на основе диапазона похож на цикл:
{
auto&& range = {args...}; // std::initializer_list<int>&&
auto iter = range.begin(); // const int*
auto end = range.end(); // const int*
for (; iter != end; ++iter) {
auto& arg = *iter; // const int&
iss >> arg; // ERROR
}
}
, поскольку std::initializer_list<T>::iterator
равен const T*
.
Вам понадобитсядля более точной обработки параметров функции.
Как отмечено в комментариях, если вы используете C ++ 17 (или более позднюю версию), вы можете использовать выражение сгиба.
{
std::istringstream iss(line);
(iss >> ... >> args);
}
Еслииспользуя C ++ 11 или C ++ 14, вместо этого можно использовать трюк инициализации фиктивного массива:
{
std::istringstream iss(line);
// Note (expr, 0) to discard expression result and supply int
// for the array, and final 0 in case sizeof...(args)==0
int dummy[] = { (iss >> args, 0)..., 0 };
static_cast<void>(dummy); // avoid unused variable warning
}