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

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

3
キャストされたベクターのベクターでの未定義の動作
なぜこのコードは初期化されていないように見える初期化されていない整数の数を書き込むのですか? #include <iostream> #include <vector> using namespace std; int main() { for (int i : vector<vector<int>>{{77, 777, 7777}}[0]) cout << i << ' '; } 出力はになるはず77 777 7777です。 このコードは未定義であるべきですか?
19 c++ 

2
整数->ポインター変換規則
次のコードを検討してください。 void f(double p) {} void f(double* p) {} int main() { f(1-1); return 0; } MSVC 2017はそれをコンパイルしません。と1-1同じ0であるため、あいまいなオーバーロードされた呼び出しがあることを示しているため、に変換できますdouble*。他のトリックは、のような0x0、0Lまたはstatic_cast<int>(0)、いずれかの動作しません。を宣言しconst int Zero = 0て呼び出しf(Zero)ても同じエラーが発生します。それは場合にのみ正しく動作Zeroではありませんconst。 同じ問題がGCC 5以下に当てはまるようですが、GCC 6には当てはまりません。これがC ++標準の一部であるか、既知のMSVCバグであるか、コンパイラーの設定であるかどうか知りたいです。おおざっぱなグーグルは結果をもたらさなかった。
19 c++  visual-c++  types 

3
forループ内のc ++スレッドが誤った値を出力する
私はc ++でマルチスレッドを理解しようとしていますが、この問題で立ち往生しています:forループでスレッドを起動すると、誤った値が出力されます。これはコードです: #include <iostream> #include <list> #include <thread> void print_id(int id){ printf("Hello from thread %d\n", id); } int main() { int n=5; std::list<std::thread> threads={}; for(int i=0; i<n; i++ ){ threads.emplace_back(std::thread([&](){ print_id(i); })); } for(auto& t: threads){ t.join(); } return 0; } 値0、1、2、3、4が出力されることを期待していましたが、同じ値を2回取得することがよくありました。これは出力です: Hello from thread 2 Hello from thread 3 …



1
C ++ 14とC ++ 17ではstd :: atomicコンストラクターの動作が異なるのはなぜですか
C ++ 11のプロジェクトで作業していて、次のコードを試してみました #include <atomic> struct A { std::atomic_int idx = 1; }; int main() { return 0; } コンパイラエラーが発生する error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]' std::atomic_int idx = 1; ^ C ++ 14でも同じ結果になります。C ++ 17に切り替えると機能します:wandbox 私はcppreferenceの違いをチェックしました: std::atomic std::atomic<T>::operator= std::atomic<T>::atomic しかし、C ++ 14とC ++ 17の間に文書化された違いはありません。C …
19 c++  c++14  c++17  stdatomic 

2
same_asコンセプトが型の等価性を2回チェックするのはなぜですか?
same_asコンセプトの可能な実装をhttps://en.cppreference.com/w/cpp/concepts/same_asで見ると、何か奇妙なことが起こっていることに気づきました。 namespace detail { template< class T, class U > concept SameHelper = std::is_same_v<T, U>; } template< class T, class U > concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>; 最初の質問は、なぜSameHelperコンセプトが必要なのかということです。二つ目は、なぜあるsame_asかどうかを確認するTと同じであるUとU同じT?冗長ではないですか?
19 c++  c++20  concept 

5
ぶら下がりconst refを解決する方法
次の短いプログラム #include <vector> #include <iostream> std::vector<int> someNums() { return {3, 5, 7, 11}; } class Woop { public: Woop(const std::vector<int>& nums) : numbers(nums) {} void report() { for (int i : numbers) std::cout << i << ' '; std::cout << '\n'; } private: const std::vector<int>& numbers; }; int main() { …
18 c++ 


3
ラムダクロージャの左辺値を右辺値参照パラメータとして渡すことができます
lvalueラムダクロージャーは常にrvalue関数パラメーターとして渡すことができることがわかりました。 次の簡単なデモをご覧ください。 #include <iostream> #include <functional> using namespace std; void foo(std::function<void()>&& t) { } int main() { // Case 1: passing a `lvalue` closure auto fn1 = []{}; foo(fn1); // works // Case 2: passing a `lvalue` function object std::function<void()> fn2 = []{}; foo(fn2); // compile error return 0; } …

