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

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

1
<algorithm>と<utility>の両方にstd :: moveがあるのはなぜですか
私std::moveがここに投稿するのを見るほとんどの場合、それは&lt;utility&gt;バージョンを参照しています。 std::moveで&lt;algorithm&gt;、実際には、その名前が示唆している何を移動し、一方std::moveでは、&lt;utility&gt;ちょうど基本的に最終的には左辺値にはxValueを移動するための前処理段階ではxValue、にその引数をキャストします。それでmove、それぞれの機能が異なるときに、これらの両方に名前を付けるのは、ちょっと混乱しませんか?

3
enable_shared_from_thisを最初の基本クラスにする必要がありますか?
私のクラスは複数のベースから継承していますが、そのうちの1つはですstd::enable_shared_from_this。一塁でなければならないのですか? 次のコード例を考えてみます。 struct A { ~A(); }; struct B { ~B(); }; struct C : A, B, std::enable_shared_from_this&lt;C&gt; {}; std::make_shared&lt;C&gt;(); 実行する~A()と~B()、C住んでいたストレージがまだ存在していることを確認できますか?

1
配列サイズの妥当性に基づく専門化
配列サイズの妥当性に基づいて特化しようとしています: // base template template&lt;int p, typename T = void&gt; struct absolute { operator int () const { return 0; } }; // positive case template template&lt;int p&gt; struct absolute&lt;p, typename std::void_t&lt;int[p]&gt;&gt; { operator int () const { return p; } }; // negative case template template&lt;int p&gt; struct absolute&lt;p, …

1
#1664の提案された解決策を理解する方法
#1664の提案された解決策(提案された解決策1664)を見た後、私は関数テンプレートのデフォルト引数のルールに混乱しています、ここにコンテンツを引用してください: 8.1.5 [expr.prim.lambda]パラグラフ3によると クロージャタイプは、対応するラムダ式を含む最小のブロックスコープ、クラススコープ、または名前空間スコープで宣言されます。[注:これにより、クロージャタイプに関連付けられた名前空間とクラスのセットが決まります(6.4.2 [basic.lookup.argdep])。ラムダ宣言子のパラメータタイプは、これらの関連する名前空間とクラスには影響しません。—エンドノート] ただし、17.8.1 [temp.inst]パラグラフ13には、 デフォルトの引数を使用する必要がある方法で関数テンプレートfが呼び出された場合、依存名が検索され、セマンティクスの制約がチェックされ、デフォルトの引数で使用されているテンプレートのインスタンス化は、デフォルトの引数のように行われます。その時点で使用されている関数テンプレートfと同じスコープ、同じテンプレートパラメータ、同じアクセス権を持つ関数テンプレートの特殊化で使用される初期化子でした。 その場合、可能性は、テンプレート関数(または、おそらく、クラステンプレートのメンバー関数)のデフォルト引数のラムダ式のクロージャタイプが、の本体のブロックスコープで宣言されていると見なされることです。架空の機能テンプレートの特殊化。 次の例を考えてみましょう。 namespace J { inline namespace K { template &lt;typename T&gt; int zap(const T &amp;t) { foo(t); return 0; } template &lt;typename T&gt; void zip(int = zap([] { })) { } } template &lt;typename T&gt; void foo(const T &amp;) { } …

4
グローバル配列のサイズを整数定数にする必要があるのはなぜですか?
C ++では、あるサイズのグローバル配列を宣言してみました。エラーが発生しました: バインドされた配列は ']'トークンの前の整数定数ではありません しかし、main()関数内で同じ型の配列を宣言すると、うまく機能します。 ここに異なる動作があるのはなぜですか? int y=5; int arr[y]; //When I comment this line it works fine int main() { int x=5; int arr2[x]; // This line doesn't show any error. } 編集:多くの人が、この質問は「配列の境界が ']'トークンの前の整数定数ではありません」というエラーの複製であると示唆しています。しかし、その質問は、なぜ異なる行動があるのか​​には答えません。

1
acoslはstd名前空間にありませんか?
cppreferenceによると、関数acoslはstd名前空間にある必要があります:https : //en.cppreference.com/w/cpp/numeric/math/acos ただし、gcc(またはclang)では、以下のコードはコンパイルされません。 #include &lt;cmath&gt; int main() { long double var = std::acosl(4.0); return 0; } 次のエラーメッセージが表示されます。 gay@latitude-7490:~$ g++ -std=c++11 test.cpp test.cpp: In function 'int main()': test.cpp:5:26: error: 'acosl' is not a member of 'std'; did you mean 'acosh'? 5 | long double truc = std::acosl( (long double)4.0); | …
8 c++  c++11 

1
オーバーロードされた関数ポインターとその引数を渡す際の不正な型の推定
std::invoke関数がオーバーロードされている場合でも、関数タイプを推定する作業を行うためのラッパーを提供しようとしています。 (私は昨日、可変およびメソッドポインターバージョンについて関連する質問をしました)。 関数に1つの引数がある場合、このコード(C ++ 17)は通常の過負荷状態で期待どおりに機能します。 #include &lt;functional&gt; template &lt;typename ReturnType, typename ... Args&gt; using FunctionType = ReturnType (*)(Args...); template &lt;typename S, typename T&gt; auto Invoke (FunctionType&lt;S, T&gt; func, T arg) { return std::invoke(func, arg); } template &lt;typename S, typename T&gt; auto Invoke (FunctionType&lt;S, T&amp;&gt; func, T &amp; arg) { return …

