请问operator void *() const 是啥东西

时间:2021-05-11 17:07:16
在C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\xiosbase第262行看到 __CLR_OR_THIS_CALL operator void *() const
{ // test if any stream operation has failed
return (fail() ? 0 : (void *)this);
}
这个函数是什么意思?重载了什么操作符?

12 个解决方案

#1


重载了自定义类型转换符void *
具体去看《C++ Primer》“运算符重载”的章节。

#2


void* p = (void*)obj;
这时候就会调这个函数

#3


那么为啥while(getline(......))也会自动默认调用?所有的对象都默认是返回void*的?

#4


楼主还是看书吧。

#5


说不清楚,看书好

#6


hehe

#7


说不清楚,,

#8


重载了*操作符,以后再使用“*”,就会在fail()有效的时候,返回0,这样重载的目的我想是为了提高“*”操作符的安全性。

#9


这个是为了实现operator bool的。
首先
class Bar
{
    operator T()
    {
         return T();
    }
}
void foo(T t); 
//调用
Bar bar;
foo(bar);

foo函数要求的是T参数的接口,而并没有bar内型的接口,但是Bar有一个隐式转换函数转换成T类型,编译器这里会自动调用的。

而你问题中的operator*,
当while (getline()),按照你的意思是getline返回某个对象,但是while要求的是一个bool类型啊,不是那个对象类型,于是编译器去找这个对象里是否有隐式转换函数,它找到了void*类型,而指针类型是可以直接用来当作bool判断的,于是就编译通过了
int *p = 0;
if (!p)
   DebugBreak();

另外想提醒你一下的是,在<<Imperfect C++>>(中文名叫"不完美C++")里有一章专门叫operator bool。
最安全的operator bool的方式是:
class Foo
{
private:
    struct boolean { int i; };
public:
    operator int boolean*() const
    {
         return <condition> ? boolean::i : NULL;
    }
};

对象成员的指针编译器实现的时候可能是一个相对于对象首地址的偏移量,它不能转换到void*去,因此是最好的operator bool

};

#10


ofstream ofs("xx.txt");
if (ofs)
{
  ...
}

这里之所以能够用if语句判断ofs是否正常打开了文件,就是因为ofstream重载了operator void *。在if语句的括号中,ofs被强制转换成了void *,如果文件没有正常打开,那么值为0(NULL)。

#11


operator void *() const

这是一种偷懒的做法,逃避了类型检查,虽然使得类型间的转换更加方便,但是不提倡使用

#12


重载 类型转换操作 void *

这样可是很那个啥的...

#1


重载了自定义类型转换符void *
具体去看《C++ Primer》“运算符重载”的章节。

#2


void* p = (void*)obj;
这时候就会调这个函数

#3


那么为啥while(getline(......))也会自动默认调用?所有的对象都默认是返回void*的?

#4


楼主还是看书吧。

#5


说不清楚,看书好

#6


hehe

#7


说不清楚,,

#8


重载了*操作符,以后再使用“*”,就会在fail()有效的时候,返回0,这样重载的目的我想是为了提高“*”操作符的安全性。

#9


这个是为了实现operator bool的。
首先
class Bar
{
    operator T()
    {
         return T();
    }
}
void foo(T t); 
//调用
Bar bar;
foo(bar);

foo函数要求的是T参数的接口,而并没有bar内型的接口,但是Bar有一个隐式转换函数转换成T类型,编译器这里会自动调用的。

而你问题中的operator*,
当while (getline()),按照你的意思是getline返回某个对象,但是while要求的是一个bool类型啊,不是那个对象类型,于是编译器去找这个对象里是否有隐式转换函数,它找到了void*类型,而指针类型是可以直接用来当作bool判断的,于是就编译通过了
int *p = 0;
if (!p)
   DebugBreak();

另外想提醒你一下的是,在<<Imperfect C++>>(中文名叫"不完美C++")里有一章专门叫operator bool。
最安全的operator bool的方式是:
class Foo
{
private:
    struct boolean { int i; };
public:
    operator int boolean*() const
    {
         return <condition> ? boolean::i : NULL;
    }
};

对象成员的指针编译器实现的时候可能是一个相对于对象首地址的偏移量,它不能转换到void*去,因此是最好的operator bool

};

#10


ofstream ofs("xx.txt");
if (ofs)
{
  ...
}

这里之所以能够用if语句判断ofs是否正常打开了文件,就是因为ofstream重载了operator void *。在if语句的括号中,ofs被强制转换成了void *,如果文件没有正常打开,那么值为0(NULL)。

#11


operator void *() const

这是一种偷懒的做法,逃避了类型检查,虽然使得类型间的转换更加方便,但是不提倡使用

#12


重载 类型转换操作 void *

这样可是很那个啥的...