是否可以定义运算符<<或运算符>> for FILE&?

时间:2014-06-23 05:37:09

标签: c++ c operator-overloading language-lawyer

这可能听起来像一个奇怪的问题,但我可以安全地为operator<<对象定义operator>>FILE,还是会违反C或C ++标准中的潜在条款,还是可能导致其他问题?

(是的,我了解C ++ I / O流。我询问这是否是的想法。我问我是否允许。)

示例:

#include <stdio.h>

FILE &operator>>(FILE &file, int &d)
{
    if (fread(&d, sizeof(d), 1, &file) != 1)
    { throw "I/O error"; }
    return file;
}

int main()
{
    int x;
    FILE *file = fopen("File.bin", "rb");
    *file >> x;
    fclose(file);
    return x;
}

1 个答案:

答案 0 :(得分:14)

暂时忽略这是一个好主意(但事实并非如此)的问题,我们可以质疑这是否真的被允许。

C ++标准定义了所有相关的头和函数 - {27}中涵盖了<cstdio>。如果你真的想使用它,<stdio.h>甚至是C ++标准(§D.5)的一部分,尽管它已被正式弃用。

这往往表明它是允许的。 C标准(第7.19.1 / 2节)的措辞是:

        FILE
     

是一种能够记录控制所需信息的对象类型   流,包括其文件位置指示器,指向其关联缓冲区的指针(如果有),记录是否发生读/写错误的错误指示符,以及文件结尾   记录是否已到达文件末尾的指示符;

问题是,FILE是否真的需要直接表示该类型,或者可能(例如)typedef d到void,所以(例如){{ 1}}实际上返回fopen。使用它的库的内部将其转换为正确的类型,但对于外部世界(即,您的程序),它是完全不透明的。特别是,如果它是void *,则不能取消引用它,甚至不能仅仅获取引用而不是指针。

我猜这主要是理论上的。我认为一般来说,假设void *是一个可以进行重载的唯一类型是相当安全的。你不应该假设它所指向的内部的任何内容,但你相当安全,假设你可以取消引用它来获得引用而不是指针(并且相当安全,假设过载将与其他类型的重载区分开来)如整数)。