微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 中引用成员默认初始值设定项的生命周期是多少?

如何解决C++ 中引用成员默认初始值设定项的生命周期是多少?

请考虑这个简短的代码示例:

#include <iostream>

struct A
{
    A() { std::cout << "A() "; }
    ~A() { std::cout << "~A() "; }
};

struct B { const A &a = A(); };

int main()
{
    B x;
    std::cout << ". ";
    auto y = B();
    std::cout << ". ";
    auto z = B{};
    std::cout << ". ";
}

GCC 在此处打印 (https://gcc.godbolt.org/z/a83bn54qT):

A() ~A() . A() ~A() . A() . ~A() 

意味着Axy对象初始化引用的生命周期很短,但在z中生命周期延长到作用域结束。

能否从 C++ 标准的角度解释一下为什么会这样?

解决方法

由于代码格式错误,无法保证生命周期延长。

[class.base.init]/11

从默认值绑定到引用成员的临时表达式 成员初始值设定项格式错误。 [示例 8:

struct A {
  A() = default;        // OK
  A(int v) : v(v) { }   // OK
  const int& v = 42;    // OK
};
A a1;                   // error: ill-formed binding of temporary to reference
A a2(1);                // OK,unfortunately

——结束示例]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。