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