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 <= min ? min : (v >= 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
,与其他关键字如noexcept
或alignas
一样,可以抽象出in a macro。我不能让旧编译器接受新标志:)以上是关于Min/Max/Step 函数和“constexpr 函数的主体......不是返回语句”的主要内容,如果未能解决你的问题,请参考以下文章