Hãy xem xét các cấu trúc sau (?):Các void(), các nhà điều hành dấu phẩy (nhà điều hành,) và những điều không thể quá tải
struct S {};
Trong C++ 14, định nghĩa dưới đây là hợp lệ:
constexpr auto f() { return S{}, 'c'; }
cũng như một sau:
constexpr auto f() { return S{}, void(); }
Bây giờ, hãy xem xét những điều sau đây, làm việc có liên quan đến đoạn đầu tiên của hai định nghĩa :
#include<type_traits>
struct S {};
constexpr int operator,(S, char) { return 42; }
constexpr auto f() { return S{}, 'c'; }
int main() {
constexpr int i{f()};
static_assert(i == 42, "!");
static_assert(std::is_same<decltype(f()), int>::value, "!");
}
Phát biểu không quá kỹ thuật, sự quá tải của các nhà điều hành dấu phẩy chặn vài S{}, 'c'
và trả về một số nguyên, như xác nhận một cách chính xác trong main
chức năng.
Bây giờ, giả sử tôi muốn làm điều tương tự với định nghĩa thứ hai của f
:
constexpr auto f() { return S{}, void(); }
Trong trường hợp này, các nhà điều hành dấu phẩy nên chặn dạng S{}, void()
.
Cả công trình sau đây định nghĩa (vì lý do rõ ràng):
constexpr int operator,(S, void) { return 42; }
Cũng không phải hình dưới đây (mà có thể đã làm việc trong trường hợp trước):
template<typename T> constexpr int operator,(S, T &&) { return 42; }
Có cách nào để quá tải các dấu phẩy toán tử để xử lý S{}, void()
?
Không phải là nó thiếu một tiêu chuẩn, vì nó cho phép sử dụng toán tử dấu phẩy theo cách đó, nhưng không cho bạn cơ hội để quá tải cùng một toán tử (ngay cả khi the standard mentions that overloaded functions involving S
are allowed)?
Note: Câu hỏi này được thực hiện vì lợi ích của sự tò mò. Xin vui lòng, tránh các ý kiến như không làm điều đó hoặc nó không phải là thực hành tốt. Tôi không có ý định làm điều đó trong môi trường sản xuất. Cảm ơn bạn.
Thật là điên rồ;) –
@JesperJuhl Vâng, tôi biết. Tiêu chuẩn du kích. Tôi đang khám phá các góc tối nghĩa nhất của ngôn ngữ. :-) – skypjack
Thay đổi toán tử ',' thành '+' cho đối số "có thể không có lỗi 'loại' void '. – kennytm