【发布时间】:2013-08-28 16:06:46
【问题描述】:
在浏览 C++14/C++1y (n3690) 草案时,我注意到在第 21.7 节中引入了 basic_string 文字后缀:
inline namespace literals {
inline namespace string_literals {
// 21.7, suffix for basic_string literals:
string operator "" s(const char *str, size_t len);
u16string operator "" s(const char16_t *str, size_t len);
u32string operator "" s(const char32_t *str, size_t len);
wstring operator "" s(const wchar_t *str, size_t len);
}
}
我的问题是:
-
basic_string文字是否有可能在运行时更快? - 我的“幼稚”实现完全错误吗?
- ROM 中的数据布局能否与
basic_string文字不同,或者编译时与运行时的任何其他差异?
背景
我知道这允许像这样直接使用字符串文字:
std::string s1 = "A fabulous string"s;
void sfunc(std::string arg);
int main() {
sfunc("argument"s);
}
但是与依赖转换构造函数string(const char*)相比有什么优势呢?
“旧”代码如下所示:
std::string s1 = "A fabulous string"; // c'tor string(const char*)
void sfunc(std::string arg);
int main() {
sfunc("argument"); // auto-conversion via same c'tor
}
据我所知,operator "" s() 的实现基本上是这样的:
std::string operator "" s(const char* lit, size_t sz) {
return std::string(lit, sz);
}
所以,只需使用相同的 c'tor。我的猜测是,这必须在运行时完成,我错了吗?
编辑:正如 Nicol Bolas 在我的示例下方正确指出的那样,不 使用相同的构造函数,但具有额外长度的构造函数 - - 显然,这对建筑非常有用。这给我留下了一个问题:编译器将字符串文字放入 ROM 是否更好,或者在编译时类似的东西?
【问题讨论】:
标签: c++ string literals c++14 user-defined-literals