使用匿名对象时既不调用默认构造函数也不调用复制构造函数
Neither Default Constructor nor Copy Constructor is called when using anonymous object
以下是旨在测试构造函数的代码段。在 VS 2015 中是 运行。
在我看来,"B b(B())" 与 "B b = B()" 具有相同的功能,但是,我的代码似乎表明它们的行为不同。
我知道编译器优化存在复制省略,但我认为至少在执行时应该调用默认构造函数"B b(B())"。
谁能帮忙指出我的误解在哪里?
class B
{
public:
B() {
++i;
x = new int[100];
cout << "default constructor!"<<" "<<i << endl;
cout << "x address:" << x << endl << "--------" << endl;
}
B(const B &b) //copy constructor
{
++i;
cout << "Copy constructor & called " << i<< endl
<< "--------" << endl;
}
B(B &&b)//move constructor
{
x = b.x;
++i;
b.x = nullptr;
cout << "Copy constructor && called" << i << endl
<<"x address:"<< x << endl << "--------" << endl;
}
void print()
{
cout << "b address:" << x << endl << "--------" << endl;
}
private:
static int i;
int *x;
};
int B::i = 0;
int main()
{
B b1; //default constructor
b1.print();
B b2 = B(); //default constructor only
b2.print();
B b3(B()); //????nothing called... why???
B b4 = b2; //copy constructor
B b5 = move(b2); //move constructor
b2.print();
return 0;
}
注意B b(B())
是函数声明,根本不是变量定义,那么不会调用构造函数。
根据Most vexing parse,B b(B())
是一个函数声明,对于一个名为b
的函数,returns是一个B
类型的对象,并且有一个单个(未命名)参数,它是指向返回类型 B
且不带参数的函数的指针。
你可以用大括号解决它(list initlization (C++11 起)),比如
B b1( B{} );
B b2{ B() };
B b3{ B{} }; // preferable from C++11
以下是旨在测试构造函数的代码段。在 VS 2015 中是 运行。
在我看来,"B b(B())" 与 "B b = B()" 具有相同的功能,但是,我的代码似乎表明它们的行为不同。
我知道编译器优化存在复制省略,但我认为至少在执行时应该调用默认构造函数"B b(B())"。 谁能帮忙指出我的误解在哪里?
class B
{
public:
B() {
++i;
x = new int[100];
cout << "default constructor!"<<" "<<i << endl;
cout << "x address:" << x << endl << "--------" << endl;
}
B(const B &b) //copy constructor
{
++i;
cout << "Copy constructor & called " << i<< endl
<< "--------" << endl;
}
B(B &&b)//move constructor
{
x = b.x;
++i;
b.x = nullptr;
cout << "Copy constructor && called" << i << endl
<<"x address:"<< x << endl << "--------" << endl;
}
void print()
{
cout << "b address:" << x << endl << "--------" << endl;
}
private:
static int i;
int *x;
};
int B::i = 0;
int main()
{
B b1; //default constructor
b1.print();
B b2 = B(); //default constructor only
b2.print();
B b3(B()); //????nothing called... why???
B b4 = b2; //copy constructor
B b5 = move(b2); //move constructor
b2.print();
return 0;
}
注意B b(B())
是函数声明,根本不是变量定义,那么不会调用构造函数。
根据Most vexing parse,B b(B())
是一个函数声明,对于一个名为b
的函数,returns是一个B
类型的对象,并且有一个单个(未命名)参数,它是指向返回类型 B
且不带参数的函数的指针。
你可以用大括号解决它(list initlization (C++11 起)),比如
B b1( B{} );
B b2{ B() };
B b3{ B{} }; // preferable from C++11