2015-06-16 32 views
6

Hôm nay tôi thấy một số mã như thế này:'const decltype ((a))' không khai báo tham chiếu const?

int a = 0; 
const decltype((a)) x = 10; // Error 

const int b = 0; 
decltype ((b)) y = 42; // Correct 

tôi có thể thấy lý do tại sao mã đúng là đúng, nhưng tôi không thể hiểu tại sao mã không chính xác là không chính xác.

Tôi đã thử nghiệm và chỉ thấy nó hơi lạ lùng.

const decltype((a)) x = 10; Điều này cần xác định const int& phải không? Nhưng nó không biên dịch! error: non-const lvalue reference to type 'int' cannot bind to a temporary of type 'int'.

Tôi đã đổi nó thành const decltype((a)) x = a; sau đó nó biên dịch.

Vâng, là x tham chiếu const? Không, tôi thấy rằng đó là một tham chiếu không phải const. Tôi có thể sửa đổi giá trị a thông qua x.

Tại sao công cụ sửa đổi const không có hiệu lực?

+4

'const' được áp dụng cho tham chiếu (và bỏ qua), thay vì loại được nhắc đến. –

+3

kết hợp 'decltype' với công cụ sửa đổi hoạt động chính xác như áp dụng công cụ sửa đổi cho loại' typedef'-ed. Nó KHÔNG phải là sự thay thế văn bản. –

+0

@ T.C. @ ben-voigt Ồ, tôi hiểu rồi. Vì vậy, 'const' được áp dụng cho toàn bộ phần thân của' int & 'thành' const tham chiếu đến int', không chỉ kết hợp với nó là 'const int &', tham chiếu đến const int ... Đúng không? – CyberLuc

Trả lời

8

phần sai là sai vì const được áp dụng cho toàn bộ kiểu đó là int& và thêm const để int& làm cho nó int& const đó là const tham chiếu đến int. Nhưng tham chiếu là const bởi chính tính chất của nó nên phần const chỉ bị bỏ qua. Do đó, loại kết quả vẫn là int&

Các vấn đề liên quan