【发布时间】:2014-03-07 19:16:10
【问题描述】:
在 C++ 中,我们可以将对象分配给非常量引用。所以这行得通:
Foo &foo = Foo();
但是,C++ 不允许将临时值分配给非常量引用。所以这是不允许的:
Bar::Bar(Foo &foo = Foo()) {}
但这是允许的
Bar::Bar(const Foo &foo = Foo()) {}
我在这里有三个问题:
- 最后一种情况下 foo 的范围是什么?即使在构造函数退出后它仍然存在。根据我的阅读,如果将临时对象的生命周期分配给 const 引用,则它的生命周期会被修改,在这种情况下,它会占用引用的生命周期。默认参数(在本例中为 foo)的生命周期是多少?
- 我在 MSVC 中尝试了第二个示例,它没有抱怨。我还注意到临时的寿命仍然延长。所以我可以在构造函数退出后使用 foo 。这是关于什么的?
- 我的场景要求以这种方式为构造函数提供默认参数,我需要修改构造函数中的参数(所以我不能将其设为 const)。而且我还需要在构造函数退出后使用 foo 。满足这种情况的最佳设计是什么?
提前致谢。
【问题讨论】:
-
Foo &foo = Foo();这肯定行不通。 -
@dyp 除非您使用的是 MSVC。它有一个扩展,允许临时绑定到非常量引用。
-
@Angew 是的,使用
/Za。不幸的是,如果没有这些扩展,许多 Microsoft 标头将无法编译。 -
顺便说一下,“范围”是源代码中可以使用名称来引用声明的部分; “生命周期”是从构造函数完成到析构函数启动结束的运行时间。