临时容器元素的生命周期延长

问题描述 投票:0回答:1

通过

const
引用延长临时对象的生命周期是否也适用于临时容器的元素,例如下面程序中引用 r 的情况?
这是由 C++ 标准保证的吗?
我读到这种生命周期延长确实适用于完整对象子对象,但是标准容器的元素是否有资格作为其各自容器的子对象?

#include <unordered_map>
#include <string>
#include <iostream>

using my_map = std::unordered_map<std::string, int>;

my_map func() {
    return my_map{{"foo", 42}};
}

int main() {
    const auto& r = func()["foo"];
    std::cout << "r = " << r << std::endl; // Is r valid here?
    return 0;
}
c++ containers c++17 temporary-objects
1个回答
0
投票

不,

r
无效。 这是扩展示例代码的概念证明:

#include <unordered_map>
#include <string>
#include <iostream>


class Foo {
public:
    int value;

    Foo() : value(0) {
        value = 0;
    }
    Foo(int n) : value(n) {
    }
    ~Foo() {
        std::cout << "~Foo(" << value << ")\n";
    }
};

using my_map = std::unordered_map<std::string, Foo>;

my_map func() {
    return my_map{ {"foo", 42} };
}

int main() {
    const auto& r = func()["foo"];
    std::cout << "r.value = " << r.value << std::endl; // Is r valid here?
}

当我运行以下程序时,我得到以下结果:

~Foo(42)
~Foo(42)
r.value = -572662307    # GARBAGE OUTPUT

-572662307
是十六进制的
0xdddddddd
,这是 Visual Studio 的调试分配给尚未回收的已删除内存的内容。 所以这强烈表明
r
肯定是无效的。

© www.soinside.com 2019 - 2024. All rights reserved.