Closed West-Pavilion closed 7 months ago
编辑器自动推断 auto 类型的 std::vector 中的元素类型不正确
如果使用数组下标运算符 ‘[]’ 访问 std::vector 中的元素的同时使用 auto 关键词声明的变量接收,那么得到的变量会被编辑器自动推断为 std::vector 类型。具体表现为,对其使用成员访问运算符 '.' 会得到 std::vector 的成员变量及函数的补全提示。然而,由于 std::vector 提供了对数组下标运算符的重载,使用其访问 std::vector 类型对象时,实际获得的是 std::vector 所容纳的元素类型的对象。这可能会导致令人困惑的效果。
例如,考虑如下的 C++ 代码:
#include <iostream> #include <vector> /* 编辑器自动推断 auto 类型的 std::vector 中的元素类型不正确 */ class my_class { public: int my_data; }; int main() { std::vector<my_class> vec(5); /* 在下列代码段中,auto 类型的 e 被编辑器自动推断成 std::vector 类型 */ auto e = vec[2]; // e. /* 然而,由于 std::vector 重载了数组下标运算符,故得到的 e 应为 my_class 类型的对象 */ static_assert(std::is_same_v<decltype(e), my_class>); std::cout << "e 应被推断为 my_class 类型" << std::endl; }
下面是对应的测试代码:
编辑器自动推断 auto 类型的 std;;vector 中的元素类型不正确.zip
编辑器自动推断 auto 类型的 std::vector 中的元素类型不正确
如果使用数组下标运算符 ‘[]’ 访问 std::vector 中的元素的同时使用 auto 关键词声明的变量接收,那么得到的变量会被编辑器自动推断为 std::vector 类型。具体表现为,对其使用成员访问运算符 '.' 会得到 std::vector 的成员变量及函数的补全提示。然而,由于 std::vector 提供了对数组下标运算符的重载,使用其访问 std::vector 类型对象时,实际获得的是 std::vector 所容纳的元素类型的对象。这可能会导致令人困惑的效果。
例如,考虑如下的 C++ 代码:
下面是对应的测试代码:
编辑器自动推断 auto 类型的 std;;vector 中的元素类型不正确.zip