如何告诉static_assert constexpr函数参数是const?

Tra*_*isG 9 c++ constexpr c++11

我有一个constexpr函数,看起来像这样:

constexpr int foo(int bar)
{
   static_assert(bar>arbitrary_number, "Use a lower number please");

   return something_const;
}
Run Code Online (Sandbox Code Playgroud)

但是,使用GCC 4.6.3进行编译时不断告诉我

错误:'bar'不能出现在常量表达式中

我试过类似的东西

constexpr int foo(constexpr const int bar)
{
   static_assert(bar>arbitrary_number, "Use a lower number please");

   return something_const;
}
Run Code Online (Sandbox Code Playgroud)

但constexpr不能用于函数参数.

是否有一些简单的方法告诉编译器bar始终是编译时常量?

Naw*_*waz 17

是否有一些简单的方法告诉编译器bar始终是编译时常量?

如果bar总是编译时常量,那么你应该把你的函数编写为:

template<int bar>
constexpr int foo()
{
   static_assert(bar>arbitrary_number, "Use a lower number please");
   return something_const;
}
Run Code Online (Sandbox Code Playgroud)

因为如果你不这样做,而是写下你已经写过的东西,那么在这种情况下,也可以使用非const参数调用该函数; 只是当你传递非const参数时,函数将失去它的constexpr -ness.

注意,在上面的代码中也arbitrary_number应该是常量表达式,否则它将无法编译.


Xeo*_*Xeo 5

constexpr函数可以在编译时进行评估,一般不会被标准强制(你可以强制在编译时通过在常量表达式中使用函数来评估函数,比如constexpr用它初始化变量).

此外,constexpr函数的参数实际上不是常量,它们可能随着每次调用而改变(即使在编译时进行评估).

一个解决方法是使用非类型模板传递bar,如果它始终是编译时常量(它似乎是).