相关疑难解决方法(0)

转换构造函数与转换运算符:优先级

在这里阅读关于转换运算符和构造函数的一些问题让我思考它们之间的相互作用,即当存在"模糊"调用时.请考虑以下代码:

class A;

class B { 
      public: 
         B(){} 

         B(const A&) //conversion constructor
         { 
              cout << "called B's conversion constructor" << endl; 
         } 
};

class A { 
      public: 
         operator B() //conversion operator
         { 
              cout << "called A's conversion operator" << endl; 
              return B(); 
         } 
};

int main()
{
    B b = A(); //what should be called here? apparently, A::operator B()
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码显示"被称为A的转换运算符",这意味着调用转换运算符而不是构造函数.如果operator B()从中删除/注释掉代码A,编译器将很乐意切换到使用构造函数(不对代码进行其他更改).

我的问题是:

  1. 由于编译器不认为B b = A();是一个模糊的调用,因此这里必须有某种类型的优先级.这个优先权究竟在哪里确定?(将赞赏C++标准的参考/引用)
  2. 从面向对象的哲学角度来看,这是代码应该表现的方式吗?谁更了解A对象应该如何成为一个B对象, …

c++ constructor operators type-conversion conversion-operator

66
推荐指数
1
解决办法
1万
查看次数

有没有办法让gcc或clang警告明确的演员阵容?

我正在尝试做的是从我有的一些源文件中找到所有类型为double或float的显式转换为任何其他类型.有没有内置的gcc方法来做到这一点?语言是C.谢谢!

c compiler-construction gcc clang

6
推荐指数
2
解决办法
1859
查看次数