C 中的隐式转换
在最近关于 C 中隐式转换的讨论中,出现了关于单个操作中多个转换的适用性的问题。为了阐明这个概念,让我们检查以下代码:
<code class="cpp">#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 }</code>
正如最初所述,第一个函数调用是一个错误,因为没有从 const char* 到 A 的直接转换。存在到 A 的字符串,利用它需要两次连续转换。
根据 C 标准 (SC22-N-4411.pdf),第 12.3.4 节标题为“转换”:
”最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值。”
这意味着在给定的代码中,编译器不能隐式应用 A(const std: :string &) 以及从 const char* 到 std::string (然后转换为 A)到参数“one”的隐式转换。
因此,第一个函数调用的原始断言将结果错误是正确的。 C 标准明确规定只允许一种隐式用户定义转换,从而阻止编译器执行必要的步骤来满足函数的参数类型。
以上是C 中的单个操作可以应用多个隐式转换吗?的详细内容。更多信息请关注PHP中文网其他相关文章!