2010-05-26 29 views
4

这是跟进my previous questionC++中的类型强制跟进,因为它可能会被解释为类型转换

想想看,我写一个函数的原型如下:

int a_function(Foo val); 

其中foo被认为是定义unsigned int的一个类型。遗憾的是,由于缺少文件,这是不可验证的。

所以,有人出现并使用a_function,但用unsigned int作为参数进行调用。

这里的故事轮到了。 Foo实际上是一个类,它可以在显式构造函数中将unsigned int作为unsigned int的单个参数。

它是编译器通过对参数进行类型转换来呈现函数调用的标准可靠行为。即编译器是否应该识别不匹配并插入构造函数?或者我应该得到一个编译时错误报告类型不匹配。

回答

6

如果Foo具有unsigned int的构造函数,将发生隐式转换,除非Foo未声明为显式。

第一种情况:

class Foo { public: Foo(unsigned int) {} }; 
// ... 
a_function(1); // OK 

第二种情况:

class Foo { public: explicit Foo(unsigned int) {} }; 
// .. 
a_function(1); // error 

根据C++标准只有一个用户定义的隐式转换是允许的。

0

是的,编译器做这种类型转换是正确的行为。如果它不是像转换构造函数那样的事情,或者隐式转换是不可能的。

最好是通过良好的实践和文档来防止类似情况的发生,因为您的功能似乎缺乏这些功能。

0

如果构造函数是explicit那么a_function(50U);将导致编译错误,而a_function(Foo(50U));将工作。

此功能是用于防止这种意外转换的语言。

相关问题