2013-06-21 20 views
11

Jaki mechanizm jest zaangażowany, jeśli po powrocie typów, które są constructible z list inicjująca, nie określił Wracam, podobnie jak w:powrocie initializer lista mechanizm

std::array<int, 3> make_array() 
{ 
    return { 1, 2, 3 }; 
} 

zamiast

std::array<int, 3> make_array() 
{ 
    return std::array<int, 3>{ 1, 2, 3 }; 
} 

Czy są jakieś kary za wydajność, jeśli zwrócę listę inicjalizatorów bez określenia typu? Czy faktycznie zwracam tablicę, która jest przekształcana w std::array?

+0

Wydaje się zbyt schludny być bez kary, prawda? ;-) Ale jestem pewien, że 'litb' jest poprawny. Jest to szczególnie użyteczne przy "jednolitej inicjalizacji": możemy używać tej notacji z niestandardowymi typami bez konieczności kodowania konstruktora wykonującego 'std :: initializer_list': kompilator domyślnie konwertuje listę usztywnioną do normalnego ctor. Tak więc, po powrocie zapisujemy powtórzenia pisania tego typu. –

Odpowiedz

16

Nie ma żadnych kar za wykonanie. Wartość powrotna jest tak skonstruowany równoważne

std::array<int, 3> x = { 1, 2, 3 }; 

Nie jest nawet pojedyncza kopia lub przenieść na przykład std::array zaangażowanych.

2

Mechanizm jest tylko konstruktor:

struct X {}; 

struct Y { 
    Y(X); 
}; 

Y f() { 
    X x; 
    return x; 
} 
+0

... jak to się ma do list inicjalizujących? –