首页 >后端开发 >C++ >为什么 `func(\'one\')` 会导致 C 隐式转换出错?

为什么 `func(\'one\')` 会导致 C 隐式转换出错?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-01 05:36:02439浏览

Why does `func(

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn