左辺値と右辺値の両方の文字列引数を参照によって受け取り、大文字に変換して標準出力に出力する関数を作成するとします。
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_if
static_assert
この意味で参照の転送とコンストラクターの変換の機能を組み合わせるオプションはありますか?