c++ - 为什么 std::initializer_list 不支持 std::get<>、std::tuple_size 和 std::tuple_element

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

为什么 std::initializer_list不支持std::get<> , 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<> 大小的示例在编译时

#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;
}

最佳答案

尽管 std::initializer_list 的大小是编译时常量,大小不是类型的一部分。 int 的每个初始化列表s 具有相同的类型,即 std::initializer_list<int> .和 std::tuple_size<std::initializer_list<int>>::value只能有一个可能的值。所以很明显它不能用于获取初始化列表的实际大小。定义它根本没有意义。

关于c++ - 为什么 std::initializer_list 不支持 std::get<>、std::tuple_size 和 std::tuple_element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44667517/

相关文章:

C++ 字符串附加格式化数据

c++ - 从不平衡的二叉搜索树中删除一个元素

c++ - CSV 格式不正确

c++ - 在 C++11/14 中说 "foo not in {bar, baz}"的漂亮方式

C++:我怎样才能重载一个函数,以便它可以接受任何仿函数,包括指向成员函数的指针?

c++ - 线性斐波那契实际代码的伪代码

c++ - 如何在 C++17 STL 并行算法中处理调度?

c++ - 如何在 Windows 上为 Dev-C++ 安装 C++ 库

c++ - 展开不同长度的参数包

c++ - 使用 boost metaparse 字符串解析包含的文件