タグ付けされた質問 「c++」

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。

3
範囲ベースのforループで転送参照を使用する利点は何ですか?
const auto&読み取り専用の操作を実行する場合は十分です。しかし、私はぶつかった for (auto&& e : v) // v is non-const 最近数回。これは私に不思議に思います: またはと比較して、一部のあいまいなケースで、転送参照を使用することでパフォーマンスが向上する可能性はありますauto&かconst auto&? (shared_ptrあいまいなコーナーケースの容疑者です) 更新 お気に入りで見つけた2つの例を。 基本型を反復するときにconst参照を使用することの欠点はありますか? 範囲ベースのforループを使用して、マップの値を簡単に反復できますか? 質問に集中してください:範囲ベースのforループでauto &&を使用する理由は何ですか?


4
`const shared_ptr <T>`と `shared_ptr <const T>`の違いは何ですか?
次のようなC ++の共有ポインターのアクセサーメソッドを書いています。 class Foo { public: return_type getBar() const { return m_bar; } private: boost::shared_ptr&lt;Bar&gt; m_bar; } したがってgetBar()、戻り値の型のconst-nessをサポートするためにboost::shared_ptrは、Barそれが指す変更を防ぐ必要があります。私の推測では、それshared_ptr&lt;const Bar&gt;は私が戻りたいタイプですconst shared_ptr&lt;Bar&gt;が、ポインタ自体が別のものを指すように再割り当てすることはできませんが、それが指すBarものの変更は許可さBarれます...しかし、私にはわかりません。確実に知っている人がこれを確認するか、間違った場合は修正していただければ幸いです。ありがとう!
115 c++  boost  const  shared-ptr 


5
CMake出力/ビルドディレクトリ
私はCMakeにかなり慣れていないので、その使用方法に関するいくつかのチュートリアルを読み、3つの異なるコンパイラー用のプログラムを作成するために、CMakeスクリプトの複雑な50行を書きました。これで、CMakeに関する私の知識はすべて終わります。 私の問題は、プログラムを作成するときに、そのフォルダーに触れたり、変更したりしたくないソースコードがあることです。すべてのCMakeおよびmake出力ファイルとフォルダーをに入れたい../Compile/ので、CMakeスクリプトのいくつかの変数をそのために変更しました。ラップトップで次のようなことをしたとき、それはしばらくの間機能しました: Compile$ cmake ../src Compile$ make それで、私が今いるフォルダーにきれいな出力がありました。それがまさに私が探しているものです。 今、私は別のコンピューターに移動し、CMake 2.8.11.2を再コンパイルしましたが、ほぼ正方形に戻りました!それは常にsrc私のものCMakeLists.txtが置かれているフォルダーに事をコンパイルします。 CMakeスクリプトでディレクトリを選択する部分は次のとおりです。 set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/) set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir}) set(CMAKE_BUILD_FILES_DIRECTORY ${dir}) set(CMAKE_BUILD_DIRECTORY ${dir}) set(CMAKE_BINARY_DIR ${dir}) SET(EXECUTABLE_OUTPUT_PATH ${dir}) SET(LIBRARY_OUTPUT_PATH ${dir}lib) SET(CMAKE_CACHEFILE_DIR ${dir}) そして今、それは常に終わります: -- Build files have been written to: /.../src …
115 c++  build  makefile  cmake  output 

30
C ++の隠された機能?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 8年前に閉鎖。 ロックされています。この質問とトピックへの回答はロックされています。質問はトピックから外れていますが、歴史的に重要です。現在、新しい回答や相互作用を受け入れていません。 一連の質問の「隠された機能」に関しては、C ++の愛はありませんか?私はそれをそこに捨てるだろうと考えました。C ++の隠された機能は何ですか?

4
「RuntimeLibrary」の不一致が検出されました
C:\ cryptoppにCrypto ++をダウンロードして解凍しました。Visual Studio Express 2012を使用してすべてのプロジェクトを(readmeの指示に従って)内部にビルドしましたが、すべてが正常にビルドされました。次に、他のフォルダにテストプロジェクトを作成し、依存関係としてcryptolibを追加しました。その後、すべてのヘッダーを簡単に含めることができるように、インクルードパスを追加しました。コンパイルしようとすると、未解決のシンボルに関するエラーが発生しました。 これを修正するために、C:\cryptopp\Win32\Output\Debug\cryptlib.lib追加の依存関係をリンクするように追加しました。今私はこのエラーを受け取ります: Error 1 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(cryptlib.obj) CryptoTest Error 2 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(iterhash.obj) CryptoTest Error 3 error LNK2038: mismatch …

6
C ++でのintのInfinityへの設定
私が持っているint a「無限大」に等しくする必要があること。これは、 int b = anyValue; a&gt;b 常に真です。 これを可能にするC ++の機能はありますか?
114 c++  infinity 

13
C ++では、わざわざ変数をキャッシュするか、コンパイラーに最適化を行わせる必要がありますか?(エイリアシング)
次のコードを考えてみてください(これpは型unsigned char*でbitmap-&gt;widthあり、整数型であり、正確には不明であり、使用している外部ライブラリのバージョンに依存します)。 for (unsigned x = 0; x &lt; static_cast&lt;unsigned&gt;(bitmap-&gt;width); ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } それを最適化する価値があります[..] これにより、次のように書くことでより効率的な結果が得られる場合があります。 unsigned width(static_cast&lt;unsigned&gt;(bitmap-&gt;width)); for (unsigned x = 0; x &lt; width; ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } ...または、コンパイラが最適化するのは簡単ですか? 「より良い」コードは何だと思いますか? 編集者からのメモ(Ike):取り消しテキストについて疑問に思っている方のために、元の質問は、フレーズどおり、トピックから外れた領域に危険なほど近く、肯定的なフィードバックにもかかわらず非常に閉じていました。これらは打たれました。ただし、質問のこれらの被害を受けたセクションに対応した回答者を罰しないでください。

