2013-05-03 77 views
5

Đó là phong cách lập trình hợp pháp và tốt để sử dụng std::tr1::shared_ptr làm std::shared_ptr đặt using chỉ thị trong tương ứng tiêu đề? Như thế này:Có hợp pháp không khi sử dụng tr1 :: shared_ptr trong không gian tên std trong tiêu đề?

namespace std 
{ 
    using tr1::shared_ptr; 
} 

Tôi biết rằng không tốt để gây ô nhiễm toàn bộ không gian tên nhưng còn trường hợp này thì sao? Có bất kỳ gotchas ẩn nào không? Trình biên dịch đích là VS2008 nhưng khả năng tương thích với các phiên bản sau cũng được mong muốn.

+3

[Các phiên bản sau cũng phải hỗ trợ 'std :: tr1'] (http://stackoverflow.com/a/2002972/241631). Trình biên dịch sẽ không thả toàn bộ không gian tên; họ sẽ sao chép nội dung từ đó sang 'std' giống như bạn đang cố gắng làm. Vì vậy, đề cập đến các loại như 'std :: tr1 :: shared_ptr' không nên có vấn đề trong một thời gian dài. – Praetorian

+0

@cassini Những gì Praetorian nói^Nếu bạn muốn đi tuyến đường của bạn, bạn phải làm kiểm tra trình biên dịch trong preprocessor để đảm bảo bạn không nhận được xung đột về C++ 11 hỗ trợ, và tương lai, trình biên dịch, đó là lộn xộn và không linh hoạt và không di động. – leetNightshade

+1

@leetNightshade Thực ra, tất cả đều ở trên. Cấp, rất tiếc là không có "trình biên dịch hỗ trợ tính năng X" kiểm tra nhưng đối với hầu hết các mục đích kiểm tra tiền xử lý đơn giản cho phiên bản C++ là đủ, đi về phía trước. –

Trả lời

3

Về mặt kỹ thuật, chỉ số Standard nói rằng bạn nhập cõi Behavior Không xác định nếu bạn làm điều này:

17.6.4.2.1 Namespace std [namespace.std]

1 Hành vi của chương trình C++ không được xác định nếu nó thêm khai báo hoặc định nghĩa vào không gian tên std hoặc vào vùng tên trong không gian tên std trừ khi được quy định cụ thể.

Nhưng trên thực tế, bạn có thể thoát khỏi nó. Heck, thậm chí Scott Meyers cũng đã đề xuất một bí danh không gian tên không xác định tương tự trong Hiệu quả C++ 3rd Ed. (Mục 54, tr.268) để sử dụng chức năng Tăng cường làm điểm dừng cho thiếu chức năng tr1.

namespace std { using namespace tr1 = ::boost; } 

khai sử dụng của bạn cũng là một hành vi không xác định, nhưng đi trước và nhảy ngay trong

LƯU Ý:. Bình luận nó với một cảnh báo lớn chất béo, #define#pragma xung quanh phiên bản trình biên dịch và cảnh báo của bạn, và trong thời gian sớm khi bạn nâng cấp lên trình biên dịch/thư viện thực sự có std::shared_ptr, hãy nhớ truy cập lại tiêu đề đó và xóa mã.

+0

Để thêm vào lưu ý cuối cùng: Nhận xét thật tuyệt và tất cả . Tuy nhiên, họ có xu hướng chỉ là vậy, bình luận. Nếu bạn muốn một cái gì đó với một chút sức mạnh thuyết phục hơn sử dụng chỉ thị tiền xử lý để thay thế. Một cái gì đó dọc theo dòng #if được xác định (_MSC_VER) && (_MSC_VER> 1500) #error Vui lòng truy cập lại mã sau. #endif có thể sẽ kích hoạt một số loại hành động khi thích hợp. – IInspectable

+0

@Tim tnx, điểm tốt. Đã cập nhật! – TemplateRex

+0

Cảm ơn bạn, nhưng tôi không muốn xem lại mã này sau khi nâng cấp lên trình biên dịch mới. – cassini