2015-07-18 20 views
16

Xem xét chương trình sau đây. Nó có được hình thành tốt hay không theo tiêu chuẩn C++ (tham chiếu đến các phần liên quan của tiêu chuẩn cần thiết):Cố gắng xác định thành viên không gian tên thông qua sử dụng khai báo

namespace X { extern int i; } 

namespace N { using X::i; } 

int N::i = 1; 

int main() {} 

Tôi nhận được kết quả khác nhau cho các trình biên dịch khác nhau. Tôi đang cố gắng tìm ra những gì trình biên dịch tôi nên nộp một báo cáo lỗi cho:

  • Clang: Cung cấp cho các lỗi biên dịch sau đây: Không có thành viên mang tên 'i' trong không gian tên 'N'

  • GCC và Visual C++ biên dịch nó mà không có lỗi.

Để so sánh sau đây cho lỗi biên dịch với tất cả ba trình biên dịch:

namespace X { void f(); } 

namespace N { using X::f; } 

void N::f() {}; 

int main() {} 
+1

Hài hước, VS2013 biên dịch, nhưng IntelliSence nói '" Lỗi: không gian tên "N" không có thành viên thực tế "i" ' – AlexD

+0

Tôi nghĩ câu trả lời là ở đây: [link] (http://stackoverflow.com/questions/6175705/Phạm vi-of-sử dụng-khai báo-trong-một không gian tên) – Jorj

+0

@Supremum Bạn có thể nhận được bản sao của riêng bạn của tiêu chuẩn C++ để đọc tại https://isocpp.org/std/the-standard. – Coder

Trả lời

11

dự thảo làm việc hiện tại N4527, [8.3p1]:

[...] When the declarator-id is qualified, the declaration shall refer to a previously declared member of the class or namespace to which the qualifier refers (or, in the case of a namespace, of an element of the inline namespace set of that namespace (7.3.1)) or to a specialization thereof; the member shall not merely have been introduced by a using-declaration in the scope of the class or namespace nominated by the nested-name-specifier of the declarator-id. [...]

Vì vậy, chắc chắn vô hình thành; GCC và MSVC là sai.

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