2
C ++ 11でunordered_mapが挿入したものを破棄することは、C ++標準委員会の意図ですか?
unordered_map :: insert()が挿入した変数を破壊するという非常に奇妙なバグを追跡して、3日間の人生を失ったところです。この非常に明白でない動作は、ごく最近のコンパイラーでのみ発生します。clang3.2-3.4およびGCC 4.8が、この「機能」を示す唯一のコンパイラーであることがわかりました。 この問題を示す、私のメインコードベースからの削減されたコードを次に示します。 #include &lt;memory&gt; #include &lt;unordered_map&gt; #include &lt;iostream&gt; int main(void) { std::unordered_map&lt;int, std::shared_ptr&lt;int&gt;&gt; map; auto a(std::make_pair(5, std::make_shared&lt;int&gt;(5))); std::cout &lt;&lt; "a.second is " &lt;&lt; a.second.get() &lt;&lt; std::endl; map.insert(a); // Note we are NOT doing insert(std::move(a)) std::cout &lt;&lt; "a.second is now " &lt;&lt; a.second.get() &lt;&lt; std::endl; return 0; } …
114 c++  gcc  c++11  clang  standards 

11
スマートポインター:オブジェクトの所有者は誰ですか?[閉まっている]
ここで何が尋ねられているのかを知るのは難しい。この質問は、あいまいで、あいまいで、不完全で、過度に広い、または修辞的であり、現在の形では合理的に回答することができません。再開できるようにこの質問を明確にするヘルプについては、ヘルプセンターに アクセスしてください。 8年前に閉鎖。 C ++はすべてメモリの所有権、つまり所有権のセマンティクスです。 動的に割り当てられたメモリのチャンクの所有者は、そのメモリを解放する必要があります。したがって、問題は実際には誰がメモリを所有するかになります。 C ++での所有権は、生のポインターが内部にラップされるタイプによって文書化されているため、優れた(IMO)C ++プログラムでは、生のポインターが渡されるのを確認することは非常にまれです(まれではありません)(生のポインターには推論された所有権がないため、誰がメモリの所有者であるかを知らないため、ドキュメントを注意深く読まなければ、誰が所有者であるかはわかりません) 逆に、クラスに生のポインタが格納されていることはまれです。各生のポインタは、独自のスマートポインタラッパー内に格納されます。(注:オブジェクトを所有していない場合は、オブジェクトがスコープ外になり、破棄されるタイミングがわからないため、オブジェクトを格納しないでください。) だから質問: 人々が遭遇した所有権のセマンティクスのタイプは何ですか? これらのセマンティクスを実装するために使用される標準クラスは何ですか? どのような場合に役立ちますか? 回答ごとに1種類のセマンティック所有権を保持し、個別に投票できるようにします。 概要: 概念的には、スマートポインターは単純で、単純な実装は簡単です。私は多くの試みられた実装を見てきましたが、それらは常に何らかの方法で壊れており、何気ない使用や例には明らかではありません。したがって、自分でロールするのではなく、ライブラリから十分にテストされたスマートポインタを常に使用することをお勧めします。std::auto_ptrまたは、Boostスマートポインターの1つが私のニーズをすべてカバーしているようです。 std::auto_ptr&lt;T&gt;: 一人がオブジェクトを所有しています。所有権の譲渡が許可されています。 使用法:これにより、所有権の明示的な移転を示すインターフェースを定義できます。 boost::scoped_ptr&lt;T&gt; 一人がオブジェクトを所有しています。所有権の譲渡は許可されていません。 使用法:明示的な所有権を示すために使用されます。オブジェクトは、デストラクタによって、または明示的にリセットされたときに破棄されます。 boost::shared_ptr&lt;T&gt;(std::tr1::shared_ptr&lt;T&gt;) 複数の所有権。これは単純な参照カウントポインターです。参照カウントがゼロに達すると、オブジェクトは破棄されます。 使用法:オブジェクトが、コンパイル時に決定できない存続期間を持つ複数の所有者を持つことができる場合。 boost::weak_ptr&lt;T&gt;: shared_ptr&lt;T&gt;ポインタのサイクルが発生する可能性がある状況で使用されます。 使用法:サイクルのみが共有参照カウントを維持しているときに、サイクルがオブジェクトを保持しないようにするために使用されます。

9
C ++では「int&foo()」は何を意味しますか?
左辺値と右辺値に関するこの説明を読んでいると、次のコード行が突き刺さっていました。 int&amp; foo(); foo() = 42; // OK, foo() is an lvalue 私はそれをg ++で試しましたが、コンパイラは「foo()への未定義の参照」と言っています。追加した場合 int foo() { return 2; } int main() { int&amp; foo(); foo() = 42; } 正常にコンパイルされますが、実行するとセグメンテーション違反が発生します。ただの線 int&amp; foo(); コンパイルするだけで問題なく実行されます。 このコードはどういう意味ですか?どのように値を関数呼び出しに割り当てることができますか、そしてそれはなぜ右辺値ではないのですか?


9
可変引数リストを受け入れる別の関数に可変引数を渡す
だから私は2つの関数があり、どちらも同じような引数を持っています void example(int a, int b, ...); void exampleB(int b, ...); ここでをexample呼び出しますがexampleB、変更せずに変数引数リストの変数を渡すにはどうすればよいですかexampleB(これはすでに他の場所でも使用されているため)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.