2008-11-26 30 views
14

Có thể chấp nhận thêm loại vào không gian tên std không. Ví dụ, tôi muốn một chuỗi TCHAR thân thiện, như vậy là chấp nhận được sau đây?Thêm loại vào không gian tên std

#include <string> 

namespace std 
{ 
    typedef basic_string<TCHAR> tstring; 
} 

Hoặc tôi có nên sử dụng không gian tên của riêng mình không?

Trả lời

17

Không ... một phần của điểm của không gian tên là ngăn chặn xung đột tên khi nâng cấp.

Nếu bạn thêm điều cần namespace std, sau đó mã của bạn có thể phá vỡ với phiên bản tiếp theo của thư viện nếu họ quyết định thêm một cái gì đó có cùng tên.

+2

Nó cũng vi phạm các tiêu chuẩn, afaik. Không gian tên std là thiêng liêng. (Ngoài các chuyên môn của các chức năng std hiện có) :) – jalf

3

Bạn nên sử dụng tên miền không gian riêng của bạn như là thêm mã vào thư viện chuẩn sẽ chỉ gây nhầm lẫn cho người sử dụng mà sẽ xem xét trực tuyến với thông tin về bổ sung đó.

Tất cả những gì trong std nên chỉ các thư viện chuẩn và không có gì khác.

+0

Tôi không tin rằng nó sẽ gây nhầm lẫn cho người dùng - thực tế họ có thể mong đợi một loại :: basic_string std. Cuộc gọi khó khăn tôi nghĩ. – Rob

+0

Không, Klaim là chính xác. Bạn không nên thêm bất kỳ thứ gì vào không gian tên std. Người dùng có thể * mong đợi * basic_string nằm trong std, nhưng nó không phải là một phần của thư viện std và họ sẽ không tìm thấy bất kỳ thứ gì trong nó trong tài liệu được xuất bản cho một triển khai std đã cho. Cách chính xác là sử dụng ns của riêng bạn. –

+0

Tôi phải tìm cái này. 'basic_string' thực sự được định nghĩa là một phần của không gian tên' std' trên trang 384 của ISO/IEC 14882: 1998. – Zhro

2

cách chính thức, tiêu chuẩn nói đó là "hành vi không xác định", và tất cả mọi thứ khó chịu có thể xảy ra.

Trong thực tế, nó sẽ làm việc tốt, nhưng bạn vẫn không nên làm điều đó. Nó mua gì cho bạn, ngoài những người khó hiểu rằng một cái gì đó được cung cấp bởi trình biên dịch?

15

Chỉ cho phép các chuyên môn. Vì vậy, ví dụ, bạn được phép chuyên std::numeric_limits cho loại của bạn. Và điều này tất nhiên phải xảy ra trong không gian tên std::. Nhưng typedef của bạn không phải là một chuyên môn để nó gây ra hành vi không xác định.

+0

Theo [câu trả lời này] (http://stackoverflow.com/a/2684544/1468366), việc thực hiện 'swap' không nên đi vào' std' nữa, như các thuật toán sử dụng 'swap' sẽ dựa vào tra cứu phụ thuộc vào đối số. – MvG

+0

@MvG câu trả lời là đúng. Ví dụ của tôi là không và không tốt. Tôi sẽ thay thế nó. –

+0

Tại sao 'numeric_limits' khác với' swap' trong lĩnh vực này? –

1

Tôi hoàn toàn đồng ý với câu trả lời khác nói rằng bạn nên đặt loại của bạn trong không gian tên riêng của bạn để tránh xung đột tên kém may mắn.

Tuy nhiên, tôi muốn chính xác rằng đôi khi, bạn có thể (và nên!) Thêm nội dung vào không gian tên std. Đây là trường hợp cho các chuyên ngành mẫu của std :: swap method, được sử dụng để cung cấp một cách thống nhất để hoán đổi các đối tượng. Để biết thêm thông tin về vấn đề này, bạn có thể đọc về non-throwing swap idiom.

13

[C++11: 17.6.4.2.1/1]: Hành vi của một chương trình C++ là undefined nếu nó thêm tuyên bố hoặc định nghĩa để không gian tên std hoặc một không gian tên trong namespace std trừ trường hợp quy định. Chương trình có thể thêm chuyên môn mẫu cho bất kỳ mẫu thư viện chuẩn nào vào không gian tên chỉ khi khai báo phụ thuộc vào loại do người dùng xác định và chuyên môn đáp ứng các yêu cầu thư viện chuẩn cho mẫu ban đầu và không bị cấm rõ ràng.

2

Đây là một câu hỏi thú vị vì nó hoàn toàn chủ quan đối với dự án và tiêu chuẩn mã hóa được chấp nhận của kỹ sư.

Đối với một lập trình viên duy nhất, tại sao không ... chỉ cần cẩn thận.

Đối với các nhóm, tạo một tiêu chuẩn ...

Đối với dự án đa nền tảng, đúng rồi.

Nếu không, nawdawg.

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