ошибка: нельзя передавать объекты нетривиально копируемого типа через ``

У меня есть класс unit, который имеет свойства

std::is_trivial<unit>::value; // true
std::is_trivially_copyable<unit>::value; // true (on compilers which have this trait)

Я хотел бы передать векторы unit в виде кортежа, например.

using geodeticTuple = std::tuple<unit, unit, unit>;

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

someOtherType convert(const geodeticTuple& point, const geodeticTuple& origin) or

someOtherType convert(const geodeticTuple& point, ...)

используя MSVC2015, это работает отлично, но с gcc-4.9.3 я получаю сообщение об ошибке:

ошибка: невозможно передать объекты нетривиально копируемого типа const geodeticTuple {aka const struct std::tuple<unit, unit, unit>} через ...

и поскольку gcc-4.9.3 не поддерживает признаки типа is_trivially_xxx, мне трудно понять, почему это не работает.

Является ли кортеж тривиальных типов не копируемым тривиально?


person Nicolas Holthaus    schedule 14.04.2016    source источник
comment
почему вы используете функцию c vararg старого стиля вместо шаблона функции с переменным числом аргументов?   -  person Piotr Skotnicki    schedule 14.04.2016
comment
У меня были проблемы, потому что, похоже, ему не нравилось отсутствие аргументов.   -  person Nicolas Holthaus    schedule 14.04.2016


Ответы (1)


Операторы присваивания tuple требуют специальной обработки для ссылочных типов, поэтому в общем случае они должны быть предоставлены пользователем.

Поскольку стандарт не требует тривиальной копируемости, вопрос QoI зависит от того, пойдут ли разработчики на дополнительную длину для предоставления этой гарантии (что потребует добавления дополнительных специализаций).

person T.C.    schedule 14.04.2016