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

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

1
shift_right()はC ++ 20でどのように実装される予定ですか?
C ++ 20では、<algorithm>ヘッダは、2つの新しいアルゴリズムを獲得:shift_left()およびshift_right()。どちらもLegacyForwardIteratorを受け入れます。についてはshift_left()、「iから開始する順番で移動する」と明記されている​0。の場合shift_right()、「ForwardItLegacyBidirectionalIteratorの要件を満たしている場合、移動はi最初から降順で実行される」と指定されていますlast - first - n - 1。 私は実装するのにかなり簡単な方法を考えることができますshift_left(): template <typename ForwardIt> constexpr inline ForwardIt shift_left(ForwardIt first, ForwardIt last, typename std::iterator_traits<ForwardIt>::difference_type n) { if (n <= 0) return last; ForwardIt it = first; for (; n > 0; --n, ++it) { if (it == last) return first; } return …

3
unique_ptr <0または演算子よりも少ないことは何ですか?
私が書いていないコードを扱っています。私はこの声明を持っています: // p is type of std::unique_ptr&lt;uint8_t[]&gt; if (p &lt; 0) { /* throw an exception */ } それではp &lt; 0、この文脈ではどういう意味ですか? 上のドキュメントページ、私は私の場合はあると信じて16) y &lt; nullptrいる、0ですnullptr。 しかし、それは何をしますか?

1
クラスの特殊化におけるclang / gccの不整合
特化しようとしているときに、私はこの問題に出くわしtuple_size/ tuple_elementC ++ 17の構造の結合のためのカスタムクラス。 以下のコードはGCCでコンパイルされますが、clangではコンパイルされません(両方のトランクバージョン、以下のリンクを参照)。 #include &lt;type_traits&gt; template&lt;typename T, typename... Ts&gt; using sfinae_t = T; template&lt;typename T, bool... Bs&gt; using sfinae_v_t = sfinae_t&lt;T, typename std::enable_if&lt;Bs&gt;::type...&gt;; template &lt;typename T&gt; struct Test; template &lt;typename T&gt; struct Test&lt;sfinae_v_t&lt;T, std::is_integral_v&lt;T&gt;&gt;&gt; {}; void f() { Test&lt;int&gt; t; } https://godbolt.org/z/ztuRSq これは、clangによって提供されるエラーです。 &lt;source&gt;:13:8: error: class template partial …

5
テンプレートで正しいタイプのデータを返す方法は?
#include &lt;iostream&gt; using namespace std; template &lt;class X, class Y&gt; Y big(X a, Y b) { if (a &gt; b) return (a); else return (b); } int main() { cout &lt;&lt; big(32.8, 9); } ここではCPPでテンプレートを使用しているためbig、doubleとinttypeの引数をバイパスして関数を呼び出すと、である返答が必要ですdouble。ここではタイプで、の32代わりに返されます32.8。 どのようにして希望の出力を得るのですか big関数の適切な戻り値の型を記述する方法は?

2
タイプ・パンニング・テーマのバリエーション:インプレース・トリビアル・コンストラクション
これはかなり一般的なテーマであることは知っていますが、典型的なUBを見つけるのは簡単ですが、今のところこの亜種は見つかりませんでした。 そこで、実際のデータのコピーを避けながら、Pixelオブジェクトを正式に紹介しようとしています。 これは有効ですか? struct Pixel { uint8_t red; uint8_t green; uint8_t blue; uint8_t alpha; }; static_assert(std::is_trivial_v&lt;Pixel&gt;); Pixel* promote(std::byte* data, std::size_t count) { Pixel * const result = reinterpret_cast&lt;Pixel*&gt;(data); while (count-- &gt; 0) { new (data) Pixel{ std::to_integer&lt;uint8_t&gt;(data[0]), std::to_integer&lt;uint8_t&gt;(data[1]), std::to_integer&lt;uint8_t&gt;(data[2]), std::to_integer&lt;uint8_t&gt;(data[3]) }; data += sizeof(Pixel); } return result; // throw in …

1
新しい(this)ThisClass()は悪い考えですか?
class FooView final : public Something { ... void refresh() { this-&gt;~FooView(); new (this) FooView(); } } 私はこのイディオムを見たことがなく、本当に微妙で厄介なように見えるかもしれませんが、(FooView最終的なものである限り)実際に問題を考えることはできません。これは悪い考えですか?

4
集約の初期化のために空の基本クラスを非表示にする
次のコードを検討してください。 struct A { // No data members //... }; template&lt;typename T, size_t N&gt; struct B : A { T data[N]; } これは、Bを初期化する方法ですB&lt;int, 3&gt; b = { {}, {1, 2, 3} }; 。基本クラスの不要な空の{}を避けたいのです。ここでJarod42によって提案された解決策がありますが、要素のデフォルトの初期化では機能しません。B&lt;int, 3&gt; b = {1, 2, 3};問題B&lt;int, 3&gt; b = {1};はありませんが、デフォルトb.data[1]でb.data[2]はありません。デフォルトで0に初期化されていないため、コンパイラエラーが発生します。基本クラスを構築から「隠す」方法はありますか(またはc ++ 20で存在するでしょう)?

1
std :: stringとCスタイルの文字列リテラルの比較
次のコードがあるとします。 #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;iomanip&gt; using namespace std; // or std:: int main() { string s1{ "Apple" }; cout &lt;&lt; boolalpha; cout &lt;&lt; (s1 == "Apple") &lt;&lt; endl; //true } 私の質問は次のとおりです。システムはどのようにこれら2つをチェックしますか?s1はオブジェクト"Apple"ですが、Cスタイルの文字列リテラルです。 私の知る限り、異なるデータ型を比較す​​ることはできません。ここで何が欠けていますか?

1
演算子newとコンストラクターの引数の実行順序
DOES C ++は、順序指定SPEC operator newとのコンストラクタAでをnew C(A())。 g ++は順序をA()-&gt; new-&gt; C()にしますが、clang ++はそれをnew-&gt; A()-&gt;にしC()ます。 違いは不特定の行動が原因ですか? g ++:7.4.0 clang ++:10.0.0 #include &lt;iostream&gt; #include &lt;cstdlib&gt; struct A { A() { std::cout &lt;&lt; "call A()\n"; } }; struct C { C(A) { std::cout &lt;&lt; "call S()\n"; } void *operator new(size_t s) { std::cout &lt;&lt; "call …

1
nullポインターにゼロを追加することはできますか?
ヌルポインターの場合、ポインター演算は許可されていません。しかし、私がこのようなものを持っていると想像してください: class MyArray { int *arrayBegin; // pointer to the first array item, NULL for an empty array unsigned arraySize; // size of the array, zero for an empty array public: int *begin() const { return arrayBegin; } int *end() const { return arrayBegin + arraySize; } // possible? (arrayBegin …

1
Rcpp関数から「新しい」オブジェクトへのポインターを返す適切な方法
1)潜在的に大きなメモリプリントを含むカスタムクラス、および2)前処理を実行してからカスタムクラスの新しいオブジェクトを作成して返すトップレベルの関数を検討してください。値による不要なコピーを回避するために、関数はオブジェクトを割り当て、代わりにオブジェクトへのポインターを返します。 以前の議論に基づいて、新しく作成されたオブジェクトへのポインタを返す適切な方法は、それをでラップすることRcpp::XPtr&lt;&gt;です。しかし、Rはそれを効果的にと見なしexternalptr、私はそれをモダンRCPP_EXPOSED_CLASSでRCPP_MODULE物事のやり方にキャストする適切な方法を見つけるのに苦労しています。 別の方法は、生のポインタを返すことです。しかし、オブジェクトメモリが適切にクリーンアップされるかどうかは100%確実ではありません。私はvalgrindメモリリークをテストするために実行しましたが、何も見つかりませんでした。しかし、誰が片付けをしますか?R? test.cpp #include &lt;Rcpp.h&gt; // Custom class class Double { public: Double( double v ) : value(v) {} double square() {return value*value;} private: double value; }; // Make the class visible RCPP_EXPOSED_CLASS(Double) // Option 1: returning raw pointer Double* makeDouble( double x ) { Double* pd = new …
9 c++  r  rcpp 

1
テンプレートと名前検索を理解しようとする
次のコードスニペットを理解しようとしています スニペット#1 template &lt;typename T&gt; struct A { static constexpr int VB = T::VD; }; struct B : A&lt;B&gt; { }; ここでは、gcc9もclang9もエラーをスローしません。 Q.このコードがコンパイルされるのはなぜですか?A&lt;B&gt;Bから継承するときにインスタンス化していませんか?BにはVDがないので、コンパイラーはここでエラーをスローすべきではありませんか? スニペット#2 template &lt;typename T&gt; struct A { static constexpr auto AB = T::AD; // &lt;- No member named AD in B }; struct B : A&lt;B&gt; { …

1
-fno-char8_tに相当するMSVCは何ですか?
C ++ 20では、u8文字列リテラルはchar8_t型に基づいています。それらは故意にchar const*これ以上変換しません: const char* str = u8"Hall\u00f6chen \u2603"; // no longer valid in C++20 もちろん、C ++ 20に移行する際の最終的な目標は、新しい動作に完全に対応することです(上記の例では、のタイプを変更しstrます)。ただし、サードパーティのライブラリのため、これはすぐに実行できないことがよくあります。 導入と「改善」を 提案する提案は、それをchar8_t予測し、clangとgccには-fno-char8_t、古い動作に切り替えるフラグがあります(他のC ++ 20機能は引き続き利用可能です)。 2番目の提案は、Microsoftが同様のフラグに従い、追加するという期待を設定していますが、設定方法を見つけることができませんでした(少なくともVS 2019、バージョン16.4)。 では、MSVCと同等のものは誰か知ってい-fno-char8_tますか?

1
配列データの変更を防ぐ方法は?
次のようなクラスがあるとします(これは単なる例です)。 class A { double *ptr; public: A() : ptr( new double[100] ) {} A( const A &amp;other ) { other.ptr[7] = 15; } void doNotChangeMyData() const { ptr[43] = 14; } void changeMyData() { ptr[43] = 14; } ~A() { delete[] ptr; } }; constコピーコンストラクタとの両方でdoNotChangeMyData機能それはとてもそれが作るptr変更することはできません。ただし、これにより、が指す配列の内容を変更できますptr。 ptrの配列の内容がconstインスタンスでのみ変更されるのを防ぐ方法はありますか。「注意する」(または生のポインタから変更する)ことはできませんか? 私は次のようなことができることを知っています void doNotChangeMyData() …
9 c++  const 

1
std :: lock_guardをstd :: mutex :: lock()よりも高速にするにはどうすればよいですか?
私は同僚とlock_guardについて議論しており、彼は、lock_guardクラスのインスタンス化とインスタンス化のコストのために、lock_guardはmutex :: lock()/ mutex :: unlock()よりもおそらく遅いと提案しました。 次に、この簡単なテストを作成しました。驚いたことに、lock_guardを使用したバージョンは、mutex :: lock()/ mutex :: unlock()を使用したバージョンよりもほぼ2倍高速です。 #include &lt;iostream&gt; #include &lt;mutex&gt; #include &lt;chrono&gt; std::mutex m; int g = 0; void func1() { m.lock(); g++; m.unlock(); } void func2() { std::lock_guard&lt;std::mutex&gt; lock(m); g++; } int main() { auto t = std::chrono::system_clock::now(); for (int i = 0; …
9 c++  mutex 

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