ฉันกำลังสร้างคลาสของการผูกมัดประเภทเช่นตัวอย่างเล็ก ๆ ด้านล่าง ดูเหมือนว่าเมื่อการเชื่อมโยงสมาชิกฟังก์ชันแล้วตัวสร้างการคัดลอกจะถูกเรียกใช้ มีวิธีกำจัด call constructor ของการคัดลอกหรือไม่? ในตัวอย่างของเล่นของฉันด้านล่างเป็นที่ชัดเจนว่าฉันกำลังจัดการกับขมับเท่านั้นและดังนั้นจึงมี "ควร" (อาจไม่ได้ตามมาตรฐาน ตัวเลือกที่ดีที่สุดอันดับที่สองคือการคัดลอกตัวเลือกจะเป็นตัวสร้างการย้ายที่จะถูกเรียก แต่ไม่ใช่ในกรณีนี้
class test_class {
private:
int i = 5;
public:
test_class(int i) : i(i) {}
test_class(const test_class& t) {
i = t.i;
std::cout << "Copy constructor"<< std::endl;
}
test_class(test_class&& t) {
i = t.i;
std::cout << "Move constructor"<< std::endl;
}
auto& increment(){
i++;
return *this;
}
};
int main()
{
//test_class a{7};
//does not call copy constructor
auto b = test_class{7};
//calls copy constructor
auto b2 = test_class{7}.increment();
return 0;
}
แก้ไข: คำชี้แจงบางอย่าง 1. สิ่งนี้ไม่ได้ขึ้นอยู่กับระดับการปรับให้เหมาะสม 2. ในรหัสจริงของฉันฉันมีวัตถุที่ซับซ้อน (เช่นจัดสรรฮีป) มากกว่า ints
auto b = test_class{7};
ไม่เรียกตัวสร้างสำเนาเนื่องจากจริง ๆ แล้วเทียบเท่าtest_class b{7};
และคอมไพเลอร์ฉลาดพอที่จะรับรู้กรณีนี้และสามารถคัดลอกได้อย่างง่ายดาย b2
สามารถเดียวกันไม่ได้ทำเพื่อ
std::cout
) ในสำเนา ctor ของคุณหรือไม่? ก็ไม่มีควรคัดลอกควรปรับให้เหมาะสม