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应该是常量表达式,否则它将无法编译.
constexpr函数可以在编译时进行评估,一般不会被标准强制(你可以强制在编译时通过在常量表达式中使用函数来评估函数,比如constexpr用它初始化变量).
此外,constexpr函数的参数实际上不是常量,它们可能随着每次调用而改变(即使在编译时进行评估).
一个解决方法是使用非类型模板传递bar,如果它始终是编译时常量(它似乎是).
| 归档时间: |
|
| 查看次数: |
3888 次 |
| 最近记录: |