C++编译优化之RVO(Return ValueOptimization)
C++直接初始化与赋值初始化的区别
只要编程,问题就层出不穷,解决了一个,下回又会出新问题,好在有谷姐,度娘帮忙。这不今天编程时就遇到一个奇怪的问题,整整困扰了我一整天。闲话少说,让我们先来回顾一下。
一、 吐曹之事件
1.实例
首先让我们看一段代码,起初以为是二义性引起的(结果肯定不是啰):
classB{
public:
B(){std::cout<<"B()."<<std::endl;}
explicit B(int*l){std::cout<<"B(int*l)."<<std::endl;}//explicit
B&operator=(const B&)
{
std::cout<<"B&operator=(const B&)."<<std::endl;
}
B& operator=(B&)
{
std::cout<<"B&operator=(B&)."<<std::endl;
}
// B(constB&){std::cout<<"B(const B&)."<<std::endl;}
B(B&){std::cout<<"B(B&)."<<std::endl;}
};
int main()
{
int *j;
B w = j;
B q = B(j);
B l = w;
return 0;
}
输出:
run.cpp: In function 'int main()':
run.cpp:46: error: no matching function for call to 'B::B(B)'
run.cpp:20: note: candidates are: B::B(B&)
run.cpp:15: note: B::B()
run.cpp:48: error: no matching function for call to 'B::B(B)'
run.cpp:20: note: candidates are: B::B(B&)
run.cpp:15: note: B::B()
本以为是B(int*l), B(B&)造成了二义性,结果发现去掉B(const B&)注释就一切OK,煞是费解啊。
2 .二义性假设:
1.B w = j;这条有两种执行方式:
1)直接调用构造函数B(int*l)初始化w;
2)j先调用B(int*l)生成临时对象,然后调用拷贝构造函数初始化w.
2.由于B w = B(j);也报错,所以1中1)假设不成立。
那么只有1中2)的假设是对的,即不是二义性引起的。那么就是拷贝构造函数的问题,这里需要声明B(j)这种调用方式产生的临时变量作为引用参数时都是常引用