gpt4 book ai didi

c++ - 临时生命周期延长和隐式转换为 const 引用

转载 作者:行者123 更新时间:2023-12-03 06:55:12 24 4
gpt4 key购买 nike

通常,将临时对象绑定(bind)到本地 const& 会延长临时对象的生命周期,直到引用范围结束:

struct Foo { void DoSomething() const; };
Foo Make();

const Foo& foo = Make(); // compiles
foo.DoSomething(); // ok, lifetime of foo was extended

但是当涉及到隐式转换时,就不是这样了:

struct Foo { void DoSomething(); };
struct Bar { operator const Foo&() const; };
Bar Make();

const Foo& foo = Make(); // compiles calling the implicit conversion operator
foo.DoSomething(); // not ok, temporary Bar has been destroyed

这实际上是 C++ 标准中指定的内容吗?这是故意的吗?将此类隐式转换运算符声明为 const& 是否合法? (另一个问题是应该如何实现转换运算符。在这种情况下,它需要涉及一个 reinterpret_cast 依赖于 FooBar兼容的二进制表示,这可能是未定义的行为。在 C++20 中,可能会使用 bit_cast?但是假设 Foo 派生自 Bar,可以使用 static_cast,移除未定义的行为并且情况不会改变)。

最佳答案

Is this intended?

是的。 lifetime临时 Bar 的生命周期不会延长到 foo 的生命周期。

In general, the lifetime of a temporary cannot be further extended by "passing it on": a second reference, initialized from the reference to which the temporary was bound, does not affect its lifetime.

也就是说,临时绑定(bind)到引用的生命周期会延长。在这种情况下,Make() 返回的临时 Bar 没有直接绑定(bind)到 foo

关于c++ - 临时生命周期延长和隐式转换为 const 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64221016/

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