constexpr和函数体=删除:目的是什么?

时间:2016-10-13 21:16:40

标签: c++ c++11 constexpr

根据[dcl.constexpr/3]

  

constexpr功能的定义应满足以下要求:
  [...]
   - 它的函数体应为= delete,= default或[...]

这意味着以下类片段有效:

struct S {
    constexpr void f() = delete;
};

删除constexpr功能的目的是什么? 定义它constexpr有什么好处?

我无法找出任何理由,但事实上可能更容易允许它而不是禁止它在标准中。

2 个答案:

答案 0 :(得分:3)

这是基于CWG 1199。 DanielKrügler写道:

  

在多个配置中使用单个代码的情况下允许使用此表单可能很有用,其中一些代码的功能为constexpr而其他功能已删除;必须更新函数的所有声明以删除constexpr说明符是不必要的繁重。

答案 1 :(得分:1)

我猜这个目的与任何=delete

相同

如果您从一个类继承,但不希望该函数在子类中可用。

E.g:

class P{
    public:
    constexpr int foo(){return 42;}

};

class C : public P{
    public:
    constexpr int foo() = delete; //(*)
};

int main() {
    P p;
    cout << p.foo(); //ok

    C c;    
    cout << c.foo(); //Compiler error only if line (*) is present.
    return 0;
}

即使我现在无法告诉你它有用的地方 - 但我现在也看不出任何理由为什么它应该被禁止。