相关疑难解决方法(0)

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++ 14标准库的哪些部分以及哪些部分将成为constexpr?

使用新的轻松的C++ 14 constexpr规则,编译时编程变得更具表现力.我想知道标准图书馆是否也会升级以便利用.特别是std::initializer_list,std::pair,std::tuple,std::complex,std::bitsetstd::array看起来像总理候选人须注明constexpr批发.

问题:

  • 其标准库的部分现在被标记constexpr
  • 哪些其他部分可以标记constexpr
  • 例如,为什么不是来自<cmath><algorithm>标记的功能constexpr
  • 是否有向后兼容的原因不这样做?

c++ backwards-compatibility constexpr c++11 c++14

32
推荐指数
1
解决办法
1277
查看次数

为什么std :: tie没有标记为c ++ 14的constexpr?

这是我之前提出的问题的后续问题"C++ 14标准库的哪些部分可能是什么以及将制作哪些部分constexpr?" " constexpr运营商超载指南?"

在运行时世界中,为多个数据成员的结构重载的operator<一个很好的习惯用法std::tie将结构转换为a std::tuple并在其上进行捎带,operator<这就是Right Thing™(各种成员的字典比较).

在C++ 14,许多地方std::tuple制成constexpr,特别是make_tuple,std::get与前面提到的operator<.然而,似乎看似相关std::tie的没有标记constexpr.这很烦人,因为它使定义用户定义的文字类型在编译时可以比必要的更冗长.

问题:是否有任何技术原因std::tie未标记constexpr为C++ 14?

更新:LWG问题2301,在libc ++libstdc ++ bug 65978中实现

更新2:在修改libstdc ++错误报告后,由@JonathanWakely修复了3个多小时!

c++ tuples constexpr c++11 c++14

23
推荐指数
1
解决办法
1279
查看次数