【发布时间】:2017-03-17 03:23:28
【问题描述】:
template <typename T>
Blob<T>::Blob(std::initializer_list<T> il) try :
data(std::make_shared<std::vector<T>>(il)) {
/* empty body */
} catch(const std::bad_alloc &e) { handle_out_of_memory(e); }
C++ Primer第五版779页说
注意关键字 try 出现在构造函数开头的冒号之前 初始化器列表和形成(在这种情况下为空)构造函数的大括号之前 功能体。与此 try 关联的 catch 可用于处理异常 从成员初始化列表中或从构造函数中抛出 身体。 值得注意的是,在初始化构造函数时可能会发生异常 参数。此类异常不是函数 try 块的一部分。函数试试 块仅处理构造函数开始执行后发生的异常。作为 对于任何其他函数调用,如果在参数初始化期间发生异常,则 异常是调用表达式的一部分,并在调用者的上下文中处理。
我很困惑,想不出什么情况/什么时候发生,谁能给我 一个例子?
【问题讨论】:
-
像这样脱离上下文,很难知道“初始化构造函数的参数”是什么意思。 any 函数调用的参数必须进行评估,这可能会导致异常,特别是如果这些参数是从函数调用派生的。
-
@MarkRansom 我已经添加了更多信息,现在我想你可以知道它们的意思了。
-
您应该更改标题,您似乎是在通过成员初始化器列表询问成员的初始化,而不是关于参数初始化。类成员不是参数
-
@M.M 我的说法和书上差不多,删掉'list'这个词?我想不出更准确的表达方式。
-
@K.Robert 要点是,当您显然不是在谈论参数时,您使用的是“参数”一词。