royqh1979 / RedPanda-CPP

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

如果定义一个指针类型的别名,那么对该类型的临时量,编辑器推导出的类型不正确 #385

Closed West-Pavilion closed 4 months ago

West-Pavilion commented 4 months ago

如果定义一个指针类型的别名,那么对该类型的临时量,编辑器推导出的类型不正确

请考虑如下的 C++ 代码:

#include <iostream>

/* 如果定义一个指针类型的别名,那么对该类型的临时量,编辑器推导出的类型不正确 */

class basic_tree {
public:
    constexpr static int height = 2719;
};

using tree_pointer = basic_tree*; // C++ 风格的指针类型定义
typedef class basic_tree *def_pointer; // C 语言风格的指针类型定义

int main(){
    /* 下面两行的示例中,可以用点号 '.' 获取到 height 的补全提示 */
//  tree_pointer().
//  def_pointer().

    /* 但是它们是指针类型,所以应该用箭头 '->' 来访问,否则会报错 */
//  tree_pointer()->
    std::cout << tree_pointer()->height << std::endl;
    std::cout << def_pointer()->height << std::endl;
}

如下图所示,使用点号 '.' 访问指针类型的临时量时,编辑器会给出其类型的成员变量的补全提示 屏幕截图(365)

如下图所示,使用箭头 '->' 访问指针类型的临时量时,编辑器不显示其类型的成员变量的补全提示 屏幕截图(366)

下面是对应的测试代码:

如果定义一个指针类型的别名,那么对该类型的临时量,编辑器推导出的类型不正确.zip

royqh1979 commented 4 months ago

看不出这么用的价值在哪里。

West-Pavilion commented 4 months ago

看不出这么用的价值在哪里。

的确,C++ 这种用法挺奇怪的,但是 Java 也从 C++ 这里继承了这种访问临时对象的成员的语法,如

new Thread(()->System.out.println("temp")).start();

这样的用法

C++ 是我学过的第二门面向对象的编程语言,我觉得这种访问临时对象的成员的方式挺有意思的。而且,当模仿上面的 Java 代码设计一个相似的类的时候,可以使用这种语法让代码更加简洁

royqh1979 commented 4 months ago

Java有GC,C++可没有。

West-Pavilion commented 4 months ago

Java有GC,C++可没有。

我仔细想了一下,因为 C++ 没有 GC,所以确实不太可能对临时量指针使用箭头 '->' 来获取成员