快速设置:我想在程序中传递字符串作为指针和大小。我有一个String类和一个用户定义的文字来构造文字字符串:
struct String { const char *ptr; size_t sz; };
inline constexpr String operator "" _string(const char *s, size_t sz) {
return {s, sz};
}
int main() {
auto s = "hello"_string;
s.ptr[0]; //<-- is this access guaranteed to work?
}
标准是否指定传递给我的用户定义的文字运算符的参数具有静态持续时间?即上面的代码实际上等同于写作:
int main() {
String s{"hello", 5};
}
或者当我使用用户定义的文字时,是否允许编译器/链接器给我留下悬空指针?
(N4527的第2.13.8节似乎没有对用户定义的字符串文字运算符的参数的存储类主题说任何内容。任何指向标准的相应部分的指针都将受到赞赏。 )
答案 0 :(得分:5)
来自[lex.ext]:
如果L是用户定义的字符串文字,请将 str 设为文字,而不使用 ud-suffix < / em>并让 len 为数字 str 中的代码单元(即,其长度不包括终止空字符)。文字
L
被视为一个电话 形式:operator "" X (str , len )
来自[lex.string]:
评估 string-literal 会产生一个字符串文字对象静态存储持续时间,从上面指定的给定字符初始化。
所以:
"hello"_string;
相当于:
operator "" _string("hello", 5)
由于"hello"
是 string-literal ,因此它具有静态存储持续时间,因此您将没有悬空指针。