2008-10-16 63 views

Trả lời

30

"const class" có nghĩa là gì? Dường như biên dịch ok.

Không phải với tôi thì không. Tôi nghĩ rằng trình biên dịch của bạn chỉ là lịch sự và bỏ qua nó.

Chỉnh sửa: Đúng, VC++ âm thầm bỏ qua const, GCC than phiền.

+3

Tôi sẽ nói rằng nó trông giống như một trường hợp cạnh mà VC + + là nhận được sai –

+0

Hình như; 'const' không ảnh hưởng đến bất kỳ thứ gì tôi có thể tìm thấy. –

+0

VC + + tiêu hóa thực sự rất nhiều mã hình thành không đúng (Tôi đang sử dụng 2013 bây giờ). Có vẻ như họ đã thử nghiệm nó chỉ cho những con đường hạnh phúc. – ubik

17

Nếu bạn có điều này:

Sau đó, nó sẽ có nghĩa rõ ràng rằng 'a' là const. Nếu không, tôi nghĩ rằng nó có khả năng không hợp lệ C++.

+0

Tính năng cũ bị lãng quên của C++! Tôi nhớ làm những việc như thế trong C từ lâu rồi. –

41

Các const là vô nghĩa trong ví dụ đó, và trình biên dịch của bạn nên cung cấp cho bạn một lỗi, nhưng nếu bạn sử dụng nó để khai báo các biến của lớp đó giữa bế mạc };, sau đó xác định những trường hợp như const, ví dụ như:


const class A 
{ 
public: 
    int x, y; 
} anInstance = {3, 4}; 

// The above is equivalent to: 
const A anInstance = {3, 4}; 
+2

Tôi không thể tìm thấy lý do chính đáng để thực hiện lỗi này. Trình biên dịch có thể phát ra cảnh báo theo ý muốn, nhưng chỉ tiêu chuẩn xác định những gì được tính là lỗi. – MSalters

+0

Bởi vì bạn đang tuyên bố một cái gì đó như const không phải là. Đây là cái gì đó không bao giờ là những gì bạn muốn làm, và do đó nên là một lỗi. Tiêu chuẩn nên xác định cái gì là chính xác; xác định mọi điều sai trái sẽ là quá nhiều công việc. – Bernard

+0

Tôi nghĩ rằng thuật ngữ được sử dụng trong tiêu chuẩn là "không đúng định dạng". Tiêu chuẩn không nói những gì không được phép, chỉ là những gì được. Đây không phải là cú pháp C++ hợp lệ, do đó không được phép. – KeithB

7

Đó là vô nghĩa trừ khi bạn khai báo một thể hiện của lớp sau đó, chẳng hạn như ví dụ sau:

const // It is a const object... 
class nullptr_t 
{ 
    public: 
    template<class T> 
     operator T*() const // convertible to any type of null non-member pointer... 
    { return 0; } 

    template<class C, class T> 
    operator T C::*() const // or any type of null member pointer... 
    { return 0; } 

    private: 
    void operator&() const; // Can't take address of nullptr 

} nullptr = {}; 

một tạmTriển khainếu bạn đang đợi C++ 0x.