7
中心の周りの円の点を取得するための効率的なアルゴリズム
問題 特定のポイントについて、特定の半径の円内にあるすべてのピクセルを取得したいのですが、ポイントは整数座標しか持てません。つまり、キャンバス内のピクセルです。 だから私は、与えられた黄色の領域内のすべてのポイントを取得したい(x, y)とr。 アプローチ 私が考えることができる最も効率的な方法は、正方形をループして各ポイントのユークリッド距離を(x, y)確認することです。 for (int px = x - r; px &lt;= x + r; px++) { for (int py = y - r; py &lt;= y + r; py++) { int dx = x - px, dy = y - py; if (dx * dx …

4
一意のポインタ-デストラクタが3回呼び出されるのはなぜですか
値によってオブジェクトを返すメソッドがあります。このメソッドは、私が制御できないライブラリからのものです。オブジェクトをさらに処理するために、このオブジェクトでunique_ptrを引き続き使用します。次に例を示します。 #include &lt;iostream&gt; #include &lt;memory&gt; class Bla { public: Bla() { std::cout &lt;&lt; "Constructor!\n"; } ~Bla() { std::cout &lt;&lt; "Destructor!\n"; } }; Bla GetBla() { Bla bla; return std::move(bla); } int main() { auto bla = std::make_unique&lt;Bla&gt;(GetBla()); } この例では、次の出力が生成されます。 Constructor! Destructor! Destructor! Destructor! ブラのデストラクターがここで3回呼び出されるのはなぜですか?unique_prtの作成方法は正しいですか?
8 c++  unique-ptr 

1
参照による `constexpr`メンバー関数の呼び出し-clang vs gcc
次の例を考えてみます(スニペット(0)): struct X { constexpr int get() const { return 0; } }; void foo(const X&amp; x) { constexpr int i = x.get(); } int main() { foo(X{}); } 上記の例は、g++以前のすべてのバージョンでコンパイルされg++ 10.x、でコンパイルされることはありませんclang++。エラーメッセージは次のとおりです。 error: 'x' is not a constant expression 8 | constexpr int i = x.get(); | godbolt.orgの実例 ただしx、の本体で定数式が使用されることはないため、エラーの種類には意味がありますfoo。 X::get()マークされてconstexprおり、の状態には依存しませんx。 に変更const …

2
sizeof sum構造体を空のパラメーターパックで機能させるには
渡されたすべてのタイプのサイズの合計を決定するためのこの可変構造があります: template &lt;typename U, typename... T&gt; struct TotalSizeOf : std::integral_constant&lt;size_t, sizeof(U) + TotalSizeOf&lt;T...&gt;::value&gt; {}; template &lt;typename U&gt; struct TotalSizeOf&lt;U&gt; : std::integral_constant&lt;size_t, sizeof(U)&gt; {}; 使用法: TotalSizeOf&lt;double, int, char&gt;::value 問題は、これを変更して、空のパラメーターパックで動作し、戻ることができるようにする方法です0。 例えば TotalSizeOf&lt;&gt;::value 現在、エラーが発生します error: wrong number of template arguments (0, should be at least 1) C ++ 14しか使用できません。
8 c++  c++14 

2
スパース下三角線形システムの後方解決の最適化
主対角線上にゼロがあるnxn下三角行列Aの圧縮スパース列(csc)表現があり、bを (A + I)' * x = b これは私がこれを計算するために持っているルーチンです: void backsolve(const int*__restrict__ Lp, const int*__restrict__ Li, const double*__restrict__ Lx, const int n, double*__restrict__ x) { for (int i=n-1; i&gt;=0; --i) { for (int j=Lp[i]; j&lt;Lp[i+1]; ++j) { x[i] -= Lx[j] * x[Li[j]]; } } } したがって、bは引数を介して渡さxれ、ソリューションによって上書きされます。Lp、Li、Lxそれぞれスパース行列の標準CSC表現の行、インデックス、及びデータポインタです。この関数はプログラムの一番上のホットスポットで、次の行があります。 x[i] -= Lx[j] * …

4
サブクラスアドレスは仮想基本クラスアドレスと同じですか?
単純な単一継承を使用する場合、派生クラスのアドレスは基本クラスのアドレスと同じであることは誰もが知っています。多重継承はそれを真実にしません。 仮想継承もそれを正しくありませんか?つまり、次のコードは正しいですか。 struct A {}; struct B : virtual A { int i; }; int main() { A* a = new B; // implicit upcast B* b = reinterpret_cast&lt;B*&gt;(a); // fishy? b-&gt;i = 0; return 0; }

1
3レベルの配列を初期化するのに3レベルのブレースが必要ないのはなぜですか?
私はこの例に出くわしました struct sct { int t[2]; }; struct str { sct t[2]; }; int main() { str t[2] = { {0, 2, 4, 6}, {1, 3, 5, 7} }; //Who does this work? cout &lt;&lt; t[1].t[0].t[1] &lt;&lt; t[0].t[1].t[0]; return 0; } これはコンパイルして正常に動作します。それは出力を与えます34 初期化の構文は次のようになるはずです。 str t[2] = { { {0, 2},{4, …

3
boost.hanaで「constexpr以外の変数 'a'の読み取りは定数式では許可されない」という問題を解決する方法
私はいくつかのメタプログラミングプログラムを書くためにBoost.hanaでc ++ 17を使用しています。私を悩ませた1つの問題は、static_assertのようなconstexprコンテキストで使用できる式の種類です。次に例を示します。 #include &lt;boost/hana.hpp&gt; using namespace boost::hana::literals; template &lt;typename T&gt; class X { public: T data; constexpr explicit X(T x) : data(x) {} constexpr T getData() { return data; } }; int main() { { // test1 auto x1 = X(1_c); static_assert(x1.data == 1_c); static_assert(x1.getData() == 1_c); } { …
8 c++  boost  boost-hana 

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