2014-06-14 12 views
5

Tôi đọc phần về định nghĩa vùng tên. Khoản 7.3.1 của N3797 cho biết:không gian tên nội tuyến và không gian tên mở rộng

Các từ khóa inline có thể được sử dụng trên một phần mở rộng-namespace nét chỉ nếu trước đó nó được sử dụng trên các ban-namespace nét cho namespace đó.

Hãy xem xét các đoạn mã sau:

namespace M 
{ 
    int h; 
} 

inline namespace M 
{ 
    int j = 6; 
} 

Nó được biên soạn thành công cả với -std=c++11 và không có tùy chọn đó. Bạn có thể giải thích hành vi đó không? Đây có phải là lỗi g++ không?

Trả lời

4

Tham chiếu Vour cho tiêu chuẩn là rõ ràng: điều này không được phép.

Sử dụng Clang ++ Tôi nhận được thông báo lỗi rất rõ ràng về vấn đề này:

Test0614-1.cpp:17:18: error: non-inline namespace cannot be reopened as inline 
inline namespace M 
       ^
Test0614-1.cpp:12:11: note: previous definition is here 
namespace M 
     ^

Vì vậy, nó dứt khoát một lỗi trong g ++. Nhân tiện, nó được báo cáo ở đây: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53402

Thực tế là trình biên dịch chấp nhận không gian tên nội tuyến cho phiên bản trước của tiêu chuẩn và không có ít nhất một cảnh báo có vẻ là một vấn đề. Điều này đã được báo cáo là lỗi trong năm 2010 và đáng lẽ phải được sửa: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43824

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