我知道什么是“表达类别”,但我对“表达类型”感到困惑。
表达式求值可能会产生结果。
那么,结果的类型就是“表达式的类型”吗?
但是,根据www.cppreference.com :,它说:
每个 C++ 表达式都有两个独立的属性:类型和值类别。
那么,“类型”是指表达式的类型,还是表达式结果的类型?
我想这可能需要一些编译原理的知识(我对此一无所知),到底是先判断表达式的类型,然后根据它来判断表达式结果的类型?或者表达式结果的类型就是表达式的类型?
请从编译原理的角度给出一个通俗易懂的解释。
如果删除析构函数,编译器还会隐式生成默认构造函数吗?
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)