2016-03-08 12 views
5

Podczas realizacjistd::experimental::optional (cppreference.com) Ja irytować w specyfikacji konkretnego konstruktora, a mianowicie:std :: eksperymentalny :: opcjonalny <T> realizacja: Constexpr konstruktor zamieszanie

constexpr optional(const T& value); // (4) 

(Source)

Ten konstruktor umożliwia utworzenie w kontekście optional<T> dla typu łatwego do zniszczenia T w kontekście constexpr. Podczas gdy pierwszy wymóg, a mianowicie wyłączenie dostarczonego przez użytkownika destruktora w tym przypadku, aby ustawić optional<T> jako literał, jest prosty do rozwiązania, nie wiem, jak obejść ograniczenie w zakresie miejsca-nowe nie jest dozwolone w constexpr .

Myślałem, że mam zaimplementować optional<T> przy użyciu std::aligned_storage<T>, aby umożliwić typom T, które nie są domyślnie możliwe do skonstruowania i spełniają ewentualne wymagania dotyczące wyrównania. Ale jak już powiedziałem, constexpr zabrania mi stosowania nowego miejsca docelowego w tym konkretnym konstruktorze.

Czy muszę dużo kawy i nie widzę tutaj oczywistego rozwiązania?

Dziękuję

+0

Możliwy duplikat [Jak używać std :: opcjonalnie?] (Http://stackoverflow.com/questions/16860960/how-should-one- use-stdoptional) – Matriac

+2

@Matriac to jest pytanie dotyczące strony implementacji. – nshct

+1

"Uzwiązek" może działać dla tego konkretnego konstruktora, ale nie jestem pewien, czy wystarczy obsłużyć wszystkie przypadki. – hvd

Odpowiedz

4

nie wiem jak obejść ograniczenia umieszczania nowe nie są dozwolone w constexpr.

To jest poprawny typ diagnostyczny, literalny, constexpr i nowe wyrażenia nie mieszają się. Najprostszym sposobem na spełnienie różnych wymagań std::experimental::optional<T> jest wdrożenie go z wariantowymi członkami. Mówiąc wprost, w pewnym momencie musi się zaangażować union. Szybki szkic:

template<typename Val> 
struct optional { 
    union { 
     Val optional_value; 
     unsigned char dummy_byte; 
    }; 
    bool filled; 

    // post-condition: no-value state 
    constexpr optional() 
     : dummy_byte {} 
     , filled(false) 
    {} 

    // post-condition: has-value state 
    constexpr optional(Val const& val) 
     : optional_value(val) 
     , filled(true) 
    {} 

    // other special members omitted for brevity 
}; 

Live On Coliru

W rzeczywistości, stara seria optional propozycji wykorzystywane do have a paragraph on the technique w celu wykazania, że ​​wymagania to wysunięte były rozsądne w ogóle. (W dzisiejszych czasach std::experimental::optional funkcjonuje w różnych bazach danych bibliotek Fundamentals).

+0

Dziękuję. Nie wiem, dlaczego byłem tak skoncentrowany na złączeniu ze złączem, ale to jest poprawne rozwiązanie. – nshct

Powiązane problemy