constexpr功能的定义应满足以下要求:
[...]
- 它的函数体应为= delete,= default或[...]
这意味着以下类片段有效:
struct S {
constexpr void f() = delete;
};
删除constexpr
功能的目的是什么?
定义它constexpr
有什么好处?
我无法找出任何理由,但事实上可能更容易允许它而不是禁止它在标准中。
答案 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;
}
即使我现在无法告诉你它有用的地方 - 但我现在也看不出任何理由为什么它应该被禁止。