constexpr void函数被拒绝

use*_*075 12 c++ return-type language-lawyer constexpr c++14

我有这个非常简单的功能,无法编译.

constexpr void func()
{
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

error: invalid return type 'void' of constexpr function 'constexpr void func()'

     constexpr void func()
Run Code Online (Sandbox Code Playgroud)

在C++ 14中,void是一个文字类型[§3.9/ 10]:

类型是文字类型,如果它是:

  • 无效; 要么
  • 标量类型; 要么
  • 参考类型; 要么
  • 一个文字类型的数组; 要么
  • 具有以下所有属性的类类型(第9节):
    • 它有一个简单的析构函数,
    • 它是聚合类型(8.5.1)或至少有一个constexpr构造函数或构造函数模板,它不是复制或移动构造函数,并且
    • 它的所有非静态数据成员和基类都是非易失性文字类型.

有人能解释为什么这是无效的吗?

use*_*075 8

提出void字面类型的提议是n3652放宽对constexpr功能的约束.G ++决定将此功能推向第5版(我使用的是4.9.2):

G ++现在支持C++ 14扩展constexpr.

constexpr int f (int i)
{
  int j = 0;
  for (; i > 0; --i)
    ++j;
  return j;
}

constexpr int i = f(42); // i is 42
Run Code Online (Sandbox Code Playgroud)

自版本3.4以来,Clang已经实现了这一功能.


Col*_*mbo 6

它确实有效,但在海湾合作委员会尚未得到支持.标准中的一个例子实际上包括constexpr返回的函数void- 参见[dcl.constexpr]/1:

constexpr void square(int &x); // OK: declaration
 // [..]
constexpr void square(int &x) { // OK: definition
    x *= x;
}
Run Code Online (Sandbox Code Playgroud)

使用Clang的Coliru示例,符合此处.