問題タブ [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++ - 移動コンストラクターのみを提供するのは悪い形式ですか?
関数から型のコピー不可能なオブジェクトを返したいFoo
です。これは基本的に、呼び出し元が一連のアクションを実行するために使用するヘルパー オブジェクトであり、アクションの完了後にデストラクタを使用してクリーンアップを実行します。
右辺値参照が出現する前は、 ashared_ptr<Foo>
または同様のものを返していました。右辺値参照では、コンストラクターとコピー コンストラクターをプライベートにし、唯一のパブリック コンストラクターをムーブ コンストラクターにするという別のオプションがあります。Foo
次のようになります。
私の質問は、これを行うのが悪い形なのか、それとも合理的に見えるのかということです。これが問題を引き起こしたり、読みにくくなったりする理由は考えられませんが、右辺値参照に関してはまだ初心者なので、考えていない考慮事項があるかもしれません。
rvalue-reference - 暗黙的な変換でコンストラクター (右辺値参照) を移動する
C++ プロジェクトを MSVC 2008 から 2010 にアップグレードしていますが、新しい CComBSTR 移動コンストラクター [CComBSTR( CComBSTR&& )] が原因で、あいまいな呼び出しが原因でコンパイラ エラーが発生します。
基本的に、CComBSTR へのキャスト演算子を持つ std::wstring に非常によく似た String クラスがあります。これは、次のコードに似ています。
ここで、コードのいくつかの場所で、次のことを行います。
VS2008 では、CString オブジェクトが暗黙的に CComBSTR 右辺値に変換され、CComBSTR のコピー コンストラクター (const CComBSTR& を取る) が呼び出されて objectName を構築するため、これは機能します。
ただし、C++0x を使用する VS2010 では、CComBSTR 右辺値がコピー コンストラクターと移動コンストラクターの両方に適合するように見えるため、コンパイラはあいまいな呼び出しエラーを返します。
少し不器用ですが、この問題に対する私の解決策は、GetName への呼び出しを static_cast することです。
どちらの行もエラーなしでコンパイルされますが、これが違法か、悪い習慣か、未定義かについてアドバイスが必要です。ありがとうございました。
c++ - 誰かが例外に関して右辺値参照を説明できますか?
私がこの例外クラスを持っているとしましょう:
値または(const)lvaluerefでキャッチしようとしたとき。コンパイラは、これらのケースはすでに右辺値refcatch
句によって処理されていると言います。これは、例外がxvalueであり、おそらくxvalueをキャッチする最良の方法は右辺値refです(間違っている場合は訂正してください)。しかし、誰かが上記の例外作成の場合の完全な転送について説明できますか?それが正しいか?コンパイルしても意味がありますか、それとも便利ですか?私が使用するC++ライブラリには、std::exception
この種の使用法を本当に意味のあるものにするために、moveコンストラクターを実装する必要がありますか?例外に関する右辺値参照に関する記事とSOの質問を検索しようとしましたが、見つかりませんでした。
c++ - オブジェクトまたはダミーへの参照をバインドするスタイル
右辺値参照を特定のオブジェクトまたはその一時コピーにバインドするための最良の方法は何ですか?
(このコードは最近のGCC 4.6では機能しません…以前は機能していたことを思い出しますが、現在は常にコピーを返します。)
最初の行で、左辺値からx値にstatic_cast
変換します。my_A
(C++0x§5.2.9/1-3)static_cast
2行目の内側は左辺値から右辺値への変換を実行し、外側はこの値からx値を取得します。
名前付き参照は§12.2/5に従って条件付きで一時的にバインドされるため、これはサポートされているようです。同じトリックは、const
参照を使用してC++03でも同じように機能します。
同じことをあまり冗長に書くこともできません。
今でははるかに短くなっています。最初の省略形は疑わしいです:move
単なる左辺値からx値から左辺値へのシャッフルではなく、オブジェクトに何かが起こっていることを示すことになっています。紛らわしいことに、関数呼び出しが一時から参照へのバインドを中断するため、のmove
後に使用することはできません。:
構文A(my_A)
はおそらくより明確ですがstatic_cast
、技術的にはCスタイルのキャストと同等です。
私はずっと行き、それを完全にCスタイルのキャストで書くこともできます:
結局のところ、これがイディオムになるのであれば、それは便利である必要があり、static_cast
とにかく私を何からも実際に保護しているわけではありません。本当の危険はmy_A
、true
ケースに直接バインドできないことです。
一方、これは3回繰り返されるタイプ名によって簡単に支配されます。大きくて醜いtemplate-idに置き換えられた場合A
、私は本当に本当のショートカットが欲しいと思います。
(5回表示されているにもかかわらず、1回だけ評価されることに注意してくださいV
:)
マクロはハックですが、それが最良の選択肢だと思います。xvalueを返すため、少し危険です。したがって、参照の初期化以外では使用しないでください。
私が考えていなかった何かがあるに違いありません…提案?
c++ - C++0x: 条件演算子、xvalues、および decltype
comp.std.c++ Usenet の議論が非常に信頼できなくなったため、ここに再投稿します。私がそこに提出した最後のいくつかの投稿は無効になり、活動はほとんど停止しました. 私が禁止されているか、他の人が興味を失ったのではないかと思います。興味のあるすべての人がこの議論を見つけて、一般的な移行が行われることを願っています。たぶん、彼らは新しいモデレーターを任命するでしょう。
こんにちは!
条件演算子と xvalues に関するドラフト N3126 の私の現在の解釈では、次のアサーションが保持されると予想されます。
5.16/4 言います:
[条件演算子への] 2 番目と 3 番目のオペランドが同じ値カテゴリの glvalue で、同じ型の場合、結果はその型と値カテゴリになります [...]
ただし、結果の glvalue が glvalue オペランドが参照するオブジェクトの 1 つを参照することを明確に述べているわけではありません。C++0x モードで GCC 4.5.1 を使用すると、2 番目のアサーションが失敗します。参照 k は、何らかの一時オブジェクトを参照しているようです。コロンの周りの両方のオペランドが同じタイプの xvalue である場合に、コミラーがそのような一時的なものを作成できるかどうかを誰かが明確にすることはできますか?
私は現在、GCC にバグがあるか、xvalue に関して最新ではないことを想定しています。
フォローアップの質問は、次のとおりです。式の値カテゴリを検出できたらいいと思いませんか? 条件演算子を無視すると、decltype を使用して式の値カテゴリを検出できます。しかし、何が
譲るべきか?GCC 4.5.1 を使用すると、xvalue 変数は false で初期化されます。これは現在の標準草案に準拠していますか?
ティア、セバスチャン
c++ - C++0x 右辺値参照テンプレートの引数推定
ここで作成されたGMan のおいしく邪悪なauto_cast
ユーティリティ関数を考えると、(MSVC 10.0 で) 右辺値から取得しようとしているときにコンパイルされない理由を理解しようとしています。auto_cast
私が使用しているコードは次のとおりです。
私の能力を最大限に発揮するために、C++0x 参照の折りたたみ規則と、ここで概説されているテンプレート引数推定規則に従おうとしましたが、上記のコードが機能するはずであると言える限りです。
0x より前の C++ では、参照への参照を取ることは許可されていないことを思い出してください。A& & のようなものはコンパイル エラーを引き起こします。対照的に、C++0x では、次の参照折りたたみ規則が導入されています。
- A& & が A& になる
- A& && は A& になります
- A&& & が A& になる
- A&& && は A&& になります
2 番目の規則は、テンプレート引数への右辺値参照によって引数を取る関数テンプレートの特別なテンプレート引数推定規則です。
ここでは、次の規則が適用されます。
- 型 A の左辺値で foo が呼び出されると、T は A& に解決されるため、上記の参照折りたたみルールにより、引数の型は事実上 A& になります。
- 型 A の右辺値で foo が呼び出されると、T は A に解決されるため、引数の型は A&& になります。
への呼び出しにマウスをauto_cast( 5.0f )
合わせると、ツールチップにその戻り値が として正しく表示されるようになりましauto_cast_wrapper<float>
た。これは、コンパイラが規則 2 に正しく従っていることを意味します。
型 A の右辺値で foo が呼び出されると、T は A に解決されます。
したがって、 があるauto_cast_wrapper<float>
ので、コンストラクターはインスタンス化して を取得する必要がありますfloat&&
。float
しかし、エラーメッセージは、インスタンス化してby 値を取ることを暗示しているようです。
T=float が正しく、T&& パラメータが T? になることを示す完全なエラー メッセージを次に示します。
何かご意見は?
c++ - 基本クラスmovectorの呼び出し[C++0x]
基本クラスのmovectorを呼び出す正しい方法はどれですか?
これ(MSVC2010では機能しますが、CBuilder2010では機能しません):
または(CBuilder2010では機能しますが、MSVC2010では機能しません):
または、両方とも間違っていますか?もしそうなら、正しい方法は何ですか(C ++ 0x標準で指定されているものに関して)?
注:CBuilderXEで機能させる方法がわかりません(どちらのバージョンも機能しません)。
c++ - 非定数参照をC++の右辺値に渡す
次のコード行:
プロトタイプを使用した関数の呼び出し:
このエラーが表示されます:
libcpfs / mkfs.cc:99:53:エラー:タイプ「File」の右辺値からのタイプ「File&」の非定数参照の無効な初期化
libcpfs / mkfs.cc:30:13:エラー:「voidbootrec_reset(File&、ssize_t)」の引数1を渡す際に
const &
標準に従って、非定数参照()を右辺値に渡すことはできないことを認識しています。ただし、MSVCではこれを行うことができます(この質問を参照)。この質問は理由を説明しようとしますが、彼はリテラルへの参照を使用しているため、答えは意味がありません。リテラルへの参照は、コーナーケースであり、明らかに許可されるべきではありません。
与えられた例では、次の順序のイベントが発生することは明らかです(MSVCの場合と同様)。
File
のコンストラクタが呼び出されます。File
、、およびへの参照がblksize
スタックにプッシュされます。bootrec_reset
を利用しfile
ます。- から戻った後
bootrec_reset
、一時的なFile
ものは破棄されます。
File
非constメソッドが呼び出されるファイルへの一時的なハンドルであるため、参照は非constである必要があることを指摘する必要があります。File
さらに、そこに構築されるコンストラクター引数を渡したくありません。また、呼び出し元でオブジェクトbootrec_reset
を手動で構築して破棄する理由もわかりません。File
だから私の質問は:
- この方法で非定数参照を許可しないC++標準を正当化するものは何ですか?
- GCCにこのコードを許可させるにはどうすればよいですか?
- 今後のC++0x標準はとにかくこれを変更しますか、それとも新しい標準が私に与える何か、ここでより適切なものがありますか?
c++ - 右辺値参照を認識する必要があるのは、どのような種類のコードですか?
右辺値参照を理解するのに問題を抱えている人がたくさんいます。「通常の」C++ コード (たとえば、標準ライブラリを使用するが、それを実装していない) は、新しい標準が登場したら右辺値参照について知る必要がありますか、それとも人々/コードは右辺値参照が存在しないふりをすることができますか? 右辺値参照は、主にライブラリの実装者またはすべてのプログラマに関係しますか?
c++ - DにはC++0xの移動セマンティクスに似たものがありますか?
std::vector<T>
外部リソース(またはなど)を使用した「値型」の問題はstd::string
、それらのコピーは非常にコストがかかる傾向があり、コピーはさまざまなコンテキストで暗黙的に作成されるため、パフォーマンスの問題になる傾向があります。この問題に対するC++0xの答えは、移動セマンティクスです。これは、概念的にはリソースの盗用の概念に基づいており、技術的には右辺値参照によって強化されています。
Dには、移動セマンティクスまたは右辺値参照に似たものがありますか?