1
operator new()は、デフォルトのコンストラクターの存在に応じて、delete()が削除された場合の動作が異なります。
演算子new()を使用してクラスCの新しいオブジェクトを作成すると、ここでエラーが発生します。 class C { public: C() {} virtual ~C() {} void operator delete(void*) = delete; }; int main() { C* c = new C; } と C2280: 'void C::operator delete(void *)': function was explicitly deleted 私は交換するときでもC() {} とC() = default; か、そのコンパイラが(私はと同じ効果を持つと信じデフォルトコンストラクタを挿入するように、行を削除= default)、コードはコンパイルして実行します。 コンパイラが生成したデフォルトのコンストラクタとユーザー定義のデフォルトのコンストラクタの違いは何ですか? 私はこの投稿でいくつかのヒントを得ましたが、デストラクタが仮想なので、ここのクラスC(ユーザー提供のコンストラクタなし)は簡単ではありませんよね? 最新のVisual Studio、c ++ 17でコンパイルされています。

4
連続列挙型C ++ 11
列挙型が連続しているかどうかをC ++ 11でチェックする方法はありますか? ない列挙値を与えることは完全に有効です。C ++ 14、C ++ 17、またはC ++ 20の型特性のような機能があるのでしょうか?これはstatic_assertで使用されます。 次に小さな例を示します。 enum class Types_Discontinuous { A = 10, B = 1, C = 100 }; enum class Types_Continuous { A = 0, B = 1, C = 2 }; static_assert(SOME_TEST<Types_Discontinuous>::value, "Enum should be continuous"); // Fails static_assert(SOME_TEST<Types_Continuous>::value, "Enum should be …
17 c++  c++11  c++14  c++17  c++20 

2
変数の初期化を飛び越えるのは不適切な形式ですか、それとも未定義の動作を引き起こしますか?
このコードを考えてみましょう: void foo() { goto bar; int x = 0; bar: ; } へのジャンプが変数の初期化をバイパスするため、GCCとClang はそれを拒否しbar:ます。MSVCはまったく文句を言いません(xafter を使用bar:すると警告が表示されます)。 同じことをaで行うことができますswitch: void foo() { switch (0) { int x = 0; case 0: ; } } 3つのコンパイラすべてがエラーを出力するようになりました。 これらのスニペットの形式は不適切ですか?または、それらはUBを引き起こしますか? 以前はどちらも形式が正しくないと思っていましたが、標準の魅力的な部分を見つけることができません。[stmt.goto]は、このことについて何も言われ、どちらもしないん[stmt.select] 。

1
C ++標準がファイルを処理する方法を模索するのはなぜですか?
C ++は、streamoffタイプを使用して(ファイル)ストリーム内のオフセットを表し、[stream.types]で次のように定義されます。 using streamoff = implementation-defined ; タイプstreamoffは、オペレーティングシステムの最大可能ファイルサイズを表すのに十分なサイズの、署名された基本的な整数型の1つの同義語です。287) 287)通常は長いです。 これは、(long32ビット幅しかない可能性があるを使用するのとは対照的に)大きなファイル内をシークできるため、理にかなっています。 [filebuf.virtuals]はbasic_filebuf、ファイル内でシークする関数を次のように定義します。 pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override; off_typestreamoffはと同等です。[iostreams.limits.pos]を参照してください。ただし、標準は、関数の効果を説明し続けます。私は最後の文にイライラしていますfseek。 効果:レッツをwidth示しますa_codecvt.encoding()。is_open() == false、またはの場合、off != 0 && width <= 0位置決め操作は失敗します。それ以外の場合、way != basic_ios::curまたはoff != 0、および最後の操作が出力された場合は、出力シーケンスを更新し、シフト解除シーケンスを書き込みます。次は、新しい位置をシーク:場合はwidth > 0、呼び出しfseek(file, width * off, whence)、そうでない場合は呼び出しますfseek(file, 0, whence)。 fseeklongパラメータを受け入れます。off_typeとstreamoff定義されている場合long long(標準で推奨されているとおり)、これはlong呼び出し時にへのダウンコンバージョンにfseek(file, width * off, …


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