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”之间的真正区别是啥? [复制]