C 隐式转换:澄清
最近,对先前有关 C 中替代转换的答案的评论引发了有关隐式转换准确性的问题。为了提供澄清,我们将检查以下代码段:
#include <string> struct A { A( const std::string & s ) {} }; void func( const A & a ) { } int main() { func( "one" ); // error func( A("two") ); // ok func( std::string("three") ); // ok }
最初,断言第一个函数调用会导致错误,因为不存在从 const char * 到 A 的直接转换。但是,存在从字符串到 A 的转换。利用此转换将涉及多个步骤,这通常是被禁止的。 g 4.4.0 和 Comeau 编译器支持这一断言。
经过进一步调查,C 标准 (12.3.4) 阐明了这一问题,指出最多有一个用户定义的转换 (构造函数或转换函数)可以隐式应用于单个值。此裁决与观察到的行为一致,并澄清了隐式转换的限制。
总而言之,单个值只允许进行一次隐式用户定义转换。在提供的代码中,调用 func("one") 失败,因为它需要多次隐式转换,这是不允许的。
以上是C 中的隐式转换可以涉及多个用户定义的转换吗?的详细内容。更多信息请关注PHP中文网其他相关文章!