2015-09-18 16 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

相關問題