C ++ 17 giới thiệu [[nodiscard]]
thuộc tính, cho phép lập trình viên đánh dấu các hàm theo cách trình biên dịch tạo cảnh báo nếu đối tượng trả về bị loại bỏ bởi người gọi; cùng một thuộc tính có thể được thêm vào toàn bộ một loại lớp.
Tôi đã đọc về động lực cho tính năng này trong đề xuất ban đầu và tôi biết rằng C ++ 20 sẽ thêm thuộc tính vào các hàm tiêu chuẩn như std::vector::empty
, tên của chúng không truyền đạt ý nghĩa rõ ràng về giá trị trả về.
Đó là một tính năng thú vị và hữu ích. Trong thực tế, nó gần như quá hữu ích. Ở mọi nơi tôi đọc [[nodiscard]]
, mọi người thảo luận về nó như thể bạn chỉ cần thêm nó vào một vài chức năng hoặc loại đã chọn và quên đi phần còn lại. Nhưng tại sao một giá trị không thể loại bỏ phải là một trường hợp đặc biệt, đặc biệt là khi viết mã mới? Không phải là một giá trị trả lại bị loại bỏ thường là một lỗi hoặc ít nhất là lãng phí tài nguyên?
Và không phải là một trong những nguyên tắc thiết kế của chính C ++ mà trình biên dịch sẽ bắt càng nhiều lỗi càng tốt?
Nếu vậy, tại sao không thêm [[nodiscard]]
mã không thuộc tính kế thừa của riêng bạn vào hầu hết mọi loại không void
chức năng và hầu hết mọi loại lớp đơn?
Tôi đã cố gắng làm điều đó bằng mã của riêng mình và nó hoạt động tốt, ngoại trừ nó quá dài đến nỗi nó bắt đầu giống như Java. Theo mặc định, có vẻ tự nhiên hơn nhiều khi trình biên dịch cảnh báo về các giá trị trả về bị loại bỏ theo mặc định trừ một số trường hợp khác mà bạn đánh dấu ý định của mình [*] .
Vì tôi đã thấy không có cuộc thảo luận nào về khả năng này trong các đề xuất tiêu chuẩn, mục blog, câu hỏi về Stack Overflow hoặc bất cứ nơi nào khác trên internet, tôi phải thiếu một cái gì đó.
Tại sao các cơ chế như vậy sẽ không có ý nghĩa trong mã C ++ mới? Có phải sự dài dòng là lý do duy nhất để không sử dụng [[nodiscard]]
hầu hết mọi nơi?
[*] Về lý thuyết, bạn có thể có một cái gì đó giống như một [[maydiscard]]
thuộc tính thay vào đó, cũng có thể được thêm hồi tố vào các chức năng như printf
trong triển khai thư viện chuẩn.
const
có thể làm mờ một lớp "đơn giản" khác (hay đúng hơn là "đối tượng dữ liệu cũ đơn giản") đáng kể trong C ++.
std::vector
hoặc std::unique_ptr
, trong đó bạn chỉ cần các thành viên dữ liệu trong định nghĩa lớp của mình. Tôi đã làm việc với cả hai ngôn ngữ; Java là một ngôn ngữ ổn, nhưng nó dài dòng hơn.
operator =
ví dụ. Vàstd::map::insert
.