【问题标题】:Is a defaulted constructor/assignment noexcept/constexpr by default?默认情况下是默认构造函数/赋值 noexcept/constexpr 吗?
【发布时间】:2016-03-22 17:24:33
【问题描述】:

所以,我的问题很简单:

将默认的类构造函数指定为noexceptconstexpr(或任何其他你可以做的事情)有什么意义吗?

struct foo
{
   foo() = default;
   // vs
   constexpr foo() noexcept = default;

   // same thing would apply for copy/move ctors and assignment operators
};

两者的行为方式是否相同?

是否取决于类是否为 POD? 例如,对于上面的示例,两者的行为方式相同,而例如,如果我有一个使用课堂分配的私有成员 std::vector<int> v = { 1, 2, 3, 4 };,则默认情况下 foo() = default; 不会是 noexcept 而不是 constexpr

通过编写foo() = default;,编译器是否只会选择最佳版本:noexcept(如果可能)和constexpr(如果可能)等等?

【问题讨论】:

    标签: c++ c++11 c++14


    【解决方案1】:

    [dcl.fct.def.default]/2-3:

    2 未定义为已删除的显式默认函数可能 仅当它被隐式声明时才被声明为constexpr 作为constexpr。如果一个函数在它的第一个显式默认值 声明,

    • 如果隐式声明是,则隐式认为是constexpr,并且,
    • 它具有与隐式声明 ([except.spec]) 相同的异常规范。

    3 如果一个显式默认的函数被声明为 exception-specification 与 ([except.spec]) 不兼容 隐式声明的异常规范,则

    • 如果函数在其第一个声明中显式默认,则将其定义为已删除;

    • 否则,程序格式错误。

    换句话说,foo() = default; 必然是foo 的默认构造函数的第一个声明,它将是“constexpr if possible”和“noexcept if possible”。显式写constexprnoexcept 还是有用的;它的意思是“如果不能是constexpr/noexcept,就对我大喊大叫”。

    【讨论】:

    猜你喜欢
    • 2016-06-17
    • 2016-07-23
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2011-06-07
    • 2013-09-10
    • 2020-11-22
    相关资源
    最近更新 更多