通过
const
引用延长临时对象的生命周期是否也适用于临时容器的元素,例如下面程序中引用 r 的情况?#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;
}
不,
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
肯定是无效的。