Я читал через Stroustrups С++ (3ed, 1997), чтобы увидеть, как он реализовал RAII, и на странице 365 я нашел это:
class File_ptr{
FILE* p;
public:
File_ptr(const char* n, const char* a){p = fopen(n, a);}
File_ptr(FILE* pp) { p = pp; }
~File_ptr() {fclose(p);}
operator FILE* () {return p;}
};
Реализация конструкторов и деструкторов очевидна и соответствует идиоме RAII, но я не понимаю, почему он использует operator FILE* () {return p;}
.
Это приведет к использованию File_ptr
следующим образом:
FILE* p = File_ptr("myfile.txt", "r");
Результат в закрытом p
, который семантически неуместен в этом случае. Кроме того, если File_ptr
предназначен для использования как RAII, этот оператор позволяет использовать его неправильно, как в примере. Или я что-то упускаю?