这是我之前的问题的后续跟进.
考虑我用以下原型编写一个函数:
int a_function(Foo val);
Run Code Online (Sandbox Code Playgroud)
其中foo被认为是一个定义为unsigned int的类型.遗憾的是,由于缺乏文件,这是不可验证的.
所以,有人出现并使用a_function,但使用unsigned int作为参数调用它.
这个故事转了过来.Foo实际上是一个类,它可以在显式构造函数中将unsigned int作为unsigned int的单个参数.
对于编译器来说,通过对参数进行类型转换来呈现函数调用是一种标准且可靠的行为吗?即编译器应该识别不匹配并插入构造函数?或者我应该得到报告类型不匹配的编译时错误.
如果Foo有unsigned int隐式转换的构造函数将发生,除非Foo未声明显式.
第一种情况:
class Foo { public: Foo(unsigned int) {} };
// ...
a_function( 1 ); // OK
Run Code Online (Sandbox Code Playgroud)
第二种情况:
class Foo { public: explicit Foo(unsigned int) {} };
// ..
a_function( 1 ); // error
Run Code Online (Sandbox Code Playgroud)
根据C++标准,只允许一个用户定义的隐式转换.