2017-09-10 15 views
10

Xem xét các xác nhận sau về phân tách đường dẫn, trong đó mỗi biến cục bộ, ví dụ: stem có khởi tạo rõ ràng, ví dụ: auto stem = path.stem() -Tại sao tăng :: filesystem :: path và std :: filesystem :: toán tử đường dẫn +?

assert(root_path == root_name/root_directory); 
assert(path == root_name/root_directory/relative_path); 
assert(path == root_path/relative_path); 

assert(path == parent_path/filename); 
assert(filename == stem + extension); 

này tất cả các công trình, ngoại trừ dòng cuối cùng - vì fs::path không định nghĩa một operator+. Nó có operator+=, nhưng không có operator+.

Câu chuyện ở đây là gì?


Tôi đã xác định rằng tôi có thể thực hiện việc biên dịch mã này bằng cách thêm operator+ của riêng mình. Có lý do nào để không làm điều này không? (. Chú ý đây là trong không gian tên riêng của tôi, tôi sẽ không mở lại namespace std)

fs::path operator+(fs::path a, const fs::path& b) 
{ 
    a += b; 
    return a; 
} 

giả thuyết duy nhất của tôi về đề tài này là:

  • Có lẽ các nhà thiết kế lo lắng rằng operator+ sẽ là quá dễ dàng bị nhầm lẫn với số operator+ của std::string. Nhưng điều đó có vẻ ngớ ngẩn, vì nó thực sự giống hệt nhau về mặt ngữ nghĩa (vậy tại sao lại quan tâm nếu nó bị xáo trộn?). Và nó cũng có vẻ như các nhà thiết kế không quan tâm đến sự nhầm lẫn người mới khi họ thiết kế path.append("x") để làm điều gì đó ngữ nghĩa khác nhau từ str.append("x")path.concat("x") để làm điều gì đó ngữ nghĩa cùng như str.append("x").

  • Có thể path chuyển đổi tiềm ẩn của operator string_type() const sẽ gây ra một số loại p + q trở nên mơ hồ. Nhưng tôi đã không thể đưa ra bất kỳ trường hợp như vậy.

+4

https://timsong-cpp.github.io/lwg-issues/2668 –

+0

Lý do từ liên kết ở trên: * "12 yêu cầu quá tải bởi toán tử basic_string + làm tôi sợ, và tôi chưa bao giờ đã quay lại vấn đề. "* Huh. Đối với ginormous như ' 'là, tôi thực sự không mong đợi" meh, laziness "sẽ là câu trả lời cuối cùng! : P – Quuxplusone

+4

Nó không phải là chính xác sự lười biếng, nhưng là * sợ hãi * khi xem xét số lượng quá tải. Và chúng tôi đã có những phàn nàn rằng quá tải 12 'chuỗi' không đủ khi chúng ta có' string_view' - không có 'string' +' string_view'. Ở đây nó sẽ là nhiều, nhiều hơn nữa. Khi bạn có 'path' +' path', ai đó sẽ yêu cầu 'path' +' string' (đó là 'path' +' wstring' trên Windows), 'path' +' string_view', 'path' +' const char * ',' path' + 'char'. Và sau đó tất nhiên 'string' +' path', vv để nhân đôi số. Và các phiên bản lvalue và rvalue của toàn bộ lô. –

Trả lời

1

này đã được nhập như một khiếm khuyết so với thư viện hệ thống tập tin, và vì sự phức tạp giao diện và khả năng để làm việc xung quanh bằng cách chuyển đổi thành các chuỗi và trở lại con đường, nó được đánh giá là không có một khiếm khuyết. Đọc tất cả về nó tại đây: https://timsong-cpp.github.io/lwg-issues/2668

+0

Điều này thích hợp hơn làm nhận xét. Cân nhắc nhận xét khi bạn có đại diện. –

+1

@TomAranda Âm thanh như một câu trả lời cho tôi. –

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