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

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

8
initializer_listおよび移動セマンティクス
から要素を移動することはできstd::initializer_list<T>ますか? #include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // kosher? } } 以来std::intializer_list<T>、特別なコンパイラの注意を必要とし、C ++標準ライブラリの通常のコンテナのような値のセマンティクスを持っていない、私はむしろ後悔するより安全であると聞いて思います。


2
Makefileで複数のインクルードパスを定義する方法
C ++の新機能。インクルード、ライブラリ、およびコンパイルプロセスの基本的な理解。いくつかの単純なmakefileはまだありましたか。 私の現在のプロジェクトでは、informix DB apiを使用しているため、ヘッダーファイルを複数の非標準ディレクトリに含める必要があります。どうやって書くの?ネットで何かを発見したことはありません、おそらく私が良い検索用語を使用しなかったためです これは私が試した方法の1つです(動作しません)。メイクファイルを表示するだけです LIB=-L/usr/informix/lib/c++ INC=-I/usr/informix/incl/c++ /opt/informix/incl/public default: main main: test.cpp gcc -Wall $(LIB) $(INC) -c test.cpp #gcc -Wall $(LIB) $(INC) -I/opt/informix/incl/public -c test.cpp clean: rm -r test.o make.out
96 c++  include  makefile 

11
致命的なエラー:Visual Studioの「ターゲットアーキテクチャなし」
Win32またはx64モードのVisual Studio 2010を使用してc ++プロジェクトをコンパイルしようとすると、次のエラーが発生します。 >C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(135): fatal error C1189: #error : "No Target Architecture" 私のプリプロセッサ定義はWIN32; _DEBUG; _CONSOLE;%(PreprocessorDefinitions)と言っています このエラーの原因と修正方法を教えてください。 // winnt.h: lines 127-136, MSVS says this is an inactive preprocessor block #if defined(_WIN64) #if defined(_AMD64_) #define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD ) #elif defined(_IA64_) #define PROBE_ALIGNMENT( _s ) (TYPE_ALIGNMENT( …

1
委任コンストラクターの使用中のメンバーの初期化
私はC ++ 11標準を試し始めましたが、同じクラスの別のctorからctorを呼び出してinitメソッドなどを回避する方法を説明するこの質問を見つけました。今、私は次のようなコードで同じことを試しています: hpp: class Tokenizer { public: Tokenizer(); Tokenizer(std::stringstream *lines); virtual ~Tokenizer() {}; private: std::stringstream *lines; }; cpp: Tokenizer::Tokenizer() : expected('=') { } Tokenizer::Tokenizer(std::stringstream *lines) : Tokenizer(), lines(lines) { } しかし、これは私にエラーを与えています: In constructor ‘config::Tokenizer::Tokenizer(std::stringstream*)’: /path/Tokenizer.cpp:14:20: error: mem-initializer for ‘config::Tokenizer::lines’ follows constructor delegationTokenizer()の部分をリストの最初と最後に移動しようとしましたが、それは役に立ちませんでした。 これの背後にある理由は何ですか、どうすれば修正できますか?代わりにをlines(lines)体に移動してみましたが、this->lines = lines;正常に動作します。しかし、私は本当に初期化リストを使用できるようにしたいと思います。

6
C ++ 17でstd :: make_uniqueを使用する理由
私が理解している限りでは、C ++ 14が導入さstd::make_uniqueれたのは、パラメーターの評価順序が指定されなかった結果、これが安全ではなかったためです。 f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A (説明:評価が最初にrawポインターにメモリを割り当て、次に呼び出しをg()行い、std::unique_ptr構築前に例外がスローされた場合、メモリがリークします。) 呼び出しstd::make_uniqueは呼び出し順序を制限する方法であり、これにより物事が安全になります。 f(std::make_unique<MyClass>(param), g()); // Syntax B それ以来、C ++ 17があまりにも構文Aの安全を作り、評価順序を明らかにしたので、ここで私の質問です:まだ使用する理由であるstd::make_unique以上std::unique_ptrの++ 17 Cでコンストラクタを?いくつか例を挙げていただけますか? 今のところ、私が想像できる唯一の理由は、それがMyClass一度だけタイプできることです(あなたがでポリモーフィズムに依存する必要がないと仮定するとstd::unique_ptr<Base>(new Derived(param)))。しかし、それはかなり弱い理由のようです、特にstd::make_uniqueがstd::unique_ptrコンストラクターを使用している削除者を指定できないです。 そして明確にするために、私はstd::make_unique標準ライブラリから削除することを支持することはしません(少なくとも後方互換性のためにそれを維持することは推奨しません)。std::unique_ptr
96 c++  c++17  unique-ptr 

6
不明なサイズのstd :: arrayを関数に渡す
C ++ 11では、既知の型でサイズが不明なstd :: arrayを受け取る関数(またはメソッド)をどのように記述すればよいでしょうか? // made up example void mulArray(std::array<int, ?>& arr, const int multiplier) { for(auto& e : arr) { e *= multiplier; } } // lets imagine these being full of numbers std::array<int, 17> arr1; std::array<int, 6> arr2; std::array<int, 95> arr3; mulArray(arr1, 3); mulArray(arr2, 5); mulArray(arr3, 2); …
96 c++  c++11  stdarray 

7
C ++ 11で列挙型クラスの値を出力するにはどうすればよいですか
enum classC ++ 11での値を出力するにはどうすればよいですか?C ++ 03では次のようになります。 #include <iostream> using namespace std; enum A { a = 1, b = 69, c= 666 }; int main () { A a = A::c; cout << a << endl; } c ++ 0xでは、このコードはコンパイルされません #include <iostream> using namespace std; enum class A { a …

3
C ++ 11でstd :: functionが空かどうかを適切に確認する方法
std::functionが空かどうかを適切に確認する方法を知りたいと思っていました。この例を考えてみましょう: class Test { std::function<void(int a)> eventFunc; void registerEvent(std::function<void(int a)> e) { eventFunc = e; } void doSomething() { ... eventFunc(42); } }; このコードはMSVCで正常にコンパイルされdoSomething()ますがeventFunc、コードを初期化せずに呼び出した場合、コードは明らかにクラッシュします。それは予想されますが、私は何の価値があるのeventFuncかと思っていました。デバッガは言う'empty'。だから私は単純なifステートメントを使用してそれを修正しました void doSomething() { ... if (eventFunc) { eventFunc(42); } } これは機能しますが、未初期化の値は何std::functionですか?私が書きたいと思いif (eventFunc != nullptr)ますがstd::function(明らかに)ポインタではありません。 なぜ純粋なものが機能するのですか?その背後にある魔法は何ですか?そして、それをチェックする方法は正しいですか?

12
C ++ベクトルを最後から最初まで反復する
ベクトルを最後から最初まで反復することは可能ですか? for (vector<my_class>::iterator i = my_vector.end(); i != my_vector.begin(); /* ?! */ ) { } または、それはそのようなものでのみ可能です: for (int i = my_vector.size() - 1; i >= 0; --i) { }
96 c++  vector  iterator 

2
C ++ 20までのint未定義の動作にmallocを使用しています
次のコードはC ++ 20まで未定義の動作をしていると言われました。 int *p = (int*)malloc(sizeof(int)); *p = 10; 本当? 引数は、intオブジェクトに値を割り当てる前にオブジェクトの存続期間が開始されないというものでした(P0593R6)。問題を解決するには、配置newを使用する必要があります。 int *p = (int*)malloc(sizeof(int)); new (p) int; *p = 10; オブジェクトの存続期間を開始するために、簡単なデフォルトのコンストラクターを呼び出す必要が本当にありますか? 同時に、コードは純粋なCで未定義の動作をしません。しかし、intCコードでを割り当て、それをC ++コードで使用するとどうなりますか? // C source code: int *alloc_int(void) { int *p = (int*)malloc(sizeof(int)); *p = 10; return p; } // C++ source code: extern "C" int *alloc_int(void); …

4
'::'を 'に置き換えます。'C ++で曖昧さを作成しますか?
C ++では、演算子::を使用して、名前空間またはクラスのクラス、関数、および変数にアクセスします。 オブジェクトのインスタンス変数/メソッドにアクセスするときのように、言語仕様がこれらのケースの.代わりに使用された場合、::それにより、::? C ++では型名でもある変数名が許可されていないので、それが起こる可能性があるケースは考えられません。 明確化:::選ばれた理由を尋ね.ているのではありません。


6
std :: initializer_listが組み込み言語ではないのはなぜですか?
std::initializer_listコア言語が組み込まれていないのはなぜですか? これはC ++ 11の非常に重要な機能であり、独自の予約済みキーワード(または同様のもの)がないように思えます。 代わりに、initializer_listそれはだだけで、特別な、暗黙の持っている標準ライブラリのテンプレートクラスのマッピング新しいからブレース-のinit-リスト {...}コンパイラによって処理の構文を。 最初は、このソリューションはかなりハックです。 これは、C ++言語への新しい追加が実装される方法ですか?コア言語ではなく、いくつかのテンプレートクラスの暗黙のロールによって? これらの例を検討してください: widget<int> w = {1,2,3}; //this is how we want to use a class 新しいクラスが選ばれた理由: widget( std::initializer_list<T> init ) これらのアイデアのいずれかに類似したものを使用する代わりに: widget( T[] init, int length ) // (1) widget( T... init ) // (2) widget( std::vector<T> init ) // (3) 古典的な配列、おそらくconstあちこちに追加できます …

4
異なるオブジェクトを使用する場合のテンプレート特殊化の複数の定義
異なるオブジェクトファイルで特殊なテンプレートを使用すると、リンク時に「複数定義」エラーが発生します。私が見つけた唯一の解決策は「インライン」関数を使用することですが、それはいくつかの回避策のようです。「インライン」キーワードを使用せずにそれを解決するにはどうすればよいですか?それが不可能な場合、なぜですか? 次にコード例を示します。 paulo@aeris:~/teste/cpp/redef$ cat hello.h #ifndef TEMPLATE_H #define TEMPLATE_H #include <iostream> template <class T> class Hello { public: void print_hello(T var); }; template <class T> void Hello<T>::print_hello(T var) { std::cout << "Hello generic function " << var << "\n"; } template <> //inline void Hello<int>::print_hello(int var) { std::cout << "Hello …
95 c++  templates 

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