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

Posted

技术标签:

【中文标题】constexpr 和函数体 = 删除:目的是啥?【英文标题】:constexpr and function body = delete: what's the purpose?constexpr 和函数体 = 删除:目的是什么? 【发布时间】:2016-10-13 21:16:40 【问题描述】:

根据[dcl.constexpr/3]:

constexpr 函数的定义应满足以下要求: [...] - 其函数体应为 = delete、 = 默认或 [...]

这意味着下面的类 sn-p 是有效的:

struct S 
    constexpr void f() = delete;
;

删除constexpr 函数的目的是什么? 如果有的话,定义它constexpr 有什么好处?

我想不出任何原因,但事实上在标准中允许它比禁止它更容易。

【问题讨论】:

delete任何函数都是禁用特定过载的简单方法。我想它也应该应用于constexpr 系列函数。 constexpr 对于返回 void 的函数也很有趣 @Jarod42 Touché。用于创建一个 mvce,这对它来说很好,但它确实很有意义。 【参考方案1】:

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

如果在多个配置中使用单个代码,其中一些函数是constexpr,而其他函数被删除,则允许这种形式可能很有用;必须更新函数的所有声明以删除 constexpr 说明符是不必要的繁重。

【讨论】:

迟早你必须教我如何搜索问题。我从来没有设法找出我在找什么!!也就是说,我无法弄清楚这种情况。你能提供一个最小的例子吗? @skypjack 不确定,tbh。 可能example ?【参考方案2】:

我猜目的和=delete一样:

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

例如:

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;

尽管我现在不能告诉你它在哪里有用 - 但我现在也看不出有什么理由应该禁止它。

【讨论】:

即使您从C 中删除constexpr,结果也是一样的。

以上是关于constexpr 和函数体 = 删除:目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将函数指针分配给 constexpr 结构中的 typedef 函数的正确 C++ 方法是啥?

“constinit”和“constexpr”之间的真正区别是啥? [复制]

C语言中函数和函数体的区别是啥?

以 constexpr 和不带 constexpr 的形式运行函数

在引用定义中使用 constexpr 和 const

函数内的静态 constexpr 变量是不是有意义?