2014-10-27 11 views
14

wpadłem na problem ponieważnie powinien std :: pair <T1,T2> mieć trywialnego domyślnego konstruktora, jeśli masz T1 i T2?

std::is_trivially_default_constructible<std::pair<T1,T2>>::value == false; 

nawet jeśli

std::is_trivially_default_constructible<T1>::value == true; 
std::is_trivially_default_constructible<T2>::value == true; 

nie udało mi się znaleźć dobry powód do tego projektu. Czy nie byłoby właściwe, aby std::pair<T1,T2> miał konstruktora =default, jeśli T1 i ?

Czy istnieje prosta praca (łatwiejsze niż zdefiniowanie własnego pair<>)?

+0

Ktoś powinien [zgłosić problem z biblioteką] (https://isocpp.org/std/submit-a-library-issue). – edmz

Odpowiedz

6

Prosta przyczyna: historia! Oryginalny std::pair<T0, T1> nie mógł mieć trywialnego domyślnego konstruktora, ponieważ miał jakiś inny konstruktor. Zostało zdefiniowane, aby zainicjować swoich członków. Zmiana tego zachowania w std::pair<T0, T1> dla trywialnie konstruktywnych typów, w których ludzie polegają na inicjowaniu wartości, byłaby przełomową zmianą.

Oprócz przyczyny historycznej, domyślny konstruktor std::pair<...> jest zdefiniowany jako konstruktor constexpr. Domyślny konstruktor constexpr nie może być domyślny.

Nie mam pojęcia o obejściu innym niż tworzenie niestandardowej klasy.

+0

Czy za pomocą krotki to naprawić? –

+0

@NeilKirk: 'std :: tuple <...>' ma domyślny domyślny konstruktor 'constexpr' (rzeczywisty,' std :: pair <...> 'domyślnym konstruktorem jest również' constexpr'; nie sądzę, że konstruktor 'constexpr' może być domyślnym). Oznacza to, że 'std :: tuple <...>' nie dostarcza trywialnego domyślnego konstruktora. –

+0

@ Neil Kirk: domyślny konstruktor constexpr tuple() ma takie same wymagania, jak w przypadku std :: pair: "... Efekty: Value inicjuje każdy element" (20.4.2.1 n3242), więc nie może nic zrobić i dlatego może nie są trywialne. – user396672

1

Domyślny konstruktor wartości std :: pair - inicjalizuje oba elementy pary, pierwszy i drugi, więc nie może być trywialny.

+0

Tak, wiem. To jest problem. – Walter

Powiązane problemy