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

标签 c++ c++11 constexpr

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

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

   return something_const;
}

但是,用 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;
}

但是 constexpr 不能用于函数参数。

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

最佳答案

Is there some simple way to tell the compiler that bar is always a compile time constant?

如果 bar 始终是编译时常量,那么您应该将函数编写为:

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

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

注意上面代码中的arbitrary_number也必须是常量表达式,否则编译不通过。

关于c++ - 如何告诉 static_assert constexpr 函数参数是 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9789913/

相关文章:

C++ intel TBB 内循环优化

c++ - 简单的可变参数模板函数无法实例化

c++ - 从 C++14 模板特化中删除 constexpr?

c++ - 具有 boolean 值的奇怪行为

c++ - 读取 REG_BINARY 会损坏方法的参数

c++ - Emacs、cedet 和 c++/c++11 支持

c++ - 按值返回的函数的值类别是否总是 xvalue?

c++ - 静态 constexpr 类成员何时需要类外定义?

c++ - 来自指针的 Typedef const 引用

c++ - 编译器如何处理 const 函数?