2013-08-23 48 views
5

因为我对这个问题的疑虑(对于C++ 03)我张贴它只是这儿过得阅读转换构造,并指出拷贝构造函数和一个转换构造之间的困惑

“要是一个转换构造函数,构造函数必须具有单个 参数,并且在没有显式关键字的情况下声明。“

现在我的问题是复制构造函数是否可以被称为转换构造函数提供它没有明确声明?它有资格成为一个吗? 我相信它不能被称为转换构造函数,因为它只接受相同的类型参数ths导致没有转换。例如

foo a; 
foo b; 
a = 100; //a Conversion constructor would be called (i.e) foo(int a){...} 
a = b ; //Since both objects are same type and have been initialized the assignment operator will be called (if there is an overloaded version otherwise the default will be called) 

我的理解是否正确?

+0

如果可能,'operator =()'将是首选,但真正的问题是“当找不到合适的'operator =()'实现时会发生什么?” – cdhowie

+0

foo a = 100; //是转换结构 foo b = a; //是复制构造 –

+0

[class.conv.ctor]/3“非显式拷贝构造函数(12.8)是一个转换构造函数,隐式声明的拷贝构造函数 不是一个显式的构造函数;它可以被隐式调用类型转换“。 – dyp

回答

0

是的,复制构造函数就是它 - 复制构造函数。这不是一个转换构造函数,从一种类型转换为另一种类型。

+0

这应该是一个评论?你能修正语法吗? –

+0

除了它是*是一个转换构造函数。转换到相同类型可能是微不足道的,但它在技术上仍然是一种转换。 –

+0

修正语法,是否更清晰? –

10

引述标准:

[class.conv.ctor]/3

甲非显式拷贝构造(12.8)是一转换构造。一个隐式声明的拷贝构造函数不是一个显式的构造函数;它可能被称为隐式类型转换。

所以是的,copy-ctor是一个转换ctor。

还要注意[CONV]/1,指定并在备注中指出:

注:一个标准转换序列可以是空的,即,它可以由任何转换的。

和/ 3:

表达e可以隐式转换到类型T当且仅当该声明T t=e;是公形成

所以该组的隐式转化包含空转换。

+0

+1优秀参考报价 – sehe