Một câu lệnh thường được sử dụng như (void)x;
cho phép chặn cảnh báo về biến không sử dụng x
. Nhưng nếu tôi cố gắng biên soạn sau đây, tôi nhận được một số kết quả tôi không hoàn toàn hiểu:Việc truyền tới `void` thực sự là gì?
int main()
{
int x;
(short)x;
(void)x;
(int)x;
}
Biên dịch này với g ++, tôi nhận được những lời cảnh báo sau đây:
$ g++ test.cpp -Wall -Wextra -o test
test.cpp: In function ‘int main()’:
test.cpp:4:13: warning: statement has no effect [-Wunused-value]
(short)x;
^
test.cpp:6:11: warning: statement has no effect [-Wunused-value]
(int)x;
^
Vì vậy, tôi kết luận rằng đúc để void
rất khác với việc truyền sang bất kỳ loại nào khác, là loại mục tiêu giống như decltype(x)
hoặc một cái gì đó khác. Dự đoán của tôi tại các giải thích có thể có là:
- Nó chỉ là quy ước
(void)x;
nhưng không phải các phôi khác sẽ ngăn chặn cảnh báo. Tất cả các báo cáo đều không có hiệu lực. - Sự khác biệt này bằng cách nào đó liên quan đến thực tế là
void x;
không phải là tuyên bố hợp lệ trong khishort x;
là.
Điều nào trong số này nếu có chính xác hơn? Nếu không, thì làm thế nào có thể sự khác biệt trong các cảnh báo trình biên dịch được giải thích?
Nó chỉ là một quy ước giữa các trình biên dịch mà diễn viên này ngăn chặn cảnh báo. Tiêu chuẩn C++ không đề cập đến các cảnh báo cho "tuyên bố không có hiệu lực". –