采用以下示例代码:
void test(const Item& item = Item()) {
...
}
假设,一旦item
传递给函数,就不会抛出。
问题是:该功能应标记为noexcept
或noexcept(noexcept(Item()))
?
答案 0 :(得分:14)
默认参数是函数调用者的快捷方式。因此,当函数执行时,构造已经完成。
因此,noexcept
就足够了。
在standard [dcl.fct.default]中声明:
如果在参数声明中指定了initializer子句 initializer-clause用作默认参数。默认参数将用于缺少尾随参数的调用中。
实施例: 声明
void point(int = 3, int = 4);
声明一个可以使用类型为int的零个,一个或两个参数调用的函数。它可以被称为 任何这些方式:point(1,2);
point(1);
point();
最后两个调用相当于 分别为point(1,4)
和point(3,4)
。
还有一个注释(在[intro.execution]程序执行中):
评估默认参数(8.3.6)所涉及的Subexpressions是 被认为是在调用函数的表达式中创建的,而不是定义默认值的表达式 参数