首页  >  文章  >  后端开发  >  为什么 C 在隐式类型转换期间只允许一种用户定义的转换?

为什么 C 在隐式类型转换期间只允许一种用户定义的转换?

Patricia Arquette
Patricia Arquette原创
2024-11-01 01:14:28542浏览

Why Does C   Allow Only One User-Defined Conversion During Implicit Type Conversions?

C 隐式转换:了解用户定义的转换规则

根据最近对之前回复的反馈,有必要澄清一下理解C 中的隐式转换。

考虑以下代码片段:

<code class="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
}</code>

第一个函数调用会导致错误,因为没有从 const char* 到 A 的直接转换。虽然存在从字符串到 A 的转换,但应用它需要多次转换,这是不允许的。

C 标准(SC22-N-4411.pdf)在第 12.3.4 节中提供了答案titled 'Conversions':

"4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value."

这意味着在隐式类型转换或初始化期间,只能将一个隐式用户定义转换(构造函数或转换函数)应用于单个值。

在给定的代码中,第一个函数调用 func("one") 尝试使用从 const char* "one" 到 A 的隐式转换,但它失败了,因为这需要两次转换(一次来自 const char * 到 std::string,另一个从 std::string 到 A)。另外两个函数调用是有效的,因为它们每个只涉及一次隐式转换。

以上是为什么 C 在隐式类型转换期间只允许一种用户定义的转换?的详细内容。更多信息请关注PHP中文网其他相关文章!

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