ฉันรู้ว่า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 เนื่องจากการเพิ่มประสิทธิภาพการคัดลอกบางส่วนแม้ว่าตัวสร้าง
Foo(int)
จะexplicit
ทำงานในการโทรดังกล่าว:a.construct(p, 5)
ทำงานบน C ++ 11 แม้ตัวสร้างคือexplicit
สิ่งที่ฉันแน่ใจว่ามันไม่ทำงานบน C ++ 98 ถ้าเป็นFoo(int)
explicit
ถ้าเป็นเช่นนั้นถ้าฉันรวบรวมคำสั่งที่มีการ
copy-elision
เพิ่มประสิทธิภาพการปิดการใช้งานบางประเภทจะทำให้คอมไพเลอร์ล้มเหลว? ขอบคุณ.