【问题标题】:Why does std::initializer_list not support std::get<>, std::tuple_size and std::tuple_element为什么 std::initializer_list 不支持 std::get<>、std::tuple_size 和 std::tuple_element
【发布时间】:2017-06-21 05:32:26
【问题描述】:

为什么std::initializer_list 不支持std::get&lt;&gt;std::tuple_sizestd::tuple_element?它现在在constexpr 表达式中被大量使用,例如,

std::max({1, 2, 3, 4, 5});

如果它确实很酷,像下面这样的事情是可能的

auto [x, y] = {1, 2};

那么为什么std::initializer_list 不支持这些?据我所知,没有办法在运行时构造std::initializer_list,因此大小始终由用户固定。


以下是如何在编译时获取std::intializer_list&lt;&gt; 大小的示例

#include <iostream>
#include <initializer_list>

using std::cout;
using std::endl;

template <typename...>  struct WhichType;

template <typename Type>
constexpr int size_init_list(std::initializer_list<Type> il) {
    return il.end() - il.begin();
}

int main() {
    constexpr auto size = size_init_list({1, 2, 3});
    cout << static_cast<int>(std::integral_constant<int, size>{}) << endl;
    return 0;
}

【问题讨论】:

  • @downvoter 为什么投反对票?
  • 自动 i = randint(0,1) ? std::initializer_list{1, 2} : std::initializer_list{1, 2, 3, 4, 5, 6, 7};
  • 为什么不直接结束 - 开始?

标签: c++ c++11 c++17 initializer-list structured-bindings


【解决方案1】:

尽管std::initializer_list 的大小是编译时常量,但大小不是类型的一部分。 ints 的每个初始化列表都具有相同的类型,即std::initializer_list&lt;int&gt;。而std::tuple_size&lt;std::initializer_list&lt;int&gt;&gt;::value 只能有一个可能的值。所以显然它不能用于获取初始化列表的实际大小。定义它根本没有意义。

【讨论】:

  • 更新了我的问题
  • @Curious 是的,您可以在编译时获取大小,但这并不意味着 std::tuple_size 可以做到。在我的回答中,我解释了原因:它只给出了类型,而不是实例。
  • 我的问题很愚蠢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 2012-07-09
  • 2021-05-24
  • 1970-01-01
相关资源
最近更新 更多