C++中类型强制转换的后续,可能会被理解为类型转换

4
这是我的上一个问题的跟进。
考虑我编写了一个具有以下原型的函数:
``` function functionName(param1, param2) { // function body } ```
int a_function(Foo val);

在此,foo被认为是一个定义为unsigned int的类型。不幸的是,由于缺乏文档,这一点无法验证。

然后,有人使用了a_function,但却将其作为unsigned int的参数调用。

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

编译器是否应该识别不匹配并插入构造函数,从而渲染函数调用,这是标准和可靠的行为?还是我应该得到编译时错误报告类型不匹配。

3个回答

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));则可以正常工作。
这个特性在语言中的作用是防止恰好发生这种意外转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接