6

左辺値と右辺値の両方の文字列引数を参照によって受け取り、大文字に変換して標準出力に出力する関数を作成するとします。

void upper_print(std::string& s);
void upper_print(std::string&& s);

これは次のようにうまく動作します:

std::string s("Hello world");
upper_print(s);
upper_print(std::string("Hello world"));
upper_print("Hello world"); // converting ctor used

ただし、冗長性を避けるために、代わりに転送参照を使用したいと思います。

template <typename T> upper_print(T&& s);

残念ながら、upper_print文字列リテラル引数で呼び出すことはできません。

std::string s("Hello world"); // OK
upper_print(s); // OK
upper_print(std::string("Hello world")); // OK
upper_print("Hello world"); // ERROR

または などを使用して、引数をstd::stringオブジェクトに制限する可能性があることを認識しています。しかし、ここでは役に立ちません。std::enable_ifstatic_assert

この意味で参照の転送とコンストラクターの変換の機能を組み合わせるオプションはありますか?

4

1 に答える 1