这是一个旧的C++;样式构造函数? 这里有一段C++代码.< /P>

这是一个旧的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

在本例中,许多代码块看起来像构造函数调用。 不幸的是,块代码#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 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兼容,那么它可能会有另一种语法,从而避免。表达的潜在歧义。