Meh*_*dad 16 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;
}
Run Code Online (Sandbox Code Playgroud)
Jer*_*fin 14
暂时忽略这是一个好主意(但事实并非如此)的问题,我们可以质疑这是否真的被允许.
C++标准定义了所有相关的头和函数 - <cstdio>在第27.9.2节中有所介绍.如果你真的想要使用它,<stdio.h>甚至是C++标准(§D.5)的一部分,尽管它已被正式弃用.
这往往表明它是允许的.C标准(第7.19.1/2节)的措辞是:
Run Code Online (Sandbox Code Playgroud)FILE这是一种能够记录控制流所需的所有信息的对象类型,包括其文件位置指示符,指向其关联缓冲区的指针(如果有),记录是否发生读/写错误的错误指示符,以及文件结束指示符,记录是否已到达文件的末尾;
问题是a FILE是否真的需要直接表示该类型,或者是否(例如)typedefd d void,因此(例如)fopen实际返回a void *.使用它的库的内部将其转换为正确的类型,但对于外部世界(即,您的程序),它是完全不透明的.特别是,如果它是a void *,你不能取消引用它,甚至不能只获取引用而不是指针.
我猜这主要是理论上的.我认为一般来说,假设这FILE是一个可以进行重载的唯一类型是相当安全的.你不应该假设它所指向的内部的任何内容,但你相当安全,假设你可以取消引用它来获得引用而不是指针(并且相当安全,假设重载将与其他类型的重载区分开来)如整数).
| 归档时间: |
|
| 查看次数: |
516 次 |
| 最近记录: |