0

ユーザー定義リテラルについて読んで、 から文字列リテラル オーバーロードを定義することについて、なんとなくあいまいであることに気付きますchar[]

間違いなく正しい方法は次のとおりです

std::string operator "" _s (const char* m, std::size_t)
{
    return std::string(m);
}

int main()
{
    std::string r = "hello,"_s + " world"_s;
    return 0;
}

しかし、実際には次のようなもののタイプ"hello"const char (&)[N](どこNに長さがあります)です。だから、このような代替アプローチがあるのだろうか

template <std::size_t N>
std::string operator "" _s (const char (&m)[N])
{
    return std::string(m);
}

しかし、コンパイラ(Ubuntu 14.04のg ++​​ 4.8)でエラーが発生しました

‘std::string operator"" _s(const char (&)[N])’ has invalid argument list
 std::string operator "" _s (char const (&m)[N])
                                               ^

std::size_t次に、未使用のパラメーターを正しい方法から削除しようとしましstd::string operator "" _s (const char* m)たが ( )、エラーが発生しました

unable to find string literal operator ‘operator"" _s’ with ‘const char [7]’, ‘long unsigned int’ arguments
     std::string r = "hello,"_s + " world"_s;

一次リテラルが achar[]または aの場合、長さをパラメータとして持つことは必須wchar_t[]ですか?

4

0 に答える 0