[conv]/4:[expr.unary.op]/9 có vẻ ngụ ý rằng toán tử `!!()` Không thể áp dụng cho loại A bên dưới. Nhưng trình biên dịch không đồng ý với điều đó
Một số cấu trúc ngôn ngữ yêu cầu rằng một biểu thức được chuyển đổi sang một giá trị Boolean. Một biểu
e
xuất hiện trong một bối cảnh như vậy được cho là là ngữ cảnh chuyển đổi sangbool
và nổi hình thành khi và chỉ khi tờ khaibool t(e);
nổi hình thành, đối với một số phát minh tạm thời biếnt
(11.6).
Hãy xem xét đoạn mã bên dưới. Nó không biên dịch, không phải trong clang, GCC hoặc VS.
struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t(a);
}
Như vậy, từ [conv]/4, chúng tôi kết luận rằng loại A
là không ngữ cảnh chuyển đổi sang bool
.
Các toán hạng của toán tử phủ định logic
!
là ngữ cảnh chuyển đổi sangbool
(khoản 7); giá trị của nó làtrue
nếu toán hạng được chuyển đổi làfalse
vàfalse
nếu không. Loại kết quả làbool
.
sự hiểu biết của tôi về đoạn trên là các toán hạng của toán tử phủ định logic !
phải được theo ngữ cảnh chuyển đổi sang bool
. Chúng tôi vừa kết luận rằng loại A
là không phải được chuyển đổi theo ngữ cảnh thành bool
. Do đó, từ [expr.unary.op]/9, chúng tôi có thể nói rằng mã sau đây cần không phải là biên dịch. Nhưng nó có, trong clang, GCC và VS.
struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t = !a;
}
Tôi đang thiếu gì?
Đó không phải là toán tử phủ định hợp lý, hàm của thành viên đó là toán tử 'A ::!', Là dự đoán của tôi. Tôi tin rằng đây là điều tương tự với toán tử ',', toán tử dấu phẩy có ý nghĩa vốn có ngay cả khi không quá tải, nhưng được xác định rõ khi được cung cấp quá tải –
Thử thay đổi 'bool t (a);' thành 'bool t (! a); 'trong ví dụ đầu tiên của bạn. Như thế nào trình biên dịch có thể đoán nó cần phải áp dụng 'toán tử!'. –
[Khoản \ [expr \] xác định tác động của các toán tử khi áp dụng cho các loại mà chúng không bị quá tải.] (Http://eel.is/c++draft/expr#3.sentence-1) – cpplearner