C++11 引入了原始字符串文字,这对于表示带引号的字符串、带有许多特殊符号的文字(如 Windows 文件路径、正则表达式等)非常有用...
std::string path = R"(C:\teamwork\new_project\project1)"; // no tab nor newline!
std::string quoted = R"("quoted string")";
std::string expression = R"([\w]+[ ]+)";
这个原始字符串文字也可以与编码前缀(、、、u8
或)结合u
,但是,当没有指定编码前缀时,文件编码是否重要?假设我有这个代码:U
L
auto message = R"(Pick up a card)"; // raw string 1
auto cards = R"()"; // raw string 2
如果我可以编写和存储上面的代码,很明显我的源代码被编码为 unicode,所以我想知道:
- 这
raw string 1
将是一个unicode文字?(尽管它只使用 ASCII 字符),换句话说,原始字符串是否继承了写入文件的编码,或者编译器自动检测到无论文件编码如何都不需要 unicode? - 是否需要编码前缀才能将其视为 unicode 文字,或者由于其内容和/或源文件编码而自动成为 unicode
U
?raw string 2
感谢您的关注。
编辑:
在 ideone.com 中测试上面的代码并打印解耦后的类型message
和cards
变量,它会输出char const*
:
template<typename T> std::string demangle(T t)
{
int status;
char *const name = abi::__cxa_demangle(typeid(T).name(), 0, 0, &status);
std::string result(name);
free(name);
return result;
}
int main()
{
auto message = R"(Pick up a card)";
auto cards = R"()";
std::cout
<< "message type: " << demangle(message) << '\n'
<< "cards type: " << demangle(cards) << '\n';
return 0;
}
输出:
message type: char const*
cards type: char const*
这比我想象的更奇怪,我确信类型会是wchar_t
(即使没有L
前缀)。