2016-09-02 25 views
6

Tại sao tôi không thể viết mã sau đây?Tại sao tôi không thể sử dụng toán tử bool() cho std :: ofstream

#include <fstream> 
#include <string> 

bool touch(const std::string& file_path) 
{ 
    return std::ofstream(file_path, std::ios_base::app); 
} 

int main() 
{ 
    touch("foo.txt"); 
} 

Output

prog.cpp: In function 'bool touch(const string&)': 
prog.cpp:6:52: error: cannot convert 'std::ofstream {aka std::basic_ofstream<char>}' to 'bool' in return 
    return std::ofstream(file_path, std::ios_base::app); 

http://ideone.com/IhaRaD

Tôi biết rằng std::fstream 's operator bool() định nghĩa là explicit nhưng tôi không thấy bất kỳ lý do tại sao nó nên thất bại trong trường hợp như vậy. Không có chuyển đổi trung gian, chỉ đối tượng std::ofstream tạm thời và bool. Lý do là gì?

+0

Vì toán tử là rõ ràng và không có ngữ cảnh để chuyển đổi thành bool ngầm thì bạn phải chuyển thành bool một cách rõ ràng :) –

+0

Rõ ràng làm cho nó không chuyển thành bool trừ khi bạn gọi trực tiếp diễn viên. –

+1

'return !!' hoạt động ở đây. –

Trả lời

11

Đó là chính xác vìoperator bool() được định nghĩa là explicit mà bạn không thể sử dụng theo cách này. Ngữ cảnh duy nhất trong đó explicit operator bool() được gọi tự động là dành cho các điều kiện rõ ràng, chẳng hạn như if()while(), ?: và biểu thức ở giữa của for().

Nếu bạn muốn chuyển đổi std::ofstream thành giá trị trả về, bạn phải sử dụng static_cast<bool>() hoặc tương đương.

3

Khi toán tử được khai báo rõ ràng và không có ngữ cảnh cho phép chuyển đổi thành bool (ví dụ như sử dụng trong câu lệnh if) thì bạn phải chuyển đổi biểu thức bằng luồng thành bool một cách rõ ràng. Ví dụ

bool touch(const std::string& file_path) 
{ 
    return bool(std::ofstream(file_path, std::ios_base::app)); 
} 
0

Định nghĩa của operator bool trông như thế này:

explicit operator bool() {/*...*/} 

Lưu ý việc sử dụng rõ ràng ở đây, điều này có nghĩa là không đúc tự động từ lớp đến bool. Điều đó có nghĩa cho mã của bạn, bạn phải làm điều này:

#include <fstream> 
#include <string> 

bool touch(const std::string& file_path) 
{ 
    return static_cast<bool>(std::ofstream(file_path, std::ios_base::app)); 
} 

int main() 
{ 
    touch("foo.txt"); 
} 

Không có vấn đề gì, một dàn diễn viên được yêu cầu (tốt nhất static_cast<bool>), vì chuyển đổi ngầm là nguy hiểm.

Các vấn đề liên quan