【问题标题】:Why is std::tie not marked constexpr for C++14?为什么 std::tie 没有标记为 C++14 的 constexpr?
【发布时间】:2013-09-14 16:24:42
【问题描述】:

这是我之前的问题"Which parts of the C++14 Standard Library could be and which parts will be made constexpr?""Guidelines to do constexpr operator-overloading?" 的后续问题

在运行时世界中,多个数据成员的nice idiom to overload operator< for a struct 是使用std::tie 将结构转换为std::tuple 并搭载在其operator< 上执行正确的事情™(字典比较各种成员)。

在 C++14 中,std::tuple 的许多部分都变成了constexpr,尤其是make_tuplestd::get 和前面提到的operator<。但是,看似相关的std::tie 似乎没有标记为constexpr。这很烦人,因为它使得定义可以在编译时进行比较的用户定义的文字类型比必要的更加冗长。

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

更新LWG issue 2301implemented in libc++libstdc++ bug 65978

UPDATE2:在提交 libstdc++ 错误报告 3 个多小时后由 @JonathanWakely 修复!

【问题讨论】:

  • 因为它只创建一个引用元组,所以真的没有理由不标记它constexpr
  • @Xeo 我希望一切都是 constexpr 默认情况下,编译器只会在无法评估时发出警告

标签: c++ c++11 tuples constexpr c++14


【解决方案1】:

在任何使用constexprness 的情况下,make_tuple 的行为应该与tie 完全相同,只是名义上tie 会从引用中添加额外级别的不需要的间接。因此,tie 没有必要成为 constexpr,因为 make_tuple 可以达到这个目的。

【讨论】:

  • make_tuple 确实是编译时的一种解决方法,但是现在每当我进入运行时世界时,operator< 不会多制作 2 个副本吗?而且由于函数不会在 constexpr 上重载,因此也没有选择 2 个重载。
  • FWIW,你可以std::make_tuple(std::cref(args)...) 整个事情,但是eeeeeh。
  • @TemplateRex 一旦你下拉到运行时,你就不再在 constexpr 土地上,所以你使用 tie 代替(除非我在这里错过了什么)。
  • 但轻松的 C++14 风格 constexpr 的全部意义在于优雅地 下降到运行时区域,而不是产生不必要的副本。这是 C++11 中的主要痛点,它不必要地迫使您进行递归和? 运算符样式编码。现在我们有了forswitchif,并且可以编写算法(如果只有lambda是constexpr)。
  • @MarkB,你不想实现一个类型的operator< 两次,一种是在(可能)常量表达式上下文中使用它,另一种是(使用不同的名称)在其他地方使用,这很烦人。
猜你喜欢
  • 2020-06-25
  • 1970-01-01
  • 2020-01-20
  • 2014-10-09
  • 2020-08-09
  • 2021-07-14
  • 2020-10-30
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多