royqh1979 / RedPanda-CPP

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

编辑器无法自动推断 使用 new 表达式的 auto 类型变量的类型 #309

Closed West-Pavilion closed 7 months ago

West-Pavilion commented 7 months ago

编辑器无法自动推断 使用 new 表达式的 auto 类型变量的类型

C++ 允许使用 auto 接收 new 表达式的结果,编译器会自动推断其类型为表达式求值后的指针类型

然而,当前版本的 小熊猫C++ 无法自动推断 使用 new 表达式的 auto 类型变量的类型

请考虑如下代码:

#include <iostream>

/* 编辑器无法自动推断 使用 new 表达式的 auto 类型变量的类型 */

/* 这里定义一个用于演示的 my_class 类类型 */
class my_class {
    public:
        int my_data = 8888;
};

int main() {
    /* 编辑器无法自动推断 pointer_to_my_class 为 my_class* 类型 */
    auto pointer_to_my_class = new my_class;
//  pointer_to_my_class->
    std::cout << "pointer contains value " << pointer_to_my_class->my_data << std::endl;

    auto * still_pointer_to_my_class = new my_class;
//  still_pointer_to_my_class->
    std::cout << "auto * is still pointer " << still_pointer_to_my_class->my_data << std::endl;

    /* 使用了 new 表达式 后立刻解引用,并将结果赋值给一个 auto& 类型的变量,今后可以通过 delete &变量名 的方式解分配该变量 */
    auto& instance_from_new = *new my_class;
//  instance_from_new.
    std::cout << "this instance contains value " << instance_from_new.my_data << std::endl;

    auto pointer_to_my_class_array = new my_class[5]/* {} */; //可以带初始化器
//  pointer_to_my_class_array->
//  pointer_to_my_class_array[2].
    std::cout << "the first element contains value " << pointer_to_my_class_array->my_data << std::endl;
    std::cout << "the third element contains value " << pointer_to_my_class_array[2].my_data << std::endl;

    /* new 表达式临时量(不赋值给任何具名变量,直接放在括号中使用) */
//  (new my_class)->
//  (new my_class[5])->
//  (new my_class[5])[2].
    std::cout << "new temp var " << (new my_class)->my_data << std::endl;
    std::cout << "new temp array " << (new my_class[5])->my_data << std::endl;
    std::cout << "instant use of array element " << (new my_class[5])[2].my_data << std::endl;

    /* new auto 表达式 */
    auto pointer_to_auto1 = new auto(my_class());
    auto pointer_to_auto2 = new auto(my_class{});
//  pointer_to_auto1->
//  pointer_to_auto2->
    std::cout << "pointer_to_auto1 contains value " << pointer_to_auto1->my_data << std::endl;
    std::cout << "pointer_to_auto2 contains value " << pointer_to_auto2->my_data << std::endl;
}

屏幕截图(298)

屏幕截图(302)

下面是对应的测试代码:

编辑器无法自动推断 使用 new 表达式的 auto 类型变量的类型.zip

West-Pavilion commented 7 months ago

新版本中已支持常用的 使用 new 表达式 的 auto 类型变量的 类型推导,即将关闭此 issue。