为何Entity e = Entity(8)这种初始化方式关联拷贝构造函数?
问题解答
首先要明确:你写的Entity e = Entity(8);属于拷贝初始化语法,而非直接初始化,这就是它会牵扯到拷贝构造函数的核心原因。
1. 拷贝初始化的语法逻辑
C++标准规定,T obj = expr;形式的初始化,执行流程是:
- 先将
expr转换为T类型对象(这里Entity(8)已经是一个临时Entity对象) - 再调用拷贝构造函数,把这个临时对象拷贝到
obj的内存空间中
所以哪怕你主观上想调用带int参数的构造函数,语法层面这个写法会要求编译器调用拷贝构造函数来完成初始化。
2. 为什么会报错?
你的拷贝构造函数参数是Entity &e——这是非const的左值引用,而Entity(8)生成的临时对象属于右值。C++语法明确禁止:右值不能绑定到非const的左值引用,这就是你看到cannot bind non-const lvalue reference...错误的原因。
当你把拷贝构造函数改成Entity(const Entity &e)后,const左值引用允许绑定右值,编译自然就能通过了。
3. 为什么实际运行可能看不到"copy"输出?
现代编译器会做返回值优化(RVO),它会直接把临时对象Entity(8)的构造过程放在e的内存空间里,跳过拷贝构造函数的调用。但要注意:这只是编译器的优化,语法上仍然要求代码必须有合法可用的拷贝构造函数,否则编译阶段就会报错,根本到不了运行环节。
4. 如何直接调用带int参数的构造函数?
如果你想绕开拷贝初始化的逻辑,直接调用目标构造函数,改用直接初始化的写法即可:
// 直接初始化,直接调用Entity(int) Entity e(8); // 或者C++11及以后的列表初始化,同样直接调用目标构造函数 Entity e{8};
内容的提问来源于stack exchange,提问作者weizao
相关产品推荐
相关产品推荐

