Як я знаю, std::allocator<T>::construct
у старій версії C ++ приймаються лише два параметри; перший - вказівник на сиру, небудовану пам'ять, в якій ми хочемо побудувати об'єкт типу, T
а другий - значення типу елемента для ініціалізації цього об’єкта. Отже, викликається конструктор копій:
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;
}
Чому на C ++ 98
a.construct(p, 10)
виклик конструктора копіювання, а на C ++ 11 і вище викликає лише конструктор, який приймає ціле число?Чи означають це на C ++ 11 з - за деяку оптимізацію копіювання Elision навіть якщо конструктор
Foo(int)
єexplicit
роботою за таким викликом:a.construct(p, 5)
працює на C ++ 11 навіть конструктор ,explicit
що я впевнений , це не працює на C ++ 98 , якщоFoo(int)
єexplicit
.Якщо так, якщо я компілюю цей оператор з якоюсь відключенням
copy-elision
оптимізації, це призведе до відмови компілятора? Дякую.