首页 > 解决方案 > Visual Studio:用户定义的构造函数更改对象生命周期

问题描述

考虑以下示例:

#include <iostream>

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

struct B
{
    B() {std::cout << "B()\n";}
    ~B() {std::cout << "~B()\n";}
};

template< typename T>
struct cref
{
    const T &t;
};

int main()
{
    cref<A> a{{}};
    std::cout << "---\n";
    cref<B> b{{}};
    std::cout << "---\n";
}

在 Visual Studio 2019 16.10.3 中打印

~A()
---
B()
---
~B()

这意味着对象A在构造它的同一行中被破坏,并且对象的B生命周期被延长到main函数范围的末尾。

A类和类之间的唯一区别B是在B. 它真的可以根据标准改变对象的生命周期还是只是一个编译器错误?

标签: c++visual-studiolanguage-lawyer

解决方案


推荐阅读