6

比較的単純な使用例があります。ユーザー定義の文字列、つまりユーザー定義の登録 ID を返すクラスに特性を関連付けたいとします。この登録はコンパイル時に定義されるはずなので、constexpr にしたいので、次のように書きました。

template <typename T>
struct ClassRegistration
{
    static constexpr std::string_view
    Name();
};

template <>                                                                                    
struct ClassRegistration<int>                                                            
{                                                                                              
    static constexpr std::string_view                                                        
    Name()                                                                                     
    {                                                                                          
        return std::string_view{ "int" };                                                     
    }                                                                                          
};

https://godbolt.org/z/5p8xkA

すべて正常に動作していますが、string_view は実際にはそのバッファーを所有していないため、安全であることが保証されているかどうか疑問に思っています。私が読んだことから、文字列リテラルは、プログラム自体の寿命と同じくらい長い寿命を持つことが保証されています(関数によって返される文字列リテラルのこの SO 寿命から)。

したがって、この string_view の使用法は安全で適切ですか?

4

1 に答える 1