【发布时间】:2015-09-18 12:29:29
【问题描述】:
快速设置:我想在我的程序中传递字符串作为指针和大小。我有一个 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 节似乎没有就用户定义的字符串文字运算符的参数的存储类的主题发表任何意见。任何指向标准适当部分的指针都将不胜感激。 )
【问题讨论】:
-
Section 2.13.8 aka [lex.ext]p5 似乎确实说参数是 string-literal,并且它们具有静态存储持续时间。
-
@dyp 我不确定这是否清楚,我一直在反复讨论
-
@ShafikYaghmour 这就是为什么我没有将其发布为答案;)
-
@ShafikYaghmour 有什么怀疑的余地?我错过了什么?它称它们为字符串文字,字符串文字具有静态存储持续时间,不是吗?
标签: c++ c++11 c++14 user-defined-literals storage-duration