为什么转换不适用于C++中的自定义运算符?
Why doesn't conversion work with custom operators in C++?
考虑以下代码:
class C {
public:
int operator-(int x) {
return 3-x;
}
};
class wrapper {
public:
operator C() {
static C z;
return z;
}
} wrap;
int main() {
return wrap-3;
}
它在g++上给出了这个错误:
test.cpp: In function ‘int main()’:
test.cpp:17:17: error: no match for ‘operator-’ in ‘wrap - 3’
转换操作员似乎在工作,因为这个版本有效:
class wrapper {
public:
operator int() {
static int z=3;
return z--;
}
} wrap;
int main() {
return wrap-3;
}
operator-
似乎也在工作,因为这段代码编译:
class C {
public:
int operator-(int x) {
return 3-x;
}
};
int main() {
C c
return c-3;
}
这两者结合在一起有什么问题?为什么在隐式转换后不能应用运算符?这个问题有什么解决办法吗?
class C {
};
int operator-(C c, int x) {
return 3-x;
}
来自[over.match.oper]:
--如果T1是一个完整的类类型,则成员候选者的集合是
T1::operator@
的合格查找的结果(13.3.1.1.1);否则,成员候选集合为空。
它不编译(使用GCC),因为它需要链接两个用户定义的转换才能从 标准不允许这样做。请参阅David Rodriguez在另一个帖子中的回答。wrapper
到int
:首先到C
,然后到int
当您返回wrap-3时;编译器不知道如何按顺序将包装器转换为C为了进行计算,它正在寻找一个运算符-in包装器,或者包装器中转换为数字类型。仅仅因为C有一个运算符-不要使编译器隐式转换为它,您可以在包装器中有多个转换运算符,编译器应该转换为哪一个?
要么显式地告诉编译器转换为C,要么像这样添加运算符-到包装器。。
class wrapper {
public:
operator C() {
static C z;
return z;
}
int operator-(int x) {
return C()-x;
}
} wrap;
相关文章:
- 在 C++ 的自定义运算符中删除与删除[](不同于常见的删除与删除[]问题)
- 自定义运算符重载C++,无开销
- 如何使用C++将MXNET自定义运算符构建到单独的库/包中?
- 什么是编程语言支持定义您自己的自定义运算符?
- 在 rxcpp 中创建自定义运算符
- std::map :使用自定义运算符时更新密钥
- 如何在Tensorflow Lite中添加自定义运算符
- 如何在 rxcpp 自定义运算符中正确推断泛型
- 如何将上下文信息传递给自定义运算符<<适用于 std::iostream
- C++ 自定义运算符(+=) 的行为方式不可预测
- 尝试创建自定义<<运算符 c++
- BOOST_CHECK_EQUAL具有 pair<int、int> 和自定义运算符<<
- 将多个逗号分隔的参数传递给自定义<<运算符
- 如何使 QList<Type*> 与 indexOf() 和自定义运算符==()一起使用?
- C++ 自定义运算符新增
- 使用自定义运算符将binary_search与std::配对
- 为什么转换不适用于C++中的自定义运算符?
- 使用自定义运算符减少OpenMP SIMD
- 在命名空间中使用带有自定义运算符<<的 boost::lexical_cast
- 创建自定义运算符c++