如何使 [std::运算符 " " s] 在命名空间中可见?

How to make [std::operator""s] visible in a namespace?

本文关键字:命名空间 何使 std 运算符      更新时间:2023-10-16
#include <chrono>
namespace X
{
using namespace std;
struct A
{
    std::chrono::seconds d = 0s; // ok
};
}
namespace Y
{
struct B
{
    std::chrono::seconds d = 0s; // error
};
}

错误消息是:

错误:没有匹配的文本运算符来调用"运算符"s" 类型为"无符号长长"或"常量字符*"的参数,并且没有 匹配文本运算符模板 标准::时间::秒 d = 0s;

我的问题是:

我不想use namespace std; namespace Y;那么,我应该如何使std::operator""snamespace Y中可见?

如果你想拥有所有的时间文字,那么你可以使用

using namespace std::chrono_literals;

如果你只是想要operator""s那么你可以使用

using std::chrono_literals::operator""s;

请注意,至少在 coliru gcc 上会发出上述行的警告,但 clang 没有。 对我来说,不应该有任何警告。 我已经在 using 命令在使用保留标识符时发出警告吗?

tl;dr: use

using namespace std::string_literals

这些运算符在命名空间std::literals::string_literals中声明,其中literalsstring_literals都是内联命名空间。可以通过using namespace std::literalsusing namespace std::string_literalsusing namespace std::literals::string_literals来访问这些运算符。

来源: https://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s