C++ constexpr无效函数被拒绝

C++ constexpr无效函数被拒绝,c++,language-lawyer,c++14,return-type,constexpr,C++,Language Lawyer,C++14,Return Type,Constexpr,我有一个非常简单的函数,它不会编译 constexpr void func() { } 我得到的错误是: error: invalid return type 'void' of constexpr function 'constexpr void func()' constexpr void func() 在C++14中,void是一种文字类型[§3.9/10]: 如果类型是: 空虚;或 标量类型;或 参考类型;或 文字类型的数组;或 具有以下所有属性的类类型(第9条): 它

我有一个非常简单的函数,它不会编译

constexpr void func()
{
}
我得到的错误是:

error: invalid return type '
void
' of
constexpr
function '
constexpr void func()
'
constexpr void func()
在C++14中,
void
是一种文字类型[§3.9/10]:

如果类型是:

  • 空虚;或
  • 标量类型;或
  • 参考类型;或
  • 文字类型的数组;或
  • 具有以下所有属性的类类型(第9条):
    • 它有一个小的析构函数
    • 它是聚合类型(8.5.1),或至少有一个
      constexpr
      构造函数或不是复制或移动构造函数的构造函数模板,以及
    • 它的所有非静态数据成员和基类都是非易失性文本类型

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

提出了一种文字类型的建议。G++决定将此功能推到版本(我使用的是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

Clang从3.4版开始就实现了这一点。

它确实有效,但在GCC中还不受支持。标准中的一个示例实际上包括返回
void
constexpr
函数-请参见[dcl.constexpr]/1:

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

使用Culon,这里符合。

< P>从C++程序语言(第四版):

constexpr函数可能没有副作用

那么,constexpr void函数的用途是什么

如果您的目标是这样做:

constexpr void Twice(int &a)
{
    a *= 2;
}
你应该考虑改为:

constexpr int Twice(int a)
{
    return 2 * a;
}

引用C++14之后的工作草案的可能重复对于证明C++14的事实不是很有用。目的?简单,例如:模板constexpr void requireIntegral(){static_assert(std::is_integral::value,“类型必须是整数”);};你说得对,说得好。从未想过以这种方式使用constexpr函数。