【问题标题】:constexpr function must have one argument value?constexpr 函数必须有一个参数值?
【发布时间】:2017-02-05 00:06:17
【问题描述】:

根据this,用constexpr声明的函数必须满足几个要求,其中之一如下:

至少存在一个参数值,因此函数的调用可以是核心常量表达式的求值子表达式...

好吧,constexpr 函数可以有无参数

constexpr int Bar( /* empty */ ) { return 0xFF; }
constexpr int value = Bar(); // Valid expression

constexpr作为子例程调用的函数也不能确定整个表达式是核心常量表达式。

那么必须存在一个参数值是什么意思

[面向未来读者的更新]

显然关于constexpr function 要求的描述已经修复,因为这个问题来自:

至少存在一个参数值,因此函数的调用可以是核心常量表达式的求值子表达式...

到:

至少存在一组参数值,因此函数的调用可以是核心常量表达式的求值子表达式...

【问题讨论】:

  • 认为这意味着对于每个参数至少存在等等。
  • @MartinBonner 不,这意味着所有论点作为一个整体

标签: c++ c++11 language-lawyer constexpr


【解决方案1】:

en.cppreference.com 的引用在标准方面并不准确,真正的引用是 (§7.1.5/5):

对于既不是默认值也不是模板的constexpr 函数或constexpr 构造函数,如果不存在参数值,那么函数或构造函数的调用可能是核心常量表达式的评估子表达式 (5.20) [ ...] 程序格式错误;无需诊断。

这基本上是说必须存在一组有效的参数(空集在您的情况下是有效的)。

【讨论】:

  • 所以,他们搞砸了措辞的倒置。
  • 如果空集也被认为是有效集,我们甚至可以拥有少于one set of argument values 吗? (因为每个函数必须至少有一个集合,包括一个空集合。)我只是好奇这是否只是编写标准的一些形式。
  • @DeanSeo 您可以有少于一个 有效 组参数 - constexpr int f(std::string) 无效,因为 std::string 不能是 constexpr 所以无论 @987654328 的主体是什么@ 可能是,永远不会有一组有效的参数使 f 的调用成为常量表达式。
  • @Holt Ahh 这确实有道理。谢谢。
  • @DeanSeo(忘了一点,抱歉)空集并不总是有效 - int f() { return sqrt(pi); } 不能是 constexpr 因为空集是这里唯一可能的参数集,它不会因为sqrt而成为有效的(除非你有constexpr sqrt)。
【解决方案2】:

这里的“一个参数值”是指“一组参数”。 Nullary 函数有一个可能的参数集,即空集。

在您的情况下,这个单一的空参数集确实会导致有效的constexpr 调用,所以一切都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2022-01-27
    • 2018-08-11
    • 1970-01-01
    • 2015-03-10
    • 2017-07-30
    相关资源
    最近更新 更多