这是一个旧的C++;样式构造函数? 这里有一段C++代码.< /P>
在本例中,许多代码块看起来像构造函数调用。 不幸的是,块代码#3不是(您可以使用和检查它)这是一个旧的C++;样式构造函数? 这里有一段C++代码.< /P>,c++,c++11,C++,C++11,在本例中,许多代码块看起来像构造函数调用。 不幸的是,块代码#3不是(您可以使用和检查它) 我认为,这是一个古老的C++符号,它可以解释使用{}(CF×4)的新C++ 11构造符号。 你对T(i)的意思有什么解释吗,它非常接近构造函数的表示法,但绝对不同 struct T { T() { } T(int i) { } }; int main() { int i = 42; { // #1 T t(i); // new T named t using in
我认为,这是一个古老的C++符号,它可以解释使用{}(CF×4)的新C++ 11构造符号。 你对
T(i)
的意思有什么解释吗,它非常接近构造函数的表示法,但绝对不同
struct T {
T() { }
T(int i) { }
};
int main() {
int i = 42;
{ // #1
T t(i); // new T named t using int ctor
}
{ // #2
T t = T(i); // new T named t using int ctor
}
{ // #3
T(i); // new T named i using default ctor
}
{ // #4
T{i}; // new T using int ctor (unnamed result)
}
{ // #5
T(2); // new T using int ctor (unnamed result)
}
}
注:因此,T(i)
(#3)相当于ti=T()
声明:
T(i);
相当于:
T i;
换句话说,它声明了一个名为i
的变量,类型为T
。这是因为在某些位置的声明中允许使用括号(以更改声明程序的绑定),并且由于此语句可以作为声明进行分析,因此它是一个声明(即使它作为表达式可能更合理)。您可以使用它来查看汇编程序中发生的情况
您可以看到#1、#2#4和#5执行相同的操作,但是#3调用另一个构造函数(基本对象构造函数)
有人有解释吗
汇编程序代码:
::T() [base object constructor]:
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], rdi
nop
pop rbp
ret
T::T(int):
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], rdi
mov DWORD PTR [rbp-12], esi
nop
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov DWORD PTR [rbp-4], 42
// #1
mov edx, DWORD PTR [rbp-4]
lea rax, [rbp-7]
mov esi, edx
mov rdi, rax
call T::T(int)
// #2
mov edx, DWORD PTR [rbp-4]
lea rax, [rbp-8]
mov esi, edx
mov rdi, rax
call T::T(int)
// #3
lea rax, [rbp-9]
mov rdi, rax
call T::T() [complete object constructor]
// #4
mov edx, DWORD PTR [rbp-4]
lea rax, [rbp-6]
mov esi, edx
mov rdi, rax
call T::T(int)
// #5
lea rax, [rbp-5]
mov esi, 2
mov rdi, rax
call T::T(int)
mov eax, 0
leave
ret
我认为您的所有陈述都是正确的。请注意,如果您只是问一下,编译器将告诉您几乎所有您需要知道的信息:添加
-Wall
和“警告:圆括号被排除为clang中名为“I”[-Wvexing parse]
”的变量声明周围的多余圆括号,或者动机稍低的圆括号“警告:在'i'[-Wparentheses]
声明中不必要的括号。”@QuentinUK感谢您提供此链接。我知道它与函数有关(例如T()
)但对于如此简单的声明表达式,情况并非如此。当然,这可能会令人烦恼。那么,这是否只是继承自int(i)的C规范的解释选择还声明了<代码> int >代码>命名<代码> i < /Case> @ Paskh。从某种角度来看,这是真的。Stroustrup在D&E中写道,他考虑了一个替代的、更直观的C++语句语法。如果C++不必与C兼容,那么它可能会有另一种语法,从而避免。表达的潜在歧义。