C++如何将构造生成的临时对象传递给接收引用参数的函数
报错原因说明
你遇到的报错是C的底层语法规则导致的:vec2 {10, 20} 属于临时生成的右值对象,C标准明确规定非const的左值引用不允许绑定到右值,所以参数改成vec2 &v后无法匹配到对应的函数。
无需提前构造对象的解决方案
有两种标准合规的方案可以实现按引用传递临时对象:
- 方案1:使用const左值引用接收参数
如果你的func不需要修改传入的vec2对象,这是最常用的方案:const左值引用允许绑定到右值,完全兼容临时对象传参。
struct vec2 { float x,y; }; // 修改为const左值引用 void func(const vec2 &v); int main() { func(vec2 { 10, 20 } ); // 调用正常,无报错 }
- 方案2:使用右值引用接收参数
如果你的func需要修改传入的临时对象,或者要做移动语义相关的优化,可以用右值引用作为参数类型,右值引用专门用于绑定右值对象:
struct vec2 { float x,y; }; // 修改为右值引用 void func(vec2 &&v); int main() { func(vec2 { 10, 20 } ); // 调用正常,无报错 }
注:如果一定要强制用非const左值引用绑定临时对象,语法上可以通过
const_cast强转,但这种写法不符合C++设计规范,而且临时对象的生命周期仅存在于当前调用表达式,修改后也无法保留结果,完全不推荐使用。
内容的提问来源于stack exchange,提问作者aganm
相关产品推荐
相关产品推荐

