2016-04-14 4 views
0

Ich habe eine Klasse unit, die die Eigenschaften hatFehler: kann nicht passieren Objekte von nicht-trivialer kopierbar Typ durch `...`

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

Ich möchte sind Vektoren von unit als passieren Tupel, z

Ich brauche diese Vektoren in Konvertierungsfunktionen passierbar, die verschiedene Arten von Argumenten verwenden, z.

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

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

mit MSVC2015 funktioniert dies völlig in Ordnung, aber mit gcc-4.9.3, erhalte ich die Fehlermeldung:

error: cannot pass objects of non-trivially-copyable type const geodeticTuple {aka const struct std::tuple<unit, unit, unit>} through ...

und da gcc-4.9 .3 unterstützt nicht die is_trivially_xxx Style-Type-Eigenschaften, ich habe Probleme zu verstehen, warum dies fehlschlägt.

Ist ein Tupel von trivialen Typen nicht trivial kopierbar?

+0

Warum verwenden Sie eine alte c Vararg-Funktion anstelle einer variadischen Funktionsvorlage? –

+0

Ich hatte Probleme, weil es nicht zu mögen schien, wenn keine Argumente vorlagen. –

Antwort

1

tuple Die Copy/Move-Zuweisungsoperatoren erfordern eine spezielle Behandlung für Referenztypen, so dass sie im allgemeinen Fall vom Benutzer bereitgestellt werden müssen.

Da der Standard keine triviale Kopierbarkeit erfordert, ist es ein QoI-Problem, ob die Implementierer auf die zusätzliche Länge der Bereitstellung der Garantie zurückgreifen (was zusätzliche Spezialisierungen erforderlich machen würde).

Verwandte Themen