問題タブ [temporary-objects]

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.

0 投票する
1 に答える
950 参照

c++ - const参照によるtemporaryの延命

0 投票する
2 に答える
1330 参照

sql-server-2012 - マルチパート識別子「フィールド」をバインドできませんでした

一時的な結果セット (コード内の SOURCE) に格納されたデータを使用して、別のテーブルに SQL Server 2012 を入力しようとしています。以下のコードを実行すると、「The multi-part identifier "SOURCE.JnlDetoaId" could not縛られる」。

here についていくつかのスレッドを読みましたが、それらを私のケースに適用する方法がわかりませんでした。何か助けてください。

0 投票する
2 に答える
1624 参照

c++ - 非 const 参照パラメータを一時オブジェクトにバインドできるのはなぜですか?

エラー C2664: 'void f4(char &)': 引数 1 を 'char' から 'char &' に変換できません

私は、C++ では非 const 参照パラメーターを一時オブジェクトにバインドできないと教えられました。上記のコードでは、f2(f1());期待どおりにエラーが発生します。

しかし、なぜ同じルールがコード行に適用されないのf4(f3());でしょうか?

PS: 私のコンパイラは VC++ 2013 です。行にコメントを付けても、f2(f1());含まれているコードはf4(f3());エラーや警告なしでコンパイルされます。

アップデート:

MSDNは次のように述べています。

Visual C++ の以前のリリースでは、非 const 参照を一時オブジェクトにバインドできました。現在、一時オブジェクトは const 参照にのみバインドできます。

なのでVC++のバグだと思います。バグレポートをVC++ チームに提出しました

0 投票する
1 に答える
127 参照

c++ - 一時オブジェクトへの非定数参照を使用して、その寿命を延ばすことができるのはなぜですか?

私が知っているように、一時オブジェクトへの非 const 参照は形式が正しくありません。ただし、上記のコードは、C++ では合法であるように思われることを示しています。なんで?

私のコンパイラは VC++ 2013 です。

0 投票する
1 に答える
246 参照

c++ - vector.push_back() の呼び出し時にコピー コンストラクター / デストラクタを回避する

MemRefメモリへのポインタと長さを含む小さなオブジェクトです。クリティカル セクションでの文字列のコピーを最小限に抑えることは、最適化プロジェクトの中心です。トークンはdeque<MemRef>.

MemRef入力バッファーでトークンを識別したら、 s を作成してトークン両端キューに追加したいと考えています。最初の試みは:

ここで dtor 呼び出しを見たので、fooが作成され、コピーされ、その後破棄されていることがわかりました。次の試みは:

しかし、私は同じ行動を見ました。私の推測では、テンポラリーが作成され、deque にコピーされてから破棄され、おそらくこれが「移動セマンティクス」の対象になるところです (これについてはよくわかりません)。

MemRef実際、一時的なものを作成および破棄せずに、トークンの両端キューに直接構築する方法はありますか?

(私は --std=c++11 で Apple LLVM バージョン 5.0 (clang-500.2.79) を使用しています)

0 投票する
1 に答える
90 参照

c++ - テンプレート化された演算子 string() は一時オブジェクトの場合にコンパイルされません

main の最後の行がコンパイルに失敗する理由を知っている人はいますか (失敗するのはコンパイルであることに注意してください):

メインの行のコメントで示したように、

  • Foo から文字列への暗黙的な変換は、非一時オブジェクト (foo など) で正常にコンパイルされます。
  • int(またはlongなど)に変換するときの一時オブジェクトと同様に
  • メソッドを介して文字列に変換する場合は正常に機能します
  • const string&タイプが文字列の代わりである場合と同様に

VS2010でこれを試しました。上記のコードは 2005 年には問題なくコンパイルされますが、2010 年は正しいと思います。

テンプレート定義と特殊化を削除し、各オーバーロードを明示的に定義するだけで、演算子による文字列への暗黙的な変換は正常に機能します。

保守性が低いため、この回避策を使用しないことをお勧めします。

main() の最後の行を正常にコンパイルする別の方法を知っている人はいますか? テンプレートが関係しているかどうかに関係なく、複数の変換 (char *、alloc、string) が可能であり、オブジェクトが一時的であるという事実が重要であるように思われるため、Explicit conversion および templated conversion operatorに対する受け入れられた回答はここでは適用されないと思います.

編集:この投稿の元のコードは、クラス内のテンプレートの特殊化を示していました。これは、元のソースから SO のスタンドアロン コードを作成した結果でした (名前空間レベルの特殊化をクラスに移動しましたが、VS2010 は文句を言いませんでした)。問題は専門分野ではありません。投稿されたコードを元のコードに近づけるように変更し (私が行ったように)、クラス内の特殊化を使用しません (もちろん問題はまだあります)。Derek's answer は、VS2010 に固有のものである可能性があることを示しています。