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

Sequential Type Casting of User Defined Type in C++

本文关键字:顺序 类型转换 类型 定义 用户 C++      更新时间:2023-10-16

此代码编译和运行时使用公共隐式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;
}

编辑:根据要求,显示相关编译器消息。

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

多路

int-conv

分配操作

int-conv

哦,不!

2) 带有公共布尔类型转换的代码的输出:

多路

int-conv

分配操作

bool-conv

哦,不!

3) 如果布尔强制转换为私有,则编译器错误:

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

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

如果定义了operator bool(),那么这提供了比operator int()更好的转换,随后是从intbool的转换;转换次数较少的路径被视为"更好"。

在这个过程中没有考虑可访问性,所以它会选择operator bool(),即使它是私有的。然后编译将失败,因为operator bool()是私有的。

简而言之,编译器先选择要调用的方法,然后检查是否允许执行它。当它能看到与if检查最匹配的operator bool时,它会选择那个方法,然后发现它是私有的,不能使用。

还要注意,(a * b = c)c分配给乘法返回的临时值,然后计算它是零还是非零。我想不出这样的东西会有什么用处。