Như tôi biết std::allocator<T>::construct
chỉ 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 T
và 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àexplicit
cô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àexplicit
nhữ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-elision
tố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.