royqh1979 / RedPanda-CPP

A light-weight C/C++ IDE based on Qt
GNU General Public License v3.0
987 stars 107 forks source link

编辑器自动推断 auto 类型的 std::vector 中的元素类型不正确 #290

Closed West-Pavilion closed 7 months ago

West-Pavilion commented 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;
}

屏幕截图(277)

下面是对应的测试代码:

编辑器自动推断 auto 类型的 std;;vector 中的元素类型不正确.zip