2015-09-18 15 views
7

快速设置:我想在程序中传递字符串作为指针和大小。我有一个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

第2.13.8节aka [lex.ext] p5似乎认为参数是*字符串*,并且它们具有静态存储持续时间。 – dyp

+0

@dyp我不确定这是否清楚,但我一直在来回 –

+0

@ShafikYaghmour这就是为什么我没有把它作为答案;) – dyp

回答

4

从[lex.ext]:

如果L是一个用户定义-字串文本,让STR字面没有其UD-后缀和让lenstr(即,其长度不包括终止空字符)中的 个代码单元的数量。字面L被视为一个呼叫形式的 :

operator "" X (str , len) 

从[lex.string]:

评估字串文本导致字符串文本对象与静态存储持续时间,如上所述从给定字符初始化。

所以:

"hello"_string; 

等同于:

operator "" _string("hello", 5) 

由于"hello"字符串字面,它具有静态存储时间,所以你不会有任何悬摆指针。

+2

*“形式”*似乎有点模糊,它不会说*“等同于”*。无论如何,我同意这个基本概念。 – dyp

+0

@dyp是的,在标准“*形式*”的其他语境中通常呈现语法结构(例如“表达式E1 op = E2等于E1 = E1 op E2 ...”)。可怜的措辞选择艾莫。 – Barry

+0

有[dcl.fct.def。一般] p8,但是,这不是句法;在这种情况下,它可能意味着“等同于”。 – dyp

相关问题