2016-08-15 16 views
20

Có đề xuất trong cộng đồng C++ để không sử dụng using namespace std;. Nhưng giả sử bạn muốn sử dụng các chuỗi ký tự, ví dụ: auto s = "dummy"s;. Không sử dụng using namespace std; nguyên nhân không biên dịch được. Giải pháp là gì?Sử dụng chuỗi ký tự không sử dụng không gian tên std

+2

Các giải pháp có thể để tìm kiếm các thông tin tham khảo trước khi hỏi, trên các trang web như cppreference, mà [tài liệu cho 'toán tử' "s' hiển thị chính xác những gì bạn muốn] (http://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s) –

+1

Dấu ngoặc kép không khớp trong câu hỏi này là lỗi đánh máy hay một số tối nghĩa đặc tính? – plugwash

+0

@plugwash, nó không tối nghĩa, nó mới. Nhận xét trên của bạn sẽ giải thích cho những người không hiểu câu hỏi. –

Trả lời

24

operator""s nằm trong 2 không gian tên được gạch chân trong không gian tên std. Về cơ bản nó trông giống như sau:

namespace std 
{ 
    inline namespace literals 
    { 
     inline namespace string_literals 
     { 
      //operator""s implementation 
      //... 
     } 
    } 
} 

Vì vậy, để chỉ nhận được chuỗi ký tự, hãy sử dụng using namespace std::string_literals;.

Alternatevely, nếu bạn muốn bao gồm mỗi đen - bao gồm các xâu (như s cho giây nếu bạn bao gồm chrono, ...): using namespace std::literals;.

Tùy thuộc vào tình hình, bạn cũng có thể xem xét sử dụng:

using std::string_literals::operator""s; 

thay vì nhập khẩu hết mọi danh từ không gian tên đó.

Lưu ý rằng bạn nên vẫn không bao gồm nó trong một tiêu đề, ở cấp độ toàn cầu (nhưng bạn có thể làm điều đó bên trong nội tuyến hoặc thành viên các chức năng hoặc không gian tên bạn kiểm soát)

+2

Tại sao chúng ta không thể sử dụng một cái gì đó như 'using std :: string_literals :: s;'? –

+3

@ E.Vakili Tôi nghĩ bạn có thể làm 'bằng cách sử dụng std :: string_literals :: operator" "s;' – Rakete1111

+0

@ E.Vakili Điều này nghe có vẻ giống như một ý tưởng tuyệt vời. Thật không may 'GCC v6.1.1' là cho tôi một cảnh báo khi tôi làm điều này, có vẻ như nghĩ rằng tôi đang cố gắng để xác định chữ của riêng tôi bằng chữ với một tên bất hợp pháp. – Galik

8

Đối với xâu bạn có thể sử dụng:

using namespace std::string_literals; 

Điều đó sẽ kéo về các tên 4 vào không gian tên phù hợp. Nhưng khi bạn làm:

using namespace std; 

Sau đó, bạn kéo trong hàng ngàn tên, nhiều trong số đó thường được sử dụng trong các chương trình như counttime. Điều này có thể tạo khó khăn để tìm lỗi từ vô tình đề cập đến những điều sai trái.

Đó không phải là vấn đề với chuỗi ký tự.

Cũng không ai trong số những cái tên mà using namespace std::string_literals; mang lại nên can thiệp với người sử dụng được xác định tên vì người dùng định nghĩa xâu phải bắt đầu với _ (theo tiêu chuẩn) mà tránh xung đột.

Tuy nhiên bạn vẫn nên tránh using namespace std::string_literals; trong không gian tên chung của tệp tiêu đề vì bạn không nên áp đặt bất kỳ tính năng nào trên người dùng mà họ không yêu cầu.

+1

Tuy nhiên, điều này không nên được sử dụng ở phạm vi không gian tên trong một tiêu đề. – Brian

3

Các toán tử trên được khai báo trong namespace std::literals::string_literals, trong đó cả hai chữ cái và chuỗi_literals là các không gian tên nội tuyến. Tiếp cận với các nhà khai thác có thể đạt được với using namespace std :: literals, using namespace std::string_literals, và using namespace std::literals::string_literals

Nguồn: std::literals::string_literals::operator""s

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