关于C++中带u前缀与_ns后缀的constexpr字符串声明的疑问
这段C++声明的含义解析
先看代码:
constexpr auto type = u"bluetooth-opp-transfer-complete"_ns;
u前缀的含义:
u是字符串字面量的前缀,标记这是一个UTF-16编码的宽字符串,对应的类型是const char16_t[],和普通不带前缀的UTF-8字符串(const char[])、L前缀的宽字符字符串(const wchar_t[])属于不同类型。_ns会不会被追加到字符串里?
不会。_ns是C++11引入的用户定义字面量(UDL),它不是字符串内容的一部分,而是一个后缀运算符。作用是把前面的字符串字面量作为参数,传给对应的字面量运算符函数,生成一个特定类型的对象。为什么_ns没显式定义却能生效?
它肯定是在代码的其他地方(比如包含的头文件里)已经定义了对应的字面量运算符。举个简单的例子,可能有类似这样的定义:
#include <cstddef> // 假设自定义一个命名空间标识类 struct NamespaceTag { const char16_t* value; std::size_t length; }; // 对应的constexpr字面量运算符 constexpr NamespaceTag operator""_ns(const char16_t* str, std::size_t len) { return {str, len}; }
因为声明里用了constexpr,这个运算符会在编译期执行,把前面的UTF-16字符串转换成NamespaceTag类型的对象,最终赋值给type。
内容的提问来源于stack exchange,提问作者user1237538
相关产品推荐
相关产品推荐

