C++ 隐式转换与泛函算子
我正在学习函数运算符,不明白为什么要编译这样的代码片段:C++ 隐式转换与泛函算子,c++,implicit-conversion,C++,Implicit Conversion,我正在学习函数运算符,不明白为什么要编译这样的代码片段: class Pocket { int value; public: Pocket(int value) :value(value) {} int getValue() const { return value; } operator int() const { return value; } bool operator<(cons
class Pocket
{
int value;
public:
Pocket(int value) :value(value) {}
int getValue() const
{
return value;
}
operator int() const
{
return value;
}
bool operator<(const Pocket & _Right) const
{
return value < _Right.value;
}
};
int main() {
Pocket mynumbers1[] = { 3, 9, 2, -4, 4 };
Pocket mynumbers2[] = { 3, 9, 5, 0, 4 };
vector<Pocket> v1(mynumbers1, mynumbers1 + 5);
vector<Pocket> v2(mynumbers2, mynumbers2 + 5);
vector<Pocket> v3(5, 0);
transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), minus<Pocket>());
return 0;
}
类口袋
{
int值;
公众:
口袋(int值):值(value){}
int getValue()常量
{
返回值;
}
运算符int()常量
{
返回值;
}
bool运算符用户定义的转换函数,可在代码中进行以下初始化:
Pocket mynumbers1[] = { 3, 9, 2, -4, 4 };
Pocket mynumbers2[] = { 3, 9, 5, 0, 4 };
当将减号应用于给定范围时,编译器也将在转换
调用中使用:
transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), minus<Pocket>());
transform(v1.begin()、v1.end()、v2.begin()、v3.begin()、减号());
如果要删除运算符int()const
转换函数,则初始化和转换都不起作用
但是,如果要使转换函数显式化,它可以用于初始化,但不能用于转换。请参见演示
本标准的相关章节:
15.3.2转换函数[class.conv.fct]
…
2.转换函数可以是显式的,在这种情况下,它仅被视为用于直接初始化的用户定义转换。否则,用户定义转换不限于在赋值和初始化中使用
编译器将使用Pocket
的显式cast运算符推断出minus()
的可能转换。您从哪里收集到的用户定义转换将不会起作用?“以及到int
的转换,这两个参数的类型相同,因此不应考虑。”这句话很不清楚,你能详细解释一下为什么你认为这应该适用吗?你的推理不正确-编译器将使用你指定的用户定义转换。为了证明这一点,请从Pocket
类中删除运算符int
-你将看到代码不再编译。