2011-08-17 4 views
14

Trong VS 2010 SP1, sau đây:"xóa" sao chép ctor/phân trong C++ 11

class Foo 
{ 
public: 
    Foo() { } 
    Foo(Foo const&) = delete; // Line 365 
    Foo& operator=(Foo const&) = delete; // Line 366 
}; 

không biên dịch. Đơn khiếu nại:

CPPConsole.cpp (365): error C2059: syntax error: ';'
CPPConsole.cpp (365): lỗi C2238: mã thông báo không mong muốn trước ';'
CPPConsole.cpp (366): lỗi C2059: lỗi cú pháp: ';'
CPPConsole.cpp (366): lỗi C2238: mã thông báo không mong muốn trước ';'

Điều này chưa được hỗ trợ? Điều kỳ lạ là, Intellisense dường như nhận ra cấu trúc này. Nó nói "IntelliSense: function" Foo :: operator = (const Foo &) "(tuyên bố tại dòng 366) không thể tham chiếu - đó là chức năng đã xóa"

Tôi đang thiếu gì?

Trả lời

33

VS 2010 có tính cách kép. Cụ thể, nó thực sự có hai đầu cuối trình biên dịch hoàn toàn riêng biệt.

Khi bạn biên dịch mã, được thực hiện với trình biên dịch riêng của Microsoft, quay trở lại MS C 3.0 cho MS-DOS, phát hành ~ 3 thập kỷ trước (trong trường hợp bạn tự hỏi tại sao nó là 3.0, MS đã bán một phiên bản có nhãn Lattice C trước đó).

Cho đến VS 2008, việc phân tích cú pháp trong IDE khá nguyên thủy so với trình biên dịch, vì vậy nó không phân tích cú pháp C++ tinh vi hơn một cách chính xác. Họ đã quyết định rằng không thể chấp nhận được, và thay vì cố gắng nâng cấp trình phân tích cú pháp hiện có của IDE để phù hợp với trình biên dịch, họ đã cấp phép cho trình biên dịch của trình biên dịch EDG.

Điều này cho nhiều hay ít tình huống ngược lại: trình phân tích cú pháp của IDE cho Intellisense giờ đây gần giống với trình biên dịch hơn, và nhận ra một số công bằng của cấu trúc C++ 0x mà trình biên dịch không có.

Có nhiều hơn một chút về câu chuyện: mặc dù trình biên dịch EDG hỗ trợ chuyển đổi để làm cho nó hoạt động giống VC++, bao gồm mô phỏng một số lỗi VC++. Mặc dù tôi không có dữ liệu để xác nhận nó, giả định của tôi sẽ là Microsoft sử dụng khả năng đó. Vì đó là dựa trên EDG dùng trình biên dịch VC++, và giả lập các lỗi của nó, nó có lẽ là một dự đoán công bằng (ít nhất là thường) giả lập VC++ của EDG sẽ chạy về một phiên bản phía sau VC++. Điều đó mang lại tình huống hơi nghịch lý nơi EDG (sử dụng bình thường) thường khá hơn một chút so với VC++, nhưng phiên bản MS sử dụng trong IDE có lẽ đang làm ít nhất là hơi chậm phần lớn thời gian.

+2

Cảm ơn! 1 để trả lời câu hỏi với phối cảnh lịch sử. – ForeverLearning

+0

Tôi không chắc trình phân tích cú pháp intellisense gần với tiêu chuẩn hơn trình biên dịch được cung cấp. Tôi thường xuyên quan sát chỉ là ngược lại khi intellisense hiển thị "không có toán tử phù hợp với toán tử" trong khi ADL của trình biên dịch tìm thấy nó mà không có vấn đề gì. Nó không giống như sự phù hợp là lý do cho một trình phân tích cú pháp khác cho intellisense, thay vì tốc độ phân tích cú pháp. –

+0

@Gene - Trình biên dịch được biết đến vì không làm ADL và mẫu chính xác.Mặt trước của EDG đáng tin cậy hơn nhiều. –

-1

Nó chưa được triển khai trong VS2010.

+0

Sau đó, intellisense biết rằng nó bị xóa và do đó không thể được tham chiếu? – ForeverLearning

+3

Tại sao tôi chỉ ra một điều "lạ" trong câu hỏi của mình nếu tôi không bối rối bởi nó? – ForeverLearning

+1

@DeadMG, đừng quấy rầy. _ "Tôi đang thiếu gì?" _ Là một phần của câu hỏi là _ "Điều này chưa được hỗ trợ chưa?" _. –