Min/Max/Step 函数和“constexpr 函数的主体......不是返回语句”

Posted

技术标签:

【中文标题】Min/Max/Step 函数和“constexpr 函数的主体......不是返回语句”【英文标题】:Min/Max/Step function and "body of constexpr function ... not a return-statement" 【发布时间】:2016-11-15 08:08:39 【问题描述】:

我在尝试使用 consexpr 进行装饰时遇到错误:

$ g++ -std=c++11 test.cxx -o test.exe
test.cxx: In instantiation of ‘static constexpr unsigned int MinMaxStep<min, max
, step>::ValidValue(unsigned int) [with unsigned int min = 10u; unsigned int max
 = 100u; unsigned int step = 10u]’:
test.cxx:22:40:   required from here
test.cxx:16:5: error: body of constexpr function ‘static constexpr unsigned int 
MinMaxStep<min, max, step>::ValidValue(unsigned int) [with unsigned int min = 10
u; unsigned int max = 100u; unsigned int step = 10u]’ not a return-statement
     
     ^

问题函数中使用的所有值都是模板参数。保存文件后,这些值不会更改。

难道不能用constexpr函数来表达吗?

如果我做错了什么,那是什么?如何将ValidVaue修改为constexpr函数?


$ cat -n test.cxx
 1  #include <string>
 2  #include <iostream>
 3  
 4  template <unsigned int min, unsigned int max, unsigned int step>
 5  class MinMaxStep
 6  
 7  public:
 8      static constexpr unsigned int Min()  return min; 
 9      static constexpr unsigned int Max()  return max; 
10      static constexpr unsigned int Step()  return step; 
11      static constexpr unsigned int ValidValue(unsigned int v)
12      
13          if (v <= min)  return min; 
14          else if (v >= max)  return max; 
15          return (v+step-1) - ((v+step-1)%step);
16      
17  ;
18  
19  int main (int argc, char* argv[])
20  
21      MinMaxStep<10, 100, 10> mms;
22      unsigned int x = mms.ValidValue (18);
23      std::cout << "value " << x << std::endl;
24  
25      return 0;
26  

【问题讨论】:

return v &lt;= min ? min : (v &gt;= max ? max : ((v+step-1) - ((v+step-1)%step))); 一个带有三元运算符的返回语句被接受。你知道它是否被所有主要编译器(Clang、Comeau、GCC、ICC、MSVC 和 SunCC)接受吗?你知道他们中的任何一个都有半生不熟的实现吗? 【参考方案1】:

constexpr 函数的规则在 C++11 中非常严格。例如,可能只有一个return 语句,没有别的。在 C++14 中,规则大大放宽了。

参见例如this constexpr reference 了解更多信息。

有两种方法可以解决您的问题:最简单的方法是改用 C++14(将编译器标志更改为使用 -std=c++14)。另一种解决方案是使用三元运算符将 ValidValue 函数重构为只有一个语句,即 return 语句。

【讨论】:

大声笑... C++14 是不可能的。我们有时生活在一个特殊的地狱里。我们现在支持 Fedora 1 上的 GCC 3 和 Windows 2000 上的 Visual Studio .Net。 @jww :但constexpr 仍然是您的选择吗? o_O @ildjarn - 是的,constxpr,与其他关键字如noexceptalignas 一样,可以抽象出in a macro。我不能让旧编译器接受新标志:)

以上是关于Min/Max/Step 函数和“constexpr 函数的主体......不是返回语句”的主要内容,如果未能解决你的问题,请参考以下文章

在 JSpinner 中为 DateEditor 设置步骤

html5新属性

Html5之高级-2 HTML5表单属性(属性介绍属性详解)

Express请求处理管线 随笔

art-template视图引擎express

Node.js开发 ---- 留言板实例fs读写文件