2015-03-19 10 views
8

To pytanie dotyczy poprzedniego standardu C++ 11 (C++ 03). explicit zapobiega niejawnym konwersjom z jednego rodzaju do drugiego. Na przykład:Czy potrzebne jest jednoznaczne słowo kluczowe w przypadku konstruktora przyjmującego więcej niż jeden parametr?

struct Foo 
{ 
    explicit Foo(int); 
}; 

Foo f = 5; // will not compile 
Foo b = Foo(5); // works 

Jeśli mamy konstruktor, że trwa dwa lub więcej parametrów, co będzie explicit zapobiec? Rozumiem, że w C++ 11 zostały usztywnione inicjalizacji, więc będzie to zapobiec konstrukcje takie jak:

struct Foo 
{ 
    explicit Foo(int, int); 
}; 

Foo f = {4, 2}; // error! 

Ale w C++ 03 nie zostały usztywnione inicjalizacji, więc jaki rodzaj budowy jest explicit zapobieganie słowom kluczowym tutaj?

+1

AFAIK absolutnie nic. Po prostu łatwiej jest _ignore_ niż _forbid_. –

+0

Czy ta zmiana nie zaszła w C++ 11? –

+0

@NeilKirk Co się zmieniło? Masz na myśli to, co wskazałem w moim pytaniu (inicjalizacja klamr)? –

Odpowiedz

4

Jeśli mamy konstruktora, który ma dwa lub więcej parametrów, co zapobiegnie explicit?

Nic.

5

To może być interesujące, jeśli ktoś zmieni podpis metodę z parametrem domyślnym:

struct Foo 
{ 
    explicit Foo(int, int = 0); 
}; 

ze słowem kluczowym explicit, ty idiomatically powiedzieć, że nie zawsze chcą konstruktor zrobić niejawna konwersja.

Powiązane problemy