C++中用户定义类型的顺序类型转换
Sequential Type Casting of User Defined Type in C++
此代码编译和运行时使用公共隐式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()
更好的转换,随后是从int
到bool
的转换;转换次数较少的路径被视为"更好"。
在这个过程中没有考虑可访问性,所以它会选择operator bool()
,即使它是私有的。然后编译将失败,因为operator bool()
是私有的。
简而言之,编译器先选择要调用的方法,然后检查是否允许执行它。当它能看到与if
检查最匹配的operator bool
时,它会选择那个方法,然后发现它是私有的,不能使用。
还要注意,(a * b = c)
将c
分配给乘法返回的临时值,然后计算它是零还是非零。我想不出这样的东西会有什么用处。
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 事件系统:使用类型转换或联合进行继承
- 如何在参数中定义隐式类型转换的构造函数?
- C++中用户定义类型的顺序类型转换