Istnieją dwa powody, dlaczego właściwie literały są umieszczane w przestrzeni nazw:
- uważa się za niepożądane, że użytkownicy będą korzystać
using namespace std;
tylko zdobyć odpowiednie literałów. Posiadanie literałów zadeklarowanych w specyficznych dla nich przestrzeniach nazw nie powoduje problemu.
- W zależności od domeny może być pożądane użycie
s
jako sufiksu dla czegoś innego. Istnieje już kolejny przyrostek s
oznaczający sekundy, ale tak naprawdę nie powodują one konfliktu.
W video of STL's CppCon 2014 talk (wysłane przez remyable w komentarzu) Stephan T. Lavavej wyjaśnia ogólną konstrukcję literały w C++ 14 i jego całkiem jasne, że są one nie miało być w globalnej przestrzeni nazw ! Zamiast tego, dosłowne przyrostki w standardowej bibliotece żyją w hierarchii obszarów nazw inline
, dając użytkownikom dokładną kontrolę nad dostępnymi literałami. Na przykład, dosłowne przyrostek ciągów jest zadeklarowana następująco (21,3 [string.classes] pkt 1):
namespace std {
inline namespace literals {
inline namespace string_literals {
string operator"" s(char const* str, size_t len);
}
}
}
Ta hierarchia inline
nazw umożliwia użytkownikom uzyskać odpowiedni wybór dosłownych przyrostków:
using namespace std;
- dostajesz wszystko w standardowej bibliotece C++, włącznie z dosłownymi przyrostkami, bez żadnych kwalifikacji.
using namespace std::literals;
- otrzymujesz wszystkie dosłowne przyrostki zdefiniowane w standardowej bibliotece C++.
using namespace std::string_literals;
- otrzymujesz wszystkie dosłowne przyrostki dotyczące łańcuchów.
using namespace std::literals::string_literals;
- tak, możesz to zrobić, ale naprawdę nie powinieneś: to jest odpowiednik using namespace std::string_literals;
.
Oczywiste jest, że komisja nie będzie już do tego wysiłku, gdyby uznać pomysł opłacalne tylko zanieczyszczają globalnej przestrzeni nazw z dosłownych przyrostków, chociaż nie mogą kolidować z dowolnego użytkownika dosłownych przyrostków.
Och, człowieku ... Pamiętam, że mogłem porozmawiać o tym, CppCon lub Boostcon, ale nie pamiętam, dlaczego tak było. – Borgleader
Chociaż nie znam dokładnego powodu, rozsądne wydaje się unikanie zanieczyszczania globalnej przestrzeni nazw, która jest tak krótkim sufiksem. – Aleph
@Borgleader https://www.youtube.com/watch?v=dTeKf5Oek2c Jest na początku filmu. –