問題タブ [pass-by-rvalue-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++ - テンプレート化された関数とクラスのT&&
私はT&&
クラスでそれを偶然見つけました、そして関数は異なることを意味します。
機能中:
クラスで:
T&& t
これは、クラスにいる場合、t
右辺値のみになることを意味しますか?
これについてもっと情報を得ることができる場所を教えてもらえますか?
L値とR値に対して2つのメソッドオーバーロードを作成する必要があるということですか?
答え
Alfの例が示すようにt
、関数とクラスはLvalueまたはRvalueになります。
c++ - 値渡しは常に const ですか?
このコードはコンパイルされません:
行のコンパイル エラー (GCC 4.1.2) foo(bar())
:
タイプ 'C' のテンポラリからのタイプ 'C&' の非 const 参照の無効な初期化
Asはオブジェクトをbar()
返し、mutable
コンパイルする必要があります...
なぜ C++ は上記のコードを許可しないのですか?
編集:すべての回答からのすべての良いアイデアの下に回答をまとめました;-)
c++11 - 「一時オブジェクトへの非定数参照なし」を正しくオーバーライドする方法
クラスがありFoo
ます。Foo
const 以外のメソッドがいくつかあります。Foo
一時オブジェクトで const 以外のメソッドを呼び出しても問題ありません。Foo
メソッドがオブジェクト自体に何をするかよりも、メソッドが実際に返すものだけに興味があります。
最初の質問: これだけで、クラスFoo
が適切に設計されていないことを示す必要がありますか?
2 番目の質問: そのまま続行したいが、非 const メソッドを呼び出す関数への参照によってオブジェクトFoo
を渡すことができるようにしたい場合、それを行うための最良の方法は何でしょうか?Foo
これは私が到着したものです:
別のアプローチは、これを行うだけです:
しかし、このアプローチには、実際に const と宣言されたオブジェクトの const を const-cast'ing している可能性があるという問題があり、未定義の動作の土地に陥る可能性があります。
編集:
TakeFoo を使用するコード例:
c++ - 値渡しまたはユニバーサル参照
型消去機能を備えた小さなポリモーフィック クラスを開発したいのですが、テンプレート化されたコンストラクターのどのバージョンが優れていて、使用する必要があるのか疑問に思っています。
値で渡すことができます:
または、ユニバーサル参照を使用できます。
T
(クラス自体ではなく、クラスがコピーされない場合は、ユニバーサル参照を有効にする必要があります)。何か案は?どちらのバージョンも私には同じように見えます。
c++ - C++11 の別の関数に右辺値参照をそのまま渡すことができないのはなぜですか?
私はコードをもっている:
Clang++ でエラーが発生します。no known conversion from 'int' to 'int &&' for 1st argument
に渡されるときにi
がその型を に変更するのはなぜですか?int
lambda()
c++ - const 右辺値を右辺値参照にバインドする
BS ツリーを実装しているときに、C++11 スマート ポインターを使い始めて以来、よくわからないことがいくつかあることに気付きました。以下のコードは、括弧の代わりにinit-brace のペア{}を使用すると正常に動作します。私の個人的なルールは、すべてのメンバーを (直接または ctor を介して) 値を初期化することです。Node ::rightとNode::leftはどちらもスマート ポインターであるため、nullptrです。 質問 1 : 括弧が失敗し、init-ブレースのペアが成功するのはなぜですか? この場合のみ、両者の間に意味上の違いはありますか?
BSTでは、std::initializer_list を受け取る ctor で、this によると、std::initializer_list 要素はコピーのみ可能であることがわかりました。したがって、私が間違っていなければ、最近の GN13 での Scott Meyer によると、const オブジェクトで移動を実行すると、オブジェクトの copy-ctor のみがトリガーされます。
質問 2 BST::insert( T&& )の呼び出しでコンパイラがオブジェクトのコピーに失敗するのはなぜですか?
c++ - 名前付き右辺値参照によるエラー メッセージの混乱
次の点を考慮してください。
言うまでもなく、このコードはコンパイルされません。2 番目の関数呼び出しで使用する必要があることstd::move()
は理解していますが、理解のためにコードをそのまま考えたいと思います。
上記をコンパイルしようとすると、Clang 3.5 から次のように表示されます。
エラー: 'func' の呼び出しに一致する関数がありません
注: 候補関数は実行できません: 第 1 引数の「my_type」から「my_type &&」への既知の変換はありません void func(my_type&&) {}
g++ 4.9 はほぼ同じことを言っていますが:
エラー: 'my_type' 左辺値を 'my_type&&' にバインドできません
注: 'void func(my_type&&)' の引数 1 を初期化しています
これらのエラー メッセージは、かなり混乱しています。なぜなら、ref
は確かにlvalueですが、その型はまだmy_type&&
... ですよね?
私はここで何が起こっているのかを正確に理解しようとしているので、次のうちどれが (もしあれば) 正しいのか疑問に思っています:
右辺値参照にバインドできるのは右辺値のみで
ref
あり、左辺値であるため、 にバインドすることはできませんarg
。Clang と g++ の両方からのエラー メッセージは、それが「変換できない」ref
(非参照)であると主張することで誤解を招きます。my_type
これは左辺値であるため、実際の型が であるにもかかわらず、
ref
オーバーロード解決の目的で非参照として扱われます。Clang および g++ からのエラー メッセージは、実際の.my_type
my_type&&
ref
の本体では、明示的に と書いたにもかかわらず、
main()
の型ref
はプレーンです。したがって、コンパイラからのエラー メッセージは正確であり、私の予想は間違っています。ただし、これは当てはまらないようです。my_type
my_type&&
通過します。
私が考慮していない他の魔法が進行中です。
繰り返しますが、解決策はstd::move()
rref を右辺値に変換するために使用することです。「舞台裏」で何が起こっているのかの説明を探しています。