gpt4 book ai didi

c++ - 在构造函数中使用临时参数作为默认参数

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:41 25 4
gpt4 key购买 nike

在 C++ 中,我们可以将对象分配给非常量引用。所以这有效:

Foo &foo = Foo();

但是,C++ 不允许将临时对象分配给非常量引用。所以这是不允许的:

Bar::Bar(Foo &foo = Foo()) {}

但这是允许的

Bar::Bar(const Foo &foo = Foo()) {}

我这里有三个问题:

  1. 最后一个例子中 foo 的范围是什么?即使在构造函数退出后它是否仍然存在。根据我的阅读,如果将临时对象分配给 const 引用,它的生命周期就会被修改,在这种情况下,它会占用它分配给的引用的生命周期。默认参数的生命周期是多少,在本例中是 foo?
  2. 我在 MSVC 中尝试了第二个示例,它没有提示。我还注意到临时的生命周期仍然延长了。所以我可以在构造函数退出后使用 foo 。那是关于什么的?
  3. 我的方案需要以这种方式为构造函数提供默认参数,我将需要修改构造函数中的参数(因此我不能将其设为常量)。而且我还需要在构造函数退出后使用 foo 。适合这种情况的最佳设计是什么?

提前致谢。

最佳答案

What is the scope of foo in the last case?

foo 是一个构造函数(同样适用于常规函数)参数,因此它的生命周期在 the full expression containing the call to the constructor ends 时结束。 . 谢谢 aschepler !

What is the lifetime of the default argument, in this case foo?

您通过将默认参数绑定(bind)到 Foo const& foo 来延长默认参数的生命周期,因此它的生命周期将与其绑定(bind)的引用的生命周期相匹配,即直到构造函数体退出。

I tried the second example in MSVC and it didn't complain.

如果您将警告级别设置为/W4,它会起作用;在这种情况下,它会警告您正在使用非标准扩展。 AFAIK,语义与前一种情况相同。

My scenario demands the default argument to constructor in this manner and I will need to modify the argument in the constructor (so I cannot make it const). And I also need to use foo after the constructor has exited.

这取决于您是否要将其保存为Bar 的成员。如果是前者,使用右值引用并移动参数

Bar::Bar(Foo&& foo = Foo()) : f_(std::move(foo)) {} // f_ is a member of type Foo

否则,只需省略默认参数即可。您还可以创建两个重载以涵盖不同的情况。

关于c++ - 在构造函数中使用临时参数作为默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22258792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com