Bildiğim gibi std::allocator<T>::construct
C ++ eski sürümünde sadece iki parametre alır; birincisi, türünde bir nesne oluşturmak istediğimiz ham, yapılandırılmamış belleğin bir göstergesidir T
ve ikincisi, o nesneyi başlatmak için öğe türünün bir değeridir. Böylece kopya oluşturucu çağrılır:
struct Foo {
Foo(int, int) { cout << "Foo(int, int)" << endl; }
/*explicit*/ Foo(int) { cout << "Foo(int)" << endl; }
Foo(const Foo&) { cout << "Foo(const Foo&)" << endl; }
};
int main(int argc, char* argv[]) {
allocator<Foo> a;
Foo* const p = a.allocate(200, NULL); // second parameter is required on C++98 but on C++11 it is optional
// Foo* const p = a.allocate(200); // works fine on C++11 but not on C++98
a.construct(p, 5, 7); // works on C++ 11 and up but not C++98
a.construct(p, 10);// works on both
a.destroy(p);
a.destroy(p + 1);
a.deallocate(p, 200);
std::cout << std::endl;
}
Neden C ++ 98
a.construct(p, 10)
kopyalama yapıcısı çağırıyor ama C ++ 11 ve üzeri sadece bir tamsayı alan yapıcı çağırıyor?Çünkü yapıcı olsa bile bazı Kopya elision optimizasyonu 11 C ++ bu anlamına mı geliyor
Foo(int)
iseexplicit
bu tür çağrı çalışır:a.construct(p, 5)
C eserler ++ 11 hatta yapıcı olduğunuexplicit
o ++ 98 ise C çalışır vermez değildir eminim neyiFoo(int)
olduğunuexplicit
.Eğer öyleyse ben bu deyimi bir tür
copy-elision
optimizasyon devre dışı bırakma ile derlerseniz derleyici başarısız olur? Teşekkür ederim.