C++,隐式转换/构造函数是如何确定的?

发布于 2024-08-25 02:18:04 字数 221 浏览 9 评论 0原文

C++ 如何确定几层深度的对象的隐式转换/构造? 例如:

struct A {};
struct B: A {};
struct C { operator B() { return B(); } };

void f(A a) {}

int main(void)
{
    f(C());
}

它是否创建所有可能转换的树并选择适当的终端?还有别的事吗?谢谢

How does C++ determine implicit conversion/construction of objects few levels deep?
for example:

struct A {};
struct B: A {};
struct C { operator B() { return B(); } };

void f(A a) {}

int main(void)
{
    f(C());
}

Does it create tree of all possible conversions and chooses appropriate terminal? Something else? Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦里°也失望 2024-09-01 02:18:04

f() 的调用需要两次转换,一次用户定义的转换(CB)和一次内置转换(派生-to-base:BA)。当需要零个或一个用户定义的转换时,具有不匹配参数的调用会成功。如果不同的转换(内置或用户定义的)会成功,那么,如果所有可能的方式在所需的转换数量/种类上都相同,则调用是不明确的,并且编译器需要发出诊断。

标准没有指定编译器如何实现这一点。

The call to f() would need two conversions, one user-defined conversion (C to B) and one built-in conversion (derived-to-base: B to A). Calls with non-matching arguments succeed when they would need zero or one user-defined conversions. If different conversions (built-in or user-defined) would succeed, then, if all possible ways are equal in the number/kind of conversions they need, the call is ambiguous and the compiler needs to emit a diagnostic.

How compilers implement this isn't specified by the standard.

洋洋洒洒 2024-09-01 02:18:04

标准没有对此进行规定。它仅指定结果。每个不同的编译器供应商都可以以他们选择的任何方式实现这一点,只要他们给出正确的结果。

所以可能有很多不同的方法

The standard doesn't specify this. It only specifies the outcome. Each different compiler vendor can implement this any way they choose, as long as they give the correct result.

So there's probably a whole bunch of different approaches out there

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文