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

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

5
カスタムstd :: setコンパレーターの使用
OverаэтотвопросестьответынаStack Overflowнарусском:Компаратордляset 整数のセット内のアイテムのデフォルトの順序を数値ではなく辞書式に変更しようとしています。次のものをg ++でコンパイルすることはできません。 file.cpp: bool lex_compare(const int64_t &a, const int64_t &b) { stringstream s1,s2; s1 << a; s2 << b; return s1.str() < s2.str(); } void foo() { set<int64_t, lex_compare> s; s.insert(1); ... } 次のエラーが発生します。 error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class …
105 c++  stl 

2
constexprはインラインを意味しますか?
次のインライン関数について考えてみます。 // Inline specifier version #include<iostream> #include<cstdlib> inline int f(const int x); inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); } そしてconstexprの同等バージョン: // Constexpr specifier version #include<iostream> #include<cstdlib> constexpr int f(const int x); constexpr int f(const int x) { return 2*x; …

5
値渡しとstd :: moveが参照渡しよりも優れている点
私は現在C ++を学んでおり、悪い習慣を身につけないようにしています。私が理解していることから、clang-tidyには多くの「ベストプラクティス」が含まれており、可能な限り最善を尽くすように努めていますが(なぜそれらがまだ優れていると見なされているのかは必ずしも理解していません)、私は確信が持てませんここで何が推奨されているかを理解してください。 私はチュートリアルからこのクラスを使用しました: class Creature { private: std::string m_name; public: Creature(const std::string &name) : m_name{name} { } }; これは、参照ではなく値で渡し、を使用する必要があるというclang-tidyからの提案につながりますstd::move。実行するとname、参照を作成するように提案され(毎回コピーされないようにするため)、警告が表示さstd::moveれるので影響がないためname、const削除する必要があります。 警告を受け取らない唯一の方法は、const完全に削除することです。 Creature(std::string name) : m_name{std::move(name)} { } 唯一の利点はconst元の文字列をいじるのを防ぐことだったので、これは理にかなっているように見えます(値で渡したため発生しません)。しかし、私はCPlusPlus.comで読みました: ただし、標準ライブラリでは、移動は移動元のオブジェクトが有効ですが指定されていない状態のままであることを意味します。つまり、そのような操作の後、移動されたオブジェクトの値は破棄されるか、新しい値が割り当てられるだけです。それ以外の方法でアクセスすると、未指定の値が生成されます。 このコードを想像してみてください: std::string nameString("Alex"); Creature c(nameString); nameString値で渡されるため、コンストラクター内でstd::moveのみ無効化さnameれ、元の文字列には触れません。しかし、これの利点は何ですか?とにかくコンテンツが一度だけコピーされるようです-を呼び出すときに参照m_name{name}渡しする場合、渡すときに値渡しする場合(そして移動される場合)。これは、値を渡して使用しないよりも優れていることを理解していますstd::move(2回コピーされるため)。 したがって、2つの質問: ここで何が起こっているのかを正しく理解しましたか? std::move参照渡しを使用して呼び出すだけのメリットはありm_name{name}ますか?
105 c++ 

13
C ++関数が特定の変数の値を変更するかどうかを判断できるコンパイラーを構築できないのはなぜですか?
私は本でこの行を読みました: C ++関数が特定の変数の値を変更するかどうかを実際に決定できるコンパイラを構築することはおそらく不可能です。 このパラグラフは、コンパイラがcons-nessをチェックするときに保守的である理由について話していました。 なぜそのようなコンパイラを構築することが不可能なのですか? コンパイラーは常に、変数が再割り当てされているか、非const関数が呼び出されているか、または非constパラメーターとして渡されているかどうかを常にチェックできます...

8
C ++ 11サポートを確認するにはどうすればよいですか?
コンパイラがC ++ 11の特定の機能をサポートしているかどうかをコンパイル時に検出する方法はありますか?たとえば、次のようなもの: #ifndef VARIADIC_TEMPLATES_SUPPORTED #error "Your compiler doesn't support variadic templates. :(" #else template <typename... DatatypeList> class Tuple { // ... } #endif
104 c++  c++11 

