2012-02-08 46 views
6

C sau ++ là không hợp lệ vì các biến tài liệu tham khảo cần initializers:Khởi tạo biến tài liệu tham khảo với các nhà điều hành có điều kiện

int& a; // illegal 
if (isfive) { 
    a = 5; 
} else { 
    a = 4; 
} 

Tuy nhiên, MSVC dường như nghĩ rằng đây là okay:

int& a = isfive ? 5 : 4; 

Điều này ngụ ý với tôi rằng MSVC thực sự xử lý toán tử điều kiện như một biểu thức đơn lẻ và không mở rộng nó thành một câu lệnh if-else.

Luôn luôn hợp lệ C++ để khởi tạo tham chiếu bằng toán tử có điều kiện?

+0

Tôi tò mò điều gì sẽ xảy ra nếu bạn cố so sánh nó ở cấp độ lắp ráp ... – beta0x64

+3

Làm thế nào để bạn có thể so sánh trên mã mức độ phức tạp để biên dịch và mã không? –

+0

Nó làm gì? Xin vui lòng gửi lắp ráp! :-) – Florian

Trả lời

5

MSVC có phần mở rộng không chuẩn ". Điều đó có nghĩa là nó cho phép mã bị hỏng. Có một lý do chính đáng là điều này bị cấm.

Cũng lưu ý rằng

int& a = 5; 

là không hợp pháp trong tiêu chuẩn C++ hoặc.

Nói chung, việc khởi tạo tham chiếu const là hợp pháp với bất kỳ biểu thức nào có thể được chuyển thành đúng loại (bao gồm cả việc sử dụng toán tử điều kiện). Và nó là hợp pháp để khởi tạo một tham chiếu không phải là const với một giá trị đúng loại, mà toán tử điều kiện mang lại trong các điều kiện nhất định.

+1

Bạn biết gì, hỏi câu hỏi này đã giải quyết được vấn đề mà tôi thậm chí không biết tôi có. Cảm ơn! – Kai

0

Đây là toán tử, một phần của biểu thức, không phải là câu lệnh. Và bạn không thể để tham chiếu chưa được khởi tạo ngay cả trong một thời gian ngắn ;-)

3

Toán tử điều kiện là biểu thức, không phải là câu lệnh. Nó là hoàn toàn tốt đẹp để khởi tạo một tham chiếu như thế. Nó giống như khởi tạo một tham chiếu bằng cách gọi một hàm.

Lưu ý rằng tham chiếu của bạn cần phải là const nếu bạn liên kết nó với thời gian (một quy tắc mà MSVC++ ngu ngốc bỏ qua).

+0

* Tốt thôi là khởi tạo một tham chiếu như thế * chỉ khi chúng ta bỏ qua thực tế là bạn không thể liên kết tham chiếu không const với một giá trị ... (tức là 'const int & r = isfive? 4: 5;' là tốt , nhưng 'int & r = isfive? 4: 5;' không phải là) –

+0

@ DavidRodríguez-dribeas yeah, tôi đã thêm một lưu ý về điều đó một lúc trước. –

2

Mã bạn được đăng không biên dịch với VC++ 2010:

Lỗi 1 lỗi C2440: 'khởi': không thể chuyển đổi từ 'int' thành 'int &'

Thay đổi dòng để:

const int& a = isfive ? 5 : 4; 

làm cho nó biên dịch.

+0

Tôi cho rằng bạn đang sử dụng tùy chọn '/ Za' (tắt tiện ích mở rộng ngôn ngữ)? –

+0

@BenVoigt: Không. Có vẻ như vấn đề đã được sửa: http://technet.microsoft.com/en-us/query/szywdw8k –

+0

Tôi tự hỏi điều gì đang làm trên TechNet thay vì MSDN. Vẫn còn một số lỗi liên quan, nhưng vui mừng khi thấy trường hợp điển hình nhất là cố định. –

1

nó không phải là OK

int& a = isfive ? 5 : 4; 

trừ khi bạn khai báo tài liệu tham khảo "a" như một const.

4

Toán tử bậc ba không mở rộng thành cấu trúc if-else (không theo ngôn ngữ, việc triển khai có thể tạo các tệp nhị phân tương đương, nhưng ở cấp độ ngôn ngữ khác nhau). Vì vậy, mã sau đây là hợp lệ:

int four = 4, five = 5; 
int& r = condition? four : five; 

Ví dụ ban đầu trong câu hỏi phụ thuộc vào phần mở rộng của Microsoft (không chính xác) cho phép ràng buộc tham chiếu không const tham chiếu đến biểu thức giá trị.

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