在对另一个构造函数的调用中调用构造函数

Call constructor inside a call to another constructor

假设我有 类 A, B:

class A
{
    int a;
public:

    A(int a) : a(a) { }
};

class B
{
    A a;
public:

    B(A a) : a(a) { }
};

我想创建一个 B 的实例:

int i = 1;
B b(A(i));

但是当我实际尝试使用 b 时,我遇到了描述的问题 here。也就是说,b 不是 B 的实例,它是 returns B 类型对象的函数。但是,它与链接问题的情况不同,我不明白为什么会发生在这里。

我可以将 B 创建为:

int i = 1;
A a(i);
B b(a);

甚至是:

B b(A(1));

它会奏效的。但是,在实际情况下,第一个选项需要太多行,而第二个选项需要很长的行(因为我有一个需要构造的对象而不是 int,而且我有一些对象链)。如何在自己的行创建int,然后在同一行创建A和B?

排除任何可能的函数声明的一个明显方法是:

B b { A {i} };

问题B b(A(i));是一个函数声明,而不是B类型的变量b的声明。

这就是所谓的most vexing parse。特别是声明:

B b(A(i)); //this is a declaration for a function named `b` that takes parameter of type A and has no return type 

以上是一个名为 b 的函数的 声明 ,该函数接受一个类型为 A 的参数,return 类型为 B.

要解决这个问题,您可以使用花括号 {} 或双 () 来解决这个问题:

方法一

A(i)周围使用{}

//----v----v------->declares a variable of type B and is not a function declaration
   B b{A(i)};

方法二

使用双括号(())

//-v--------v------>declares a variable of type B and is not a function declaration
B b( (A(i)) );