constexpr函数的主体不是return语句

时间:2017-07-14 07:28:30

标签: c++ function c++11 constexpr return-type

在以下程序中,我在return中添加了一个显式func()语句,但编译器给出了以下错误:

m.cpp: In function ‘constexpr int func(int)’:
m.cpp:11:1: error: body of constexpr function ‘constexpr int func(int)’ not a return-statement
 }

这是代码:

#include <iostream>
using namespace std;

constexpr int func (int x);

constexpr int func (int x) 
{
    if (x<0)                
        x = -x;
    return x; // An explicit return statement 
}

int main() 
{
    int ret = func(10);
    cout<<ret<<endl;
    return 0;
}

我使用以下命令在 g ++ 编译器中编译了程序。

g++ -std=c++11 m.cpp

我在功能中添加了return语句,然后为什么我遇到了上述错误?

2 个答案:

答案 0 :(得分:12)

在C ++ 14之前,constexpr函数的主体必须只包含return语句:它内部不能包含任何其他语句。这适用于C ++ 11:

constexpr int func (int x) 
{
  return x < 0 ? -x : x;
}

在C ++ 14及更高版本中,您所写的内容与大多数其他声明一样合法。

Source.

答案 1 :(得分:11)

C ++ 11的constexpr函数比这更具限制性。

来自cppreference

  

函数体必须删除或默认,或者只包含以下内容:

     
      
  • null语句(普通分号)
  •   
  • static_assert声明
  •   
  • typedef声明和不定义类或枚举的别名声明
  •   
  • using声明
  •   
  • using指令
  •   
  • 只有一个return声明。
  •   

所以你可以这样说:

constexpr int func (int x) { return x < 0 ? -x : x; }

static_assert(func(42) == 42, "");
static_assert(func(-42) == 42, "");

int main() {}

请注意,此限制已在C ++ 14中解除。