具有用户定义的字符串文字的底层字符数据的存储持续时间
storage duration of underlying character data with user-defined string literal
快速设置:我想在我的程序中传递字符串作为指针和大小。我有一个字符串 class 和一个用于构造文字字符串的用户定义文字:
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};
}
或者当我使用用户定义的文字时,compiler/linker 是否允许我留下悬空指针?
(N4527 的第 2.13.8 节似乎没有就用户定义的字符串文字运算符的参数的存储 class 主题发表任何内容。任何指向适当部分的指针标准将不胜感激。)
来自[lex.ext]:
If L is a user-defined-string-literal, let str be the literal without its ud-suffix and let len be the number of
code units in str (i.e., its length excluding the terminating null character). The literal L
is treated as a call
of the form:
operator "" X (str , len )
来自[lex.string]:
Evaluating a string-literal results in a string literal object with static storage duration, initialized from the given characters as specified above.
所以:
"hello"_string;
相当于:
operator "" _string("hello", 5)
由于 "hello"
是一个 字符串文字 ,它具有静态存储持续时间,因此您不会有悬挂指针。
快速设置:我想在我的程序中传递字符串作为指针和大小。我有一个字符串 class 和一个用于构造文字字符串的用户定义文字:
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};
}
或者当我使用用户定义的文字时,compiler/linker 是否允许我留下悬空指针?
(N4527 的第 2.13.8 节似乎没有就用户定义的字符串文字运算符的参数的存储 class 主题发表任何内容。任何指向适当部分的指针标准将不胜感激。)
来自[lex.ext]:
If L is a user-defined-string-literal, let str be the literal without its ud-suffix and let len be the number of code units in str (i.e., its length excluding the terminating null character). The literal
L
is treated as a call of the form:operator "" X (str , len )
来自[lex.string]:
Evaluating a string-literal results in a string literal object with static storage duration, initialized from the given characters as specified above.
所以:
"hello"_string;
相当于:
operator "" _string("hello", 5)
由于 "hello"
是一个 字符串文字 ,它具有静态存储持续时间,因此您不会有悬挂指针。