【问题标题】:storage duration of underlying character data with user-defined string literal具有用户定义的字符串文字的基础字符数据的存储持续时间
【发布时间】: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


【解决方案1】:

来自 [lex.ext]:

如果 L 是 user-defined-string-literal,则让 str 为没有 ud-suffixliteral /em> 并设 lenstr 中的代码单元(即,它的长度不包括终止空字符)。文字 L 被视为调用 形式:

operator "" X (str , len )

来自 [lex.string]:

评估 string-literal 会产生一个具有 static storage duration 的字符串字面量对象,根据上面指定的给定字符进行初始化。

所以:

"hello"_string;

相当于:

operator "" _string("hello", 5)

由于"hello" 是一个字符串字面量,它具有静态存储持续时间,因此您将没有悬空指针。

【讨论】:

  • “的形式” 好像有点模糊,没有说“相当于”。无论如何,我同意基本概念。
  • @dyp 是的,在标准中的其他上下文中,“of the form”通常表示句法结构(例如,“E1 op= E2 形式的表达式是等价的到 E1 = E1 操作 E2 ...")。 imo的措辞选择不佳。
  • 有 [dcl.fct.def.general]p8,但是,它不是语法;在这种情况下,它可能意味着“相当于”。
  • 说出来时,标准似乎已经足够清晰了。接受,谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2012-10-18
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多