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ủastd::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")
và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ủaoperator string_type() const
sẽ gây ra một số loạip + 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.
https://timsong-cpp.github.io/lwg-issues/2668 –
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
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ô. –