【发布时间】:2019-04-08 20:08:27
【问题描述】:
我有一些 (C++14) 代码如下所示:
map<int, set<string>> junk;
for (int id : GenerateIds()) {
try {
set<string> stuff = GetStuff();
junk[id] = stuff;
} catch (const StuffException& e) {
...
}
}
这行得通。有时GetStuff() 会抛出一个异常,这很好,因为如果是这样,那么我不想要垃圾映射中的值。
但一开始我是在循环中写的,这不起作用:
junk[id] = GetStuff();
更准确地说,即使GetStuff() 抛出异常,junk[id] 也会被创建(并分配一个空集)。
这不是我所期望的:我希望它们以相同的方式运行。
这里有没有我误解的C++原理?
【问题讨论】:
-
只是为了澄清未来有类似问题的读者:这里没有分配。
junk[id]创建一个新的set,是的,但那是使用默认构造函数。这就是为什么集合是空的。如果GetStuff()成功,则此空集将用作要分配的对象。但是抛出的异常正是没有分配发生的原因。该集保留在其默认状态。它是一个适当的 C++ 对象,您可以正常调用它的成员。 IE。junk[id].size()之后将为 0。 -
@MSalters 很好的说明!我使用“分配”过于松散(但“默认构造”对于问题标题可能有点沉重;-)。
-
为了更安全(和更高效),分配应该是
junk[id] = std::move(stuff);。