相关疑难解决方法(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万
查看次数

static_cast转换构造函数与转换运算符

阅读本文后,我尝试进行以下转换static_cast:

class A;

class B { 
      public: 
         B(){} 

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

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

int main()
{
    A a;

    //Original code, This is ambiguous, 
    //because both operator and constructor have same cv qualification (use -pedantic flag)
    B b = a;

    //Why isn't this ambiguous, Why …
Run Code Online (Sandbox Code Playgroud)

c++ gcc casting static-cast

8
推荐指数
1
解决办法
759
查看次数