10
構造体にインデックスを付けることは合法ですか?
コードがどれほど「悪い」かに関わらず、また、アライメントなどがコンパイラー/プラットフォームの問題ではないと想定すると、これは未定義または壊れた動作ですか? 私がこのような構造体を持っている場合:- struct data { int a, b, c; }; struct data thing; それは法的にアクセスするa、bとcのように(&thing.a)[0]、(&thing.a)[1]と(&thing.a)[2]? いずれの場合も、すべてのコンパイラとプラットフォームで試してみましたが、すべての設定で「機能しました」。コンパイラがbとthing [1]が同じものであることに気付かず、 'b'へのストアがレジスターに入れられ、thing(1)がメモリーから誤った値を読み取る(たとえば)のではないかと心配しています。すべてのケースで私はそれを試したが、正しいことをした。(もちろん、それはあまり証明されていません) これは私のコードではありません。それは私が作業しなければならないコードです、これは悪いコードであるか壊れたコードであるかに興味があります。 タグ付きCおよびC ++。私は主にC ++に興味がありますが、それが異なる場合はCも興味があります。
104 c++  c  struct 

7
なぜargcは定数ではないのですか?
int main( const int argc , const char[] const argv) 効果的なC ++アイテム#3の状態「可能な限り使用することはCONST」、私は「なぜこれらの『定数』パラメータをしない考え始めますconst」?。 argcプログラムのの値が変更されるシナリオはありますか?
104 c++  const  main  argc  effective-c++ 



4
bool演算子++および-
今日、Visual C ++コードを書いているときに、驚いたことに遭遇しました。C ++はboolの++(インクリメント)をサポートしているようですが、-(デクリメント)はサポートしていません。これは単なるランダムな決定ですか、それとも背後に何らかの理由がありますか? これはコンパイルします: static HMODULE hMod = NULL; static bool once = false; if (!once++) hMod = LoadLibrary("xxx"); これはしません: static HMODULE hMod = NULL; static bool once = true; if (once--) hMod = LoadLibrary("xxx");
104 c++  boolean  increment 

27
3番目の変数を使用せずに2つの変数値を交換する
インタビューで尋ねられた非常にトリッキーな質問の1つ。 a=10およびのような2つの変数の値を交換しますb=15。 通常、2つの変数の値を交換するには、次のような3番目の変数が必要です。 temp=a; a=b; b=temp; ここでの要件は、3番目の変数を使用せずに2つの変数の値を交換することです。
104 c++ 

1
C ++コンパイルエラー:初期化子がありますが、型が不完全です
私はEclipseでコーディングしていて、次のようなものがあります: #include <ftream> #include <iostream> void read_file(){ char buffer[1025]; std::istringstream iss(buffer); } しかし、ビルドしようとすると、次のエラーが発生します。 variable 'std::istringstream iss' has initializer but incomplete type 簡単な考えはありますか?私はググってみましたが、この問題を抱えているほとんどの人は、私が正しく行っていると思う正しいヘッダーファイルを単に含んでいないようです。

3
C ++ 20のコルーチンとは何ですか?
コルーチンとは c ++ 20? 「Parallelism2」または「および/または」「Concurrency2」(下記の画像をご覧ください)とはどのように異なりますか? 以下の画像はISOCPPからのものです。 https://isocpp.org/files/img/wg21-timeline-2017-03.png
104 c++  coroutine  c++20 

3
CC、gcc、g ++の違いは?
アセンブリコードの生成、使用可能なライブラリ、言語機能などの点で、CおよびC ++コードをコンパイルするときの3つのコンパイラCC、gcc、g ++の違いは何ですか?
104 c++  c  gcc  compilation 

19
CMakeLists.txt:30(プロジェクト)でのCMakeエラー:CMAKE_C_COMPILERが見つかりませんでした
私は、CMakeを使用してVisual Studioソリューションを作成し、最新バージョンのasepriteをコンパイルしようとしています。 No CMAKE_C_COMPILER could be found. No CMAKE_CXX_COMPILER could be found. すでにGCCをダウンロードしており、Visual Studio 2015を使用しています。 私はこのチュートリアルに従っています: https://github.com/aseprite/aseprite/blob/master/INSTALL.md

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