В С++ рекомендуется рекомендовать не использовать using namespace std;
. Но предположим, что вы хотите использовать строковые литералы, например. auto s = "dummy"s;
.
Не использовать using namespace std;
привести к сбою компиляции. Каково решение?
Использование строковых литералов без использования пространства имен std
Ответ 1
operator""s
находится в 2 встроенных пространствах имен в пространстве имен std
. Он в основном выглядит следующим образом:
namespace std
{
inline namespace literals
{
inline namespace string_literals
{
//operator""s implementation
//...
}
}
}
Итак, чтобы получить только строковые литералы, используйте using namespace std::string_literals;
.
Альтернативно, если вы хотите включить каждый литерал - включая строковые литералы (например, s
в секундах, если вы включили chrono
,...): using namespace std::literals;
.
В зависимости от ситуации вы также можете рассмотреть возможность использования:
using std::string_literals::operator""s;
вместо импорта любого имени из этого пространства имен.
Обратите внимание, что вы все равно не должны включать его в заголовок на глобальном уровне (но вы можете делать это внутри встроенных или функций-членов или управляемых им пространств имен)
Ответ 2
Для строковых литералов вы можете использовать:
using namespace std::string_literals;
Это приведет к появлению имен 4
в пространстве имен, что отлично. Но когда вы это сделаете:
using namespace std;
Затем вы тянете тысячи имен, многие из которых обычно используются в таких программах, как count
и time
. Это может затруднить поиск ошибок от случайного обращения к неправильной вещи.
Это не проблема с строковыми литералами.
И ни одно из имен, которые using namespace std::string_literals;
не приносит, должно вмешиваться в определенные пользователем имена, потому что пользовательские строковые литералы должны начинаться с _
(в соответствии со стандартом), что позволяет избежать конфликтов.
Однако вы все равно должны избегать using namespace std::string_literals;
в глобальном пространстве имен заголовочного файла, потому что вы не должны налагать какую-либо функцию на пользователя, которого они не запрашивают.
Ответ 3
Вышеуказанные операторы объявлены в namespace std::literals::string_literals
, где оба литерала и string_literals являются внутренними пространствами имен. Доступ к этим операторам можно получить с помощью пространства имен std:: literals, using namespace std::string_literals
и using namespace std::literals::string_literals
Ответ 4
Я думаю, что это простой способ. Это прекрасно работает в С++ 14. проводник компилятора
#include <string>
#include <chrono>
int main()
{
using std::operator""s;
auto str = "abc"s;
auto min = 60s;
}