小编Yue*_*hou的帖子

C++ 中的“表达式类型”是什么?

我知道什么是“表达类别”,但我对“表达类型”感到困惑。

根据www.cppreference.com

表达式求值可能会产生结果。

那么,结果的类型就是“表达式的类型”吗?

但是,根据www.cppreference.com :,它说:

每个 C++ 表达式都有两个独立的属性:类型和值类别。

那么,“类型”是指表达式的类型,还是表达式结果的类型?

我想这可能需要一些编译原理的知识(我对此一无所知),到底是先判断表达式的类型,然后根据它来判断表达式结果的类型?或者表达式结果的类型就是表达式的类型?

请从编译原理的角度给出一个通俗易懂的解释。

c++ expression language-lawyer

3
推荐指数
1
解决办法
273
查看次数

如果删除析构函数,编译器还会隐式生成默认构造函数吗?

如果删除析构函数,编译器还会隐式生成默认构造函数吗?

GCC可以编译以下代码:

struct A
{
    ~A() = delete;
    int x;
    int y;
    virtual void foo()
    {
    }
};

int main()
{
    A *pmc = new A; // Allowed by the compiler GCC, but causes memory leak
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这表明 GCC 认为在这种情况下它可以隐式生成默认构造函数。默认构造函数的汇编代码也可以在Godbolt上查看:

A::A() [base object constructor]:
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        mov     edx, OFFSET FLAT:vtable for A+16
        mov     rax, QWORD PTR [rbp-8]
        mov     QWORD PTR [rax], rdx
        nop
        pop     rbp
        ret
Run Code Online (Sandbox Code Playgroud)

然而,当检查类型特征时,答案是否定的:

A::A() [base object …
Run Code Online (Sandbox Code Playgroud)

c++ constructor destructor

2
推荐指数
1
解决办法
165
查看次数