Есть ли причина помещать оператор s в std :: literals :: string_literals?

Я очень удивлен, обнаружив, что этот код не компилируется (при условии, что мы используем компилятор C ++ 14):

std::cout << "hello world!\n"s;

Ошибка, показанная ideone, является следующей:

невозможно найти строковый литерал operator 'operator "" s'

К счастью, это довольно просто исправить с помощью оператора using:

using namespace std::literals::string_literals;
std::cout << "hello world!\n"s; // Compiles!

Мне интересно, есть ли причина для размещения стандартных строковых пользовательских литералов в другом пространстве имен, чем сам std::string; Я думал об этом и не могу понять причину.

Невозможно столкнуться с operator""s из std::chrono, потому что они работают с разными типами:

auto ten_seconds = 10s; // ten seconds
auto some_string = "some string"s; // some string

Я думал, что причина может заключаться в том, чтобы не конфликтовать с моими пользовательскими литералами, но стандарт гласит, что я перед ними должен стоять '_' знак подчеркивания:

предупреждение: суффиксы буквальных операторов, которым не предшествует '_', зарезервированы для будущей стандартизации

Итак, я очень удивлен, кто-нибудь знает причину помещения оператора строкового литерала в std::literals::string_literals?

Спасибо.


person PaperBirdMaster    schedule 18.02.2015    source источник
comment
Я предпочитаю делать using namespace std::literals;, а не делать using std::operator"" s; или using namespace std;   -  person chris    schedule 18.02.2015
comment
А еще лучше просто посмотрите CppCon 2014: Стефан Лававей Особенности и методы реализации STL, он кратко говорит о UDL во встроенных пространствах имен.   -  person    schedule 18.02.2015