c++ - 为什么我们不能通过索引访问元组的元素?

标签 c++ stl

tuple <int, string, int> x=make_tuple(1, "anukul", 100);
cout << x[0];       //1
cout << get<0>(x);  //2

2 作品。 1 没有。

为什么会这样?

从 Lounge C++ 我了解到,这可能是因为编译器不知道该索引处存储的数据类型。 但这对我来说没有多大意义,因为编译器可以只查找该元组的声明并确定数据类型,或者在通过索引访问其他数据结构的元素时执行其他任何操作。

最佳答案

因为 [] 是一个运算符(名为 operator[] ),因此是一个成员函数,并且在运行时被调用。

虽然获取元组项是一种模板机制,但它必须在编译时解决。这意味着这只能通过 <> 模板语法来完成。

为了更好地理解,一个元组可以存储不同的类型。模板函数可能会根据传递的索引返回不同的类型,因为这是在编译时解决的。 无论传递的参数的值是什么,operator[] 都必须返回一个唯一的类型。因此无法实现元组功能。

get<0>(x)get<1>(x)是在编译时生成的两个不同的函数,并返回不同的类型。编译器实际上生成了两个函数,它们将被修改为类似

int get_tuple_int_string_int_0(x)

string get_tuple_int_string_int_1(x)

关于c++ - 为什么我们不能通过索引访问元组的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32606464/

相关文章:

c++ - 在 Keil 中添加一个库作为在 C 项目中使用 C++ 的外观

c++ - Qt 字符串解析

c++ - 哪个 STL 容器最能满足这些需求?

c++ - 替换字符串时出现编译错误

c++ - 读取 vector 时出现段错误

c++ - 在类构造函数中调用虚函数

C++,数组 - Windows 错误崩溃但没有编译器错误

c++ - 如何从STL vector 中最小元素的迭代器位置获取int/size_t值?

c++ - mfc c++ 计算结果为 9 后返回 1

c++ - 特化 std::vector 的模板