2011-03-22 64 views
31

tôi vô tình phát hiện ra rằng trình biên dịch Clang phép:Lớp nội tuyến C++ là gì?

inline class AAA 
{ 
}; 

trong C++. Đây là gì?


PS. Tôi đã báo cáo điều này với danh sách gửi thư của Clang [email protected] và hiện đang chờ trả lời. Tôi sẽ cập nhật câu hỏi này bởi tôi được thông báo.

+0

inline chức năng có ý nghĩa .... nhưng lớp inline ?? – mpen

+8

"Đây là gì?" - Cái gì đó không tồn tại trong tiêu chuẩn C++. Trình chỉ định 'inline' là cho các hàm, không phải các lớp. Bạn có thể đã vấp phải một lỗi trong trình biên dịch Clang C++. –

+1

Đã thêm thẻ 'clang', tôi không thể tìm thấy bất kỳ thứ gì trên trình theo dõi lỗi, nó có thể đáng để mở một thẻ (bạn luôn có thể gửi thư đến cfe-dev [at] cs.uiuc.edu trước nếu bạn không chắc chắn). Nếu điều này là trên dòng 2.9, họ có thể sẽ muốn sửa chữa nó sớm. –

Trả lời

12

kêu vang không nên cho phép điều này, inline chỉ có thể được sử dụng trong việc kê khai của các chức năng, từ ISO/IEC 14882: 2003 7.1.2 [dcl.fct.spec]/1:

Chức năng -specifiers chỉ có thể được sử dụng trong khai báo hàm.

inline là một trong ba chức năng -specifiers, virtualexplicit là những người khác.

Như @MatthieuM lưu ý, trong phiên bản tiếp theo của C++ (C++ 0x), từ khóa inline cũng sẽ được cho phép trong định nghĩa namespace (với ngữ nghĩa khác nhau để inline như một chức năng-specifier).

+1

Trong ngữ cảnh của C++ 0x, nó cũng có thể được sử dụng với các không gian tên. –

+0

@Matthieu: Bạn có thể mở rộng trên đó không? – Xeo

+3

@Xeo: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm –

33

Nó cho phép trong trường hợp bạn muốn khai báo một hàm trả về một đối tượng của lớp đó ngay sau lớp khai, ví dụ:

#include <iostream> 

inline class AAA 
{ 
public: 
    AAA() 
    { 
     // Nothing 
    } 

    AAA(const AAA& _Param) 
    { 
     std::cout << "Calling Copy Constructor of AAA\n"; 
    } 
}A() 
{ 
    AAA a; 
    return a; 
}; 

int main() 
{ 
    A(); 
    return 0; 
} 

Ngoài ra, bạn nên chú ý đến lỗi biên dịch (hoặc cảnh báo) mà xuất hiện trong các trường hợp bất hợp pháp khác, chẳng hạn như khai báo biến thay vì A(), cũng lưu ý rằng trình biên dịch tuyên bố rằng nó bỏ qua từ khóa inline nếu bạn không khai báo bất kỳ hàm nào.

Hy vọng điều đó hữu ích.

Edit: Đối với Các bình luận của Eonil

Nếu bạn đang nói về mã của bạn ở trên trong câu hỏi, sau đó nó là trường hợp tương tự như tôi thấy, trình biên dịch sẽ cung cấp cho bạn một cảnh báo: 'inline ' : ignored on left of 'AAA' when no variable is declared

Tuy nhiên, nếu bạn sử dụng mã trong câu trả lời của tôi, nhưng thay A() với một biến, B ví dụ, nó sẽ tạo ra một lỗi biên dịch: 'B' : 'inline' not permitted on data declarations

vì vậy, chúng tôi thấy rằng trình biên dịch đã không sai lầm wit h chấp nhận tuyên bố như vậy, làm thế nào về cố gắng để viết inline double; ngày của riêng mình?Nó sẽ tạo ra một cảnh báo: 'inline ' : ignored on left of 'double' when no variable is declared

Bây giờ làm thế nào về tuyên bố này:

double inline d() 
{ 
} 

Nó cung cấp cho không có cảnh báo hoặc lỗi, đó là chính xác giống như:

inline double d() 
{ 
} 

từ các ưu tiên của inline không quan trọng chút nào.

Mã đầu tiên (trong toàn bộ câu trả lời) cũng tương tự như viết:

class AAA 
{ 
    // Code 
}; 

inline class AAA A() 
{ 
    // Code 
} 

đó là hợp pháp.

Và, theo cách khác, nó có thể được viết như sau:

class AAA 
{ 
    // Code 
}; 

class AAA inline A() 
{ 
    // Code 
} 

Bạn sẽ được thuyên giảm nếu bạn thấy đoạn mã đầu tiên (trong toàn bộ câu trả lời) bằng văn bản như:

#include <iostream> 

class AAA 
{ 
    // Code 
} inline A() 
{ 
    // Code 
}; 

Nhưng chúng giống nhau, vì không có tầm quan trọng đối với mức độ ưu tiên của inline.

Hy vọng nó rõ ràng và thuyết phục.

+3

Mắt tôi !! 1 mặc dù cho một ví dụ tốt đẹp và khó hiểu khi điều này hoạt động. :) – Xeo

+0

@Xeo: Hòa bình, anh em :) –

+2

Bạn có thể xây dựng WTF, đang xảy ra ở đây không? Tại sao tôi lại bao giờ khai báo một hàm như vậy, và đó có phải là hàm của một lớp không? – polemon

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