相关疑难解决方法(0)

C++ 11 - constexpr函数中的static_assert?

如何static_assert在一个constexpr函数中正确执行?例如:

constexpr int do_something(int x)
{
  static_assert(x > 0, "x must be > 0");
  return x + 5;
}
Run Code Online (Sandbox Code Playgroud)

这不是有效的C++ 11代码,因为constexpr函数必须只包含return语句.我不认为该标准有例外,但GCC 4.7不允许我编译这段代码.

c++ static-assert constexpr c++11

53
推荐指数
2
解决办法
1万
查看次数

constexpr重载

相关:函数返回constexpr无法编译

我觉得constexpr在C++ 11中的用处有限,因为无法定义两个本来具有相同签名的函数,但有一个是constexpr而另一个不是constexpr.换句话说,如果我有一个constexpr std :: string构造函数只接受constexpr参数,并且非constexpr std :: string构造函数用于非constexpr参数,那将非常有用.另一个例子是理论上复杂的功能,通过使用状态可以提高效率.使用constexpr函数你不能轻易做到这一点,所以你有两个选择:如果你传入非constexpr参数,那么constexpr函数非常慢,或者完全放弃constexpr(或写两个单独的函数,但你可能不知道要调用哪个版本).

因此,我的问题是:

是否有可能符合标准的C++ 11实现允许基于constexpr参数的函数重载,或者这需要更新标准?如果不允许,是否故意不允许?


@NicolBolas:假设我有一个映射enum到a 的函数std::string.最直接的方式做到这一点,假设我enum去从0n - 1,是创建一个大小的数组n充满了结果.

我可以创建一个static constexpr char const * []并构造一个std::string返回(std::string每次调用函数时支付创建对象的成本),或者我可以创建一个static std::string const []并返回我查找的值,std::string第一次支付所有构造函数的成本调用该函数.似乎更好的解决方案是std::string在编译时创建内存(类似于现在所做的char const *),但是执行此操作的唯一方法是警告构造函数它有constexpr参数.

对于一个除了std::string构造函数之外的例子,我认为找到一个例子是非常简单的,如果你可以忽略constexpr(并因此创建一个非constexpr函数)的要求,你可以创建一个更有效的函数.考虑一下这个帖子:constexpr问题,为什么这两个不同的程序用g ++在不同的时间内运行?

如果我fib用一个constexpr参数调用,我不能比编译器完全优化掉函数调用做得更好.但是,如果我fib使用非constexpr参数调用,我可能希望让它调用我自己的版本来实现memoization(这将需要状态)之类的东西,所以我得到的运行时间类似于我通过constexpr参数时的编译时间.

c++ overloading compile-time-constant constexpr c++11

45
推荐指数
5
解决办法
8601
查看次数

在C++ 11中is_constexpr是否可行?

是否有可能根据C++ 11中的C++ 11表达式是否为常量表达式(即constexpr)生成编译时布尔值?关于SO的几个问题与此有关,但我在任何地方都没有看到直接答案.

c++ compile-time constexpr c++11

32
推荐指数
4
解决办法
3946
查看次数

C++ 11 constexpr函数传递参数

请考虑以下代码:

static constexpr int make_const(const int i){
    return i;
}

void t1(const int i)
{
    constexpr int ii = make_const(i);  // error occurs here (i is not a constant expression)
    std::cout<<ii;
}

int main()
{
   t1(12);
}
Run Code Online (Sandbox Code Playgroud)

为什么我在make_const调用时出错?


UPDATE

但是这个有效:

constexpr int t1(const int i)
{
    return make_const(i);
}
Run Code Online (Sandbox Code Playgroud)

但是,这不是:

template<int i>
constexpr bool do_something(){
    return i;
}

constexpr int t1(const int i)
{
    return do_something<make_const(i)>();   // error occurs here (i is not a constant expression)
}
Run Code Online (Sandbox Code Playgroud)

c++ constexpr c++11

11
推荐指数
2
解决办法
1万
查看次数

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

我有一个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始终是编译时常量?

c++ constexpr c++11

9
推荐指数
2
解决办法
3888
查看次数