Подтвердить что ты не робот

Использование строковых литералов без использования пространства имен std

В С++ рекомендуется рекомендовать не использовать using namespace std;. Но предположим, что вы хотите использовать строковые литералы, например. auto s = "dummy"s;. Не использовать using namespace std; привести к сбою компиляции. Каково решение?

4b9b3361

Ответ 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

Источник: std:: literals:: string_literals:: operator "" s

Ответ 4

Я думаю, что это простой способ. Это прекрасно работает в С++ 14. проводник компилятора

#include <string>
#include <chrono>

int main()
{
  using std::operator""s;
  auto str = "abc"s;
  auto min = 60s;
}