Như tôi biết std::allocator<T>::constructchỉ mất hai tham số trên phiên bản cũ hơn của C ++; đầu tiên là một con trỏ tới bộ nhớ thô, không được xây dựng trong đó chúng ta muốn xây dựng một đối tượng có kiểu Tvà thứ hai là một giá trị của kiểu phần tử để khởi tạo đối tượng đó. Vì vậy, trình xây dựng sao chép được gọi:
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;
}
Tại sao trên C ++ 98
a.construct(p, 10)gọi hàm tạo sao chép nhưng trên C ++ 11 trở lên chỉ gọi hàm tạo có số nguyên?Điều này nghĩa là trên C ++ 11 vì một số tối ưu hóa Copy-sự bỏ bớt ngay cả khi các nhà xây dựng
Foo(int)làexplicitcông trình theo yêu cầu như:a.construct(p, 5)công trình trên C ++ 11 thậm chí các nhà xây dựng làexplicitnhững gì tôi chắc chắn là nó không hoạt động trên C ++ 98 nếuFoo(int)làexplicit.Nếu vậy thì nếu tôi biên dịch câu lệnh đó với một số loại
copy-elisiontối ưu hóa vô hiệu hóa sẽ khiến trình biên dịch bị lỗi? Cảm ơn bạn.