C++中用户定义类型的顺序类型转换

Pra*_*tic 3 c++ casting

此代码编译并运行公共隐式bool强制转换(在下面注释,在http://ideone.com/FDJHB)或通过公共隐式int强制转换,后跟隐式int到bool强制转换(如下所示,http: //ideone.com/kHQ46).但是,将bool强制转换为私有(在http://ideone.com/4poze下面注释掉)会导致编译错误.在这种情况下,为什么通过int的路由不再是一个选项?像这样的连续演员是否定义了行为?谢谢.

http://ideone.com/kHQ46

#include <iostream>

class MyObject {
 public:
  MyObject(int theInt) : theInt_(theInt) {
    return;
  }

  MyObject& operator=(MyObject& source) {
    std::cout << "assign op" << std::endl;
    theInt_ = source.theInt_;
    return *this;
  }

  friend MyObject operator*(MyObject& lhs, MyObject& rhs);

  operator int() {
    std::cout << "int conv" << std::endl;
    return theInt_;
  }

/*
  operator bool() {
    std::cout << "bool conv" << std::endl;
    return theInt_;
  }
*/

 private:

  int theInt_;

  MyObject(MyObject& source);
//  operator bool();

};

MyObject operator*(MyObject& lhs, MyObject& rhs) {
  std::cout << "mult op" << std::endl;
  return MyObject(lhs.theInt_*rhs.theInt_);
}


int main(int argc, char* argv[]) {

  MyObject a(1);
  MyObject b(2);
  MyObject c(3);

  if (a * b = c) std::cout << "Oh-no!" << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:根据要求,相关的编译器消息.

1)输出代码给定,转换为int到bool:

多操作

int conv

分配操作

int conv

不好了!

2)使用public bool cast输出代码:

多操作

int conv

分配操作

bool conv

不好了!

3)如果bool强制私有的编译器错误:

prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:34: error: ‘MyObject::operator bool()’ is private
prog.cpp:50: error: within this context
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 5

为了将您的类型转换为bool,编译器根据(相当复杂的)规则集选择"最佳"转换路径.

如果operator bool()被定义,则提供更好的转换比operator int(),随后从一个转换intbool; 转换次数较少的路径被视为"更好".

在此过程中不考虑可访问性,因此operator bool()即使它是私有的,它也会选择.然后编译将失败,因为operator bool()是私有的.