C++能否将默认构造函数实例作为引用参数的默认值?
解决方案
你给出的代码无法编译的核心原因是:C++中临时对象(比如Foo()创建的匿名对象)不能绑定到非const的左值引用。要实现你的需求,有以下几种可行方案:
1. 使用const左值引用
如果函数不需要修改传入的Foo对象,将参数改为const Foo&即可合法绑定临时对象,代码如下:
void g(const Foo &f = Foo()) {}
2. 使用右值引用(C++11及以上)
若函数需要修改这个默认的临时对象,可改用右值引用,它专门用于绑定临时对象:
void g(Foo &&f = Foo()) {}
3. 静态全局对象作为默认值
如果必须使用非const的左值引用,可以提前创建一个静态Foo实例作为默认值:
static Foo default_foo; void g(Foo &f = default_foo) {}
注意静态对象的生命周期贯穿整个程序运行期,需要考虑线程安全和对象状态的复用问题。
内容的提问来源于stack exchange,提问作者yasgur99
相关产品推荐
相关产品推荐

