我一直在从事由其他人(已离开公司)发起的 C++ 项目。他写了一段代码,看起来运行得很好,但我无法理解。
下面是代码的简化版本:
有两类:
class Algo_t {
protected :
Matrix_t m_Matrix ;
public:
Algo_t(Matrix_t && Matrix) {
DoSomething();
}
};
class Matrix_t {
protected :
std::ifstream & m_iftsream ;
public:
Matrix_t(std::ifstream && ifstream) {
DoSomething();
}
};
主要是:
main函数中有如下调用:
char * pMyFileName = agrv[1] ;
Algo_t MyAlgo(ifstream(pMyFileName));
首先,我很惊讶代码编译时没有任何错误,因为没有构造函数Algo_t
taking ifstream
作为参数。
我更惊讶地发现这段代码运行得非常好。
构造函数是由编译器生成的还是 C++11 引入的一些新功能(带有右值...)?
在 C++ 中,最多允许一次用户定义的转换。你不能直接构造一个Algo_t
from a ifstream
但你可以构造一个Matrix_t
with a ifstream
。所以在
Algo_t MyAlgo(ifstream(pMyFileName));
编译器构造一个临时的Matrix_t
(您的一个用户定义的转换)然后您使用该临时来构造MyAlgo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)