C 隐式转换
在 C 上下文中,隐式转换的概念一直是讨论的主题。最近关于“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>
在此片段中,第一个函数调用 func("one") 的结果是一个错误。这是因为没有从 const char * 到 A 的直接转换。虽然存在从字符串到 A 的转换,但使用它会涉及多次隐式转换,根据 C 标准,这是不允许的。
C 标准 (SC22-N-4411.pdf) 在第 12.3.4 节“转换”中指出:
4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.
这意味着在执行转换时只能应用一个隐式用户定义的转换。在第一个函数调用中,从 const char * 到 string 的转换以及从 string 到 A 的转换都是用户定义的转换。由于需要多次转换,编译器会引发错误。
以上是为什么 `func(\"one\")` 会导致 C 隐式转换出错?的详细内容。更多信息请关注PHP中文网其他相关文章!