問題タブ [forwarding-reference]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ での参照の転送とコンストラクターの変換
左辺値と右辺値の両方の文字列引数を参照によって受け取り、大文字に変換して標準出力に出力する関数を作成するとします。
これは次のようにうまく動作します:
ただし、冗長性を避けるために、代わりに転送参照を使用したいと思います。
残念ながら、upper_print
文字列リテラル引数で呼び出すことはできません。
または などを使用して、引数をstd::string
オブジェクトに制限する可能性があることを認識しています。しかし、ここでは役に立ちません。std::enable_if
static_assert
この意味で参照の転送とコンストラクターの変換の機能を組み合わせるオプションはありますか?
c++ - リテラルを const ref パラメーターとして渡す
次の単純化されたコードを想像してください。
(1) 最適化はさておき、42 が に渡されるとどうなりfoo
ますか?
コンパイラは 42 をどこかに (スタック上の?) 貼り付けて、そのアドレスを に渡しますfoo
か?
(1a) この状況で何をすべきかを指示する標準に何かありますか (または厳密にはコンパイラ次第ですか)?
ここで、少し異なるコードを想像してください。
私が定義しない限り、リンクしませんint bar::baz;
(ODRのため?)。
(2) ODR 以外に、上記の 42 で行ったことをコンパイラーが実行できないのはなぜですか?
単純化する明白な方法は、次のように定義することですfoo
。
ただし、テンプレートの場合はどうすればよいでしょうか。例えば:
(3)プリミティブ型を値でfoo
受け入れるように指示するエレガントな方法はありますか? x
それとも、SFINAEなどで特化する必要がありますか?
編集foo
:この質問とは無関係であるため、内部で何が起こるかを変更しました。