带有默认参数构造的noexcept说明符

时间:2018-05-10 12:47:26

标签: c++ language-lawyer noexcept

采用以下示例代码:

void test(const Item& item = Item()) {
   ...
}

假设,一旦item传递给函数,就不会抛出。

问题是:该功能应标记为noexceptnoexcept(noexcept(Item()))

IHMO,前者应该没问题,但我不确定。非常感谢标准的报价!

1 个答案:

答案 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是   被认为是在调用函数的表达式中创建的,而不是定义默认值的表达式   参数