2015-09-18 11 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は、ユーザ定義の文字列リテラル演算子の引数の記憶クラスの主題について何も言わなかった。標準の適切なセクションへのポインタは、 。)

[lex.ext]から
+0

セクション2.13.8 aka [lex.ext] p5は、引数が*文字列リテラル*であり、静的記憶期間があると考えられます。 – dyp

+0

@dyps私はそれが明確であるかどうか分かりませんが、私はそれを行き来し続けています –

+0

@ShafikYaghmourだから私は答えとして投稿しませんでした;) – dyp

答えて

4

がL STRUD-サフィックスなしリテラルになるせ、ユーザ定義のストリングリテラル場合とlet lenは、 コードユニットの番号をstr(つまり、終端ヌル文字を除く長さ)とします。

operator "" X (str , len) 

[lex.string]から:

を持つ文字列リテラルオブジェクト内文字列リテラル結果を評価するリテラルLは、コール形式の として扱われます静的記憶期間、上記の指定された文字から初期化されます。

だから、

"hello"_string; 

は同等です:

operator "" _string("hello", 5) 

"hello"文字列リテラルであるとして、それは静的記憶域期間を持っているので、あなたは何のダングリングポインタを持っていません。

+2

* "フォームの*はやや曖昧に見えるが、" *と同等* "とは言わない。とにかく、私は基本的な考え方に同意します。 – dyp

+0

@dypそう、他の文脈では、 "*の形*"は、通常、構文構造(例えば、 "E1 op = E2の形式はE1 = E1 op E2と等価です。貧しい言葉の選択。 – Barry

+0

[dcl.fct.defがあります。しかし、構文的ではない。その場合には「同等」を意味する可能性があります。 – dyp

関連する問題