2011-08-15 30 views
9

Tôi có bản đồ này mà biên dịch tốt trong MSVC10:Có phải std :: ofstream movable?

std::map<std::string, std::ofstream> m_logFiles; 

Nhưng trên ubuntu sử dụng g ++ 4.5 với C++ 0x kích hoạt, tôi nhận được thông báo lỗi sau:

/usr/include/C++/4.5/bit/ios_base.h | 785 | lỗi: 'std :: ios_base :: ios_base (const std :: ios_base &)' là riêng tư

Bằng cách sử dụng con trỏ thay vì đối tượng, tôi giải quyết được sự cố.
Tìm kiếm trên web, tôi đã học được rằng các luồng không có nghĩa là được sao chép (lý do tại sao đã được giải thích rõ ràng). Nhưng câu hỏi của tôi là, là std :: ofstream một loại di chuyển? Nếu có, nó có nên cho phép sử dụng nó như một tham số mẫu trong các thùng chứa tiêu chuẩn không?
Nếu có, sau đó là g ++ phía sau MSVC10 vào thời điểm này? (mà sẽ giải thích tại sao nó hoạt động trên MSVC). Tôi biết nó sẽ là ngớ ngẩn khi yêu cầu các nhà biên dịch biên dịch thực hiện đầy đủ điều gì đó thậm chí không phải là cuối cùng, nhưng tôi tò mò về tương lai.

Sử dụng g ++ 4.6.1 không hữu ích.

Chỉnh sửa: đọc nhận xét tôi đã đào sâu thêm một chút và nhận thấy rằng chèn đang gây ra sự cố, chứ không phải việc khai báo bản đồ.

link Reading Cubbi của tôi thử như sau:

#include <string> 
#include <fstream> 
#include <map> 

using namespace std; 

int main() 
{ 
    map<string, ofstream> m_logFiles; 
    ofstream st; 
    m_logFiles.insert(make_pair<string, ofstream>(string("a"), move(st))); 
    return 0; 
} 

Nhưng vẫn không có may mắn. g ++ than phiền về việc sử dụng b constructor đã bị xóa.

+0

Biên dịch tốt trong GCC 4.6.1. –

+0

Mã đăng cũng biên dịch tốt trong GCC 4.5.3. Tuy nhiên, thư viện của GCC (không giống như libC++ của clang) vẫn chưa triển khai map.emplace() http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44436 - có lẽ đó là nguyên nhân gây ra thông báo lỗi? – Cubbi

+0

@Cubbi: Tôi đã đọc liên kết của bạn và thử sử dụng std :: move, nhưng không thay đổi. –

Trả lời

8

std::ofstream có thể di chuyển được. Chương trình này biên dịch cho tôi bằng cách sử dụng clang/libC++:

#include <string> 
#include <fstream> 
#include <map> 

int main() 
{ 
    std::map<std::string, std::ofstream> m_logFiles; 
} 

Tham khảo 27.9.1.11 [ofstream.cons].

+5

Kết quả trên bất kỳ trình biên dịch nào (hoặc thậm chí nhiều trình biên dịch) không thực sự trả lời câu hỏi này. Một tham chiếu đến spec là cần thiết. – Nemo

+5

@Nemo - Howard là người thực hiện thư viện chuẩn cho trình biên dịch này. Tôi tin anh ta. –

+1

Kiểm tra khá nhiều tất cả phần 27 của bản nháp C++ 0x. Tôi không tìm thấy một nơi duy nhất mà nói "ofstream sẽ được di chuyển", nhưng nó chỉ định rằng các lớp dòng có di chuyển constructors và di chuyển các nhà khai thác chuyển nhượng và tất cả các hệ thống ống nước liên quan đến di chuyển khác. Vì vậy, có, họ đang di chuyển, như @ Howard nói. :) – jalf

5

Tôi đã hỏi một câu hỏi tương tự trước đó, và sau đó thấy rằng GCC dường như không hỗ trợ fstreams di chuyển được (tôi vừa kiểm tra GCC 4.6.1) như được mô tả chi tiết trong this answer.

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