2013-05-05 32 views
15

Tôi đã gặp phải điều này trong khi biên soạn một số mã di động trong gcc. Về cơ bản, mã lạ này biên dịch trong Visual studio thực sự chỉ thổi tâm trí của tôi:Tham chiếu không const ràng buộc với lỗi Visual Studio tạm thời?

class Zebra {int x;}; 
Zebra goo() {Zebra z; return z;} 
void foo(Zebra &x) 
{ 
    Zebra y; 
    x = y; 
    foo(goo()); 
} 

Visual studio cho phép điều này bay. gcc sẽ bắt lỗi này dưới dạng lỗi biên dịch. Điều thú vị là, nếu bạn gõ Zebra vào int, VC++ sẽ khiếu nại. Hành vi khá mâu thuẫn. Suy nghĩ?

+11

Nó không phải là một lỗi, nó là một phần mở rộng trình biên dịch, và một cái ác ở đó. – chris

+1

MSVC hiện có 'cảnh báo C4239: phần mở rộng không chuẩn được sử dụng', nhưng dường như bạn đã tắt cảnh báo đó. – MSalters

+2

Tôi không thấy lý do tại sao bạn cần sử dụng chức năng đệ quy vô hạn để giới thiệu tính năng này. – Neutrino

Trả lời

18

Đây là phần mở rộng cũ để Visual Studio, tài liệu tham khảo duy nhất tôi có thể tìm thấy trên trang web của Microsoft đã được báo cáo lỗi này: Temporary Objects Can be Bound to Non-Const References, trong đó có các mã ví dụ sau:

struct A {}; 

A  f1(); 
void f2(A&); 

int main() 
{ 
    f2(f1()); // This line SHALL trigger an error, but it can be compiled without any  errors or warnings. 
} 

Một trong các câu trả lời ghi chú:

There is a level 4 warning (level 4 warning are enabled if you pass /W4 to the compiler) for it

bài viết trên blog này: Visual C++ is so Liberal trong đó bao gồm phần mở rộng này nhấn mạnh rằng:

Using Disable Language Extensions (/Za) makes it an error:

2

Như những người khác đã nói, điều này là do phần mở rộng Microsoft C++. Mặc dù /Za cờ không được khuyến khích vì nó có thể phá vỡ mọi thứ.

Thay vào đó, hãy sử dụng công tắc /permissive- để tuân thủ các tiêu chuẩn tốt hơn và bạn sẽ nhận được lỗi lành mạnh cho những trường hợp này. Lưu ý rằng cờ này có sẵn kể từ VS 2017.

The switch /Za does not support certain key Microsoft SDK header files. By contrast /permissive- offers a useful conformance mode where input C++ code is interpreted according to ISO C++ rules but also allows conforming extensions necessary to compile C++ on targets supported by Visual C++.

Thông tin thêm là trên Visual C++ Team Blog.

+0

Có thể đáng chú ý là cờ '/ permissive' có sẵn từ năm VS 2017. Bạn có thể cải thiện câu trả lời này bằng cách bao gồm các trích dẫn có liên quan từ bài báo. Giống như những gì đang làm, tại sao đã được giới thiệu và mối quan hệ của nó với '/ Za' – bolov

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