constexpr void函数被拒绝

时间:2015-03-25 16:31:20

标签: 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条):   
        
    • 它有一个简单的析构函数,
    •   
    • 它是聚合类型(8.5.1)或至少有一个constexpr构造函数或构造函数模板,它不是复制或移动构造函数,并且
    •   
    • 它的所有非静态数据成员和基类都是非易失性文字类型。
    •   
  •   

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

3 个答案:

答案 0 :(得分:7)

使void为文字类型的提案为n3652 Relaxing constraints on constexpr functions。 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

Clang从版本3.4开始实现。

答案 1 :(得分:6)

确实有效,但GCC尚未支持。标准中的示例实际上包括返回constexpr的{​​{1}}函数 - 请参阅[dcl.constexpr] / 1:

void

Example on Coliru使用Clang,符合此处。

答案 2 :(得分:2)

取自 C ++ Programmig语言(第4版)

  

constexpr功能可能没有副作用。

那么,constexpr void函数的目的是什么?

如果你打算做那样的事情:

constexpr void Twice(int &a)
{
    a *= 2;
}

您应该考虑更改为:

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