W języku C++ 98 prototyp konstruktora wypełniania std::vector
ma domyślną wartość dla inicjalizatora.Dlaczego C++ 11 usunął domyślną wartość z prototypów konstruktora wypełnienia std :: vector?
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
C++ 11 wykorzystuje dwa prototypy.
explicit vector (size_type n);
vector (size_type n, const value_type& val,
const allocator_type& alloc = allocator_type());
(w C++ 14 konstruktor wypełnienie znowu zmienił, ale to nie o to chodzi z tym pytaniem.)
Link odniesienia jest here.
Dlaczego C++ 11 wycofał domyślną wartość inicjatora value_type()
?
Przy okazji, próbowałem skompilować następujący kod z clang++ -std=c++11
i wystąpił błąd, co oznacza, że typ wartości nadal musi mieć domyślny konstruktor, taki jak S() {}
, tj. Być domyślnie konstruktywny.
#include <vector>
struct S {
int k;
S(int k) : k(k) {} // intentionally remove the synthesized default constructor
};
int main() {
std::vector<S> s(5); // error: no matching constructor
}
Przykład pokazany na końcu nie działałby wcześniej przed C++ 11, ponieważ 'S' nie jest domyślnie konstruktywny. A C++ 11 nie * zniszczył * domyślnej wartości, że pojedynczy konstruktor został zastąpiony przez dwa inne. – Praetorian
Domyślne wartości są złe. –
@Praetorian tak, powinienem powiedzieć, że C++ 11 * usunięto * domyślną wartość z prototypów konstruktora. – user8385554