【问题标题】:C++, how implicit conversion/constructor are determined?C++,如何确定隐式转换/构造函数?
【发布时间】:2010-03-14 19:41:08
【问题描述】:

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

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

void f(A a) {}

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

它是否会创建所有可能的转换树并选择合适的终端?还有什么?谢谢

【问题讨论】:

  • 发布一些可编译的代码。如果你编译它,它甚至可以回答你的问题。

标签: c++ constructor implicit implicit-conversion


【解决方案1】:

f() 的调用需要进行两次转换,一次是用户定义的转换(CB)和一次内置转换(派生到基础:BA)。当需要零次或一次用户定义的转换时,使用不匹配参数的调用会成功。如果不同的转换(内置的或用户定义的)会成功,那么,如果所有可能的方法在他们需要的转换数量/种类上都相等,则调用是不明确的,编译器需要发出诊断。

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

【讨论】:

  • 谢谢,这是有道理的。你知道什么优先,用户定义的转换,C->A 还是构造函数 C(A)?
  • @aaa:我在这里已经超出了我的深度,但是 TTBOMK,如果两个用户定义的转换是可能的,那么调用是不明确的并且代码不应该编译。
  • @aaa,请给出完整代码。在您的代码中,只存在一个转换函数,没有 C(A) 构造函数。我们的分析显示您给定的代码至少是好的并且符合标准。现在C(A) 呢?我在这里没有看到这样的构造函数。
  • @Johannes:我想 aaa 的附加问题就是:一个附加问题,因此是对上述代码的补充。
  • @sbi,我明白了。但要回答他的问题,我们需要更多信息。即使存在转换构造函数和函数,也可以有合理的方法来编译代码。一种转换函数或构造函数可能比另一种更受欢迎。在任何情况下都不会考虑构造函数C(A)。 ctor 应该类似于A(C)。如果他将这些附加内容放在问题中,他将有时间和空间来表达他的担忧。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 2014-02-24
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2020-06-20
    相关资源
    最近更新 更多