2015-02-04 15 views
6

Here jest opisane nullopt_t i nullopt dla obiektu optional proponowanej dla C++:eksperymentalny :: opcjonalnie konstruktor nullopt_t

struct nullopt_t{see below}; 
constexpr nullopt_t nullopt(unspecified); 

[...] Rodzaj nullopt_t nie powinien mieć konstruktora domyślnego. Jest to typ literalny typu . Stała nullopt zostanie zainicjalizowana argumentem typu literalnego.

Powodem tego jest wyjaśnione w The op = {} syntax rozdziału dokumentu: dla op = {} być jednoznaczna kilka sztuczek muszą zostać przyjęte, z których jeden jest to, że nie musi być nullopt_t domyślny constructible.

Moje pytanie dotyczy tego, co oznacza tutaj typ literalny? Znalazłem to SO post. Tak więc wygląda na to, że zrobiłaby to tylko inna pusta klasa. Czy może to być również konstruktor, który bierze int?

Jak wyglądałaby minimalnie zgodna klasa nullopt_t?

coś takiego:

struct nullopt_t_construct_tag_t{}; 

struct nullopt_t { 
    nullopt_t() = delete; // I know declaring it as deleted is redundant 
    constexpr nullopt_t(nullopt_t_construct_tag_t) {}; 
}; 

constexpr nullopt_t nullopt(nullopt_t_construct_tag_t{}); 

Albo to:

struct nullopt_t { 
    nullopt_t() = delete; 
    constexpr nullopt_t(int) {}; 
}; 

constexpr nullopt_t nullopt(0); 

Odpowiedz

5

Minimalny realizacja jest

struct nullopt_t { 
    constexpr nullopt_t(int) {} 
}; 

Nie domyślny konstruktor zostanie ogłoszony w sposób dorozumiany, [class.ctor]/4:

Jeśli nie ma konstruktora deklarowanego przez użytkownika dla klasy X, konstruktor bez parametrów domyślnie jest zadeklarowany jako domyślny (8.4).

... i nullopt_t może być zbudowany z int, typu dosłownego.
Należy zauważyć, że w kodzie istnieje domyślny konstruktor, chociaż jest on zdefiniowany jako usunięty.

Powyższa definicja nie spełnia wymagań co do rodzaju dosłownym:

typ jest dosłownym typu jeśli jest to:
(10.5), - typu klasy (Rozdział 9) który ma wszystkie o następujących własnościach:

  • ma trywialne destructor
  • to jest typu kruszywo (8.5.1) lub posiada co najmniej jeden constexpr konstruktora [..], że nie jest konstruktem kopiowania ani przenoszenia, a wszystkie jego niestatyczne elementy danych i klasy bazowe są nieulotnymi typami literałów.
+0

Czy ten bieg w kwestii jakości wykonania, gdzie 'int' jest przekazywana do opcjonalna i jest konwertowany do' nullopt_t' i wykorzystane do skonstruowania opcjonalny i spowodować nieoczekiwane rzeczy? – Yakk

+0

@Yakk Jeśli typ wartości opcjonalnej może zostać skonstruowany z int, wówczas rozdzielczość przeciążenia zapewni, że wybrany zostanie prawy konstruktor (szablon). Jeśli nie ... To masz rację. Podkreślenie powyższego konstruktora powinno rozwiązać ten problem. – Columbo

Powiązane problemy