4

这是对我之前的问题的跟进。

考虑一下我用以下原型编写了一个函数:

int a_function(Foo val);

其中 foo 被认为是类型定义的 unsigned int。不幸的是,由于缺乏文档,这无法验证。

因此,有人出现并使用 a_function,但使用 unsigned int 作为参数调用它。

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

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

4

3 回答 3

6

除非未明确声明,否则将发生隐式转换Foo的构造函数。unsigned intFoo

第一种情况:

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

第二种情况:

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

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

于 2010-05-26T13:17:27.143 回答
0

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

此功能在语言中可以完全防止这种意外转换。

于 2010-05-26T13:21:51.083 回答
0

是的,像这样进行类型转换是编译器的正确行为。如果不是这样,那么转换构造函数或隐式转换之类的东西就不可能了。

最好通过您的职能似乎缺乏的良好实践和文档来防止此类事情发生。

于 2010-05-26T13:19:37.590 回答