クイックセットアップ:私のプログラムでは、ポインタとサイズとして文字列を渡したいと思います。私は、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]から
セクション2.13.8 aka [lex.ext] p5は、引数が*文字列リテラル*であり、静的記憶期間があると考えられます。 – dyp
@dyps私はそれが明確であるかどうか分かりませんが、私はそれを行き来し続けています –
@ShafikYaghmourだから私は答えとして投稿しませんでした;) – dyp