9

快速设置:我想在我的程序中传递字符串作为指针和大小。我有一个 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 节似乎没有就用户定义的字符串文字运算符的参数的存储类主题发表任何内容。任何指向标准适当部分的指针都将不胜感激。)

4

1 回答 1

6

来自 [lex.ext]:

如果 L 是用户定义字符串文字,令str为不带ud 后缀的文字,令len为str中的代码单元数(即,其长度不包括终止空字符)。文字被视为以下形式的调用:L

operator "" X (str , len )

来自 [lex.string]:

评估字符串文字会产生一个具有静态存储持续时间的字符串文字对象,从上面指定的给定字符初始化。

所以:

"hello"_string;

相当于:

operator "" _string("hello", 5)

string-literal"hello"一样,它具有静态存储持续时间,因此您将没有悬空指针。

于 2015-09-18T12:43:42.097 回答