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

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

4
std :: functionがオーバーロードの解決に参加しないのはなぜですか?
次のコードはコンパイルできません。 void baz(int i) { } void baz() { } class Bar { std::function<void()> bazFn; public: Bar(std::function<void()> fun = baz) : bazFn(fun){} }; int main(int argc, char **argv) { Bar b; return 0; } ので、std::function私は読んでの通りですが、オーバーロードの解決を考慮することはないと述べ、この他のポスト。 この種のソリューションを強制した技術的な制限を完全には理解していません。 cppreference で翻訳のフェーズとテンプレートについて読みましたが、反例を見つけることができなかった理由は思いつきません。平凡な人(まだC ++の新人)に説明すると、何がどの翻訳段階で上記のコンパイルが失敗しますか?

2
これは古いC ++スタイルのコンストラクタですか?
ここにC ++コードの一部があります。 この例では、多くのコードブロックがコンストラクター呼び出しのように見えます。残念ながら、ブロックコード#3はそうではありません(https://godbolt.org/z/q3rsxnとhttps://cppinsights.ioを使用して確認できます)。 これは古いC ++表記であり、{}を使用した新しいC ++ 11構成表記の導入を説明できると思います(#4を参照)。 T(i)意味の説明はありますか?コンストラクタの表記にとても近いですが、間違いなくとても違いますか? struct T { T() { } T(int i) { } }; int main() { int i = 42; { // #1 T t(i); // new T named t using int ctor } { // #2 T t = T(i); // new T …
17 c++  c++11 

1
Clangは、クラステンプレートのネストされたクラスが特殊化によってのみ定義されているコードを拒否することは正しいですか?
次のクラステンプレートがあるとします。 template<typename T> struct Outer { struct Inner; auto f(Inner) -> void; }; のInner専門化ごとに個別に定義しますOuter。 template<> struct Outer<int>::Inner {}; template<> struct Outer<double>::Inner {}; 次にf、すべての特殊化についてメンバー関数を1回定義しますOuter。 auto Outer<T>::f(Inner) -> void { } しかしClang(9.0.0)は不平を言います: error: variable has incomplete type 'Outer::Inner' auto Outer<T>::f(Inner) -> void ^ Inner他のすべての特殊化の定義も提供することにより、コンパイラエラーを回避できますOuter。 template<typename T> struct Outer<T>::Inner {}; または、f専門化ごとに個別に定義することにより: template<> auto …

1
グローバルconst char []をconstexpr string_viewに置き換える落とし穴はありますか?
私たちのチームは10年以上前のC ++コードベースで作業しており、最近C ++ 17コンパイラに切り替えました。そこで、コードを最新化する方法を探しています。YouTubeでのカンファレンストークで、const char*グローバル文字列をに置き換えるという提案を聞きましたconstexpr string_view。 const char*コードにはこのようなグローバル文字列定数が多数含まれているので、知っておく必要のある問題や潜在的な問題がないか確認したいのですが。

3
カタリナにValgrindをインストールする方法はありますか?
ValgrindをCatalinaにインストールして適切に実行する方法はありますか?もしそうなら、私はステップバイステップのプロセスを非常に感謝します。 https://github.com/sowson/valgrindを使用してValgrindをインストールしようとし ましたhelloWorld.cppが、ターミナルでテストしたところ、コンソールが取得すべきでないエラーを返しました。 このバージョンのValgrindのインストールプロセスで自分の側でエラーを犯したかどうか、またはValgrind自体が単にCatalina OSと互換性がないかどうかはわかりません。 私もHomebrewを介してValgrindをインストールしようとしましたが、これにも問題がありました(github.com/Homebrew/homebrew-core/issues/36683)。

2
あいまいなオーバーロードテンプレート
次のテンプレートコードがあります #include <vector> #include <array> #include <iostream> template<typename T1> void foo(std::vector<T1> bar) { std::cout << "GENERIC" << std::endl; } template<typename T1> void foo(std::vector<std::vector<T1>> bar) { std::cout << "SPECIFIC (vector)" << std::endl; } template<typename T1, int SIZE> void foo(std::vector<std::array<T1, SIZE>> bar) { std::cout << "SPECIFIC (array)" << std::endl; } int main() …
16 c++  templates 

3
Rcppを遅くしてR目的関数を最適化すると、なぜですか?
私は現在、反復ごとに多項ロジットモデルの最適化の複数のステップを必要とするベイズ法に取り組んでいます。これらの最適化を実行するためにoptim()を使用し、Rで記述された目的関数を使用しています。プロファイリングにより、optim()が主なボトルネックであることが明らかになりました。 調べてみると、目的関数を再コーディングするとプロセスが高速化する可能性があることを示唆するこの質問が見つかりましたRcpp。私は提案に従い、目的関数をRcppでに遅くなりました(約2倍遅い!)。 これは初めてRcpp(またはC ++に関連するもの)で、コードをベクトル化する方法を見つけることができませんでした。それをより速くする方法はありますか? Tl; dr:Rcppの関数の現在の実装は、ベクトル化されたRほど高速ではありません。速くする方法は? 再現可能な例: 1)Rおよびで目的関数を定義するRcpp:切片のみの多項モデルの対数尤度 library(Rcpp) library(microbenchmark) llmnl_int <- function(beta, Obs, n_cat) { n_Obs <- length(Obs) Xint <- matrix(c(0, beta), byrow = T, ncol = n_cat, nrow = n_Obs) ind <- cbind(c(1:n_Obs), Obs) Xby <- Xint[ind] Xint <- exp(Xint) iota <- c(rep(1, (n_cat))) denom <- log(Xint %*% …
16 c++  r  optimization  rcpp 

2
テンプレートのtypename引数への参照を渡す方法
参照を引数としてテンプレートのtypename引数に渡す方法はありますか?たとえば、intへの参照を渡すために、intを渡す代わりにそうします。 template <typename T> struct Foo { Foo(T arg) : ptr(arg) {} T ptr; }; int main() { int* a = new int(6); Foo<decltype(a)> foo1(a); // ptr is a copy of a pointer Foo<decltype(&a)> foo1(&a); // ptr seems to be a pointer to a pointer } 「ptr」メンバーをクラスでT&にすることでポインターへの参照にできることはわかっていますが、これはテンプレート引数に渡された引数から実行できるかどうか疑問に思っていました。
16 c++  templates 

1
std :: pair <auto、auto>戻り値の型
で遊んでいましautoたstd::pair。以下のコードでfは、関数はstd::pairテンプレートパラメータに依存するタイプのを返すことになっています。 実際の例: 例1 template &lt;unsigned S&gt; auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else if constexpr (S == 2) return std::pair{1.0, 2.0}; // pair of doubles else return std::pair{0.0f, 0.0f}; // pair of floats } これは、gcc 9.2、gcc 10.0、clang 9.0およびclang 10.0で動作します。 次に、明確にするために戻り値の型を明示的に記述したいと思いstd::pairます。 例2 …

2
std :: setはオブジェクトを連続してメモリに格納しますか?
のstd::setような連続したメモリにオブジェクトを保存しますstd::vectorか? これをWeb上で見つけることはできませんでした。cppreferenceはメモリ割り当ての詳細について言及していません。しかし、なぜそれが連続したメモリを使用できなかったのかわからないので、私の質問です。
16 c++  set  stdset 

1
sizeof(enum)はsizeof(std :: underlying_type <Enum> :: type)と異なることがありますか?
最近、次の例のコードレビューで登場しました。 enum class A : uint8_t { VAL1, VAL2 }; ... std::vector&lt;A&gt; vOfA; // Assume this is sized and full of some stuff. std::memcpy(wire_buffer, vOfA.data(), vOfA.size() * sizeof(A)); のsizeof(std::underlying_type&lt;A&gt;::type)代わりに使用する必要がありsizeof(A)ます。これらが異なる可能性はありますか?誰かがこれを保証する標準の見積もりを持っていますか?

2
[[no_unique_address]]と同じタイプの2つのメンバー値
で遊ん[[no_unique_address]]でいc++20ます。 cppreferenceの例では、空のタイプEmptyとタイプがありますZ struct Empty {}; // empty class struct Z { char c; [[no_unique_address]] Empty e1, e2; }; どうやら、の大きさはZ、少なくともなければならない2ので、タイプのe1とe2同じです。 しかし、私は本当にZサイズが欲しいです1。これEmptyによりe1、さまざまなタイプのとを適用する追加のテンプレートパラメーターを使用して、いくつかのラッパークラスでラップすることについて考えましたe2。 template &lt;typename T, int i&gt; struct Wrapper : public T{}; struct Z1 { char c; [[no_unique_address]] Wrapper&lt;Empty,1&gt; e1; [[no_unique_address]] Wrapper&lt;Empty,2&gt; e2; }; 残念ながら、sizeof(Z1)==2。サイズをZ11 にするためのコツはありますか? 私はこれをテストしていますgcc version 9.2.1し、clang version 9.0.0 私のアプリケーションでは、フォームの空のタイプがたくさんあります …

3
可変個のテンプレート:グループで引数を展開
2つの引数を取る関数があります。 template &lt;typename T1, typename T2&gt; void foo(T1 arg1, T2 arg2) { std::cout &lt;&lt; arg1 &lt;&lt; " + " &lt;&lt; arg2 &lt;&lt; '\n'; } そして、その引数をペアで転送するべき可変部分: template &lt;typename... Args&gt; void bar(Args&amp;&amp;... args) { static_assert(sizeof...(Args) % 2 == 0); ( foo( std::forward&lt;Args&gt;(args), std::forward&lt;Args&gt;(args) ), ... ); // ^ Sends each argument twice, …

1
consteval関数が未定義の動作を許可するのはなぜですか?
C ++には定数式の非常にきちんとした特性があります。それらの評価に未定義の動作を含めることはできません(7.7.4.7): 抽象マシン([intro.execution])の規則に従ってeの評価が次のいずれかを評価しない限り、式eはコア定数式です。 ... このドキュメントの[intro]から[cpp]で指定されている未定義の動作を持つ操作[注:たとえば、符号付き整数オーバーフロー([expr.prop])、特定のポインター演算([expr.add])、ゼロによる除算、または特定のシフト演算—後記]; 値を格納しようとする13!中でconstexpr int実際には、素敵なコンパイルエラーを生成します: constexpr int f(int n) { int r = n--; for (; n &gt; 1; --n) r *= n; return r; } int main() { constexpr int x = f(13); return x; } 出力: 9:19: error: constexpr variable 'x' must be initialized by a …

3
演算子の削除でデストラクタが呼び出されないのはなぜですか?
私はそれに::deleteクラスを呼び込もうとしましたoperator delete。しかし、デストラクタは呼び出されません。 私は、クラス定義されMyClass、そのoperator deleteオーバーロードされているが。グローバルoperator deleteもオーバーロードされています。のオーバーロードoperator deleteはMyClass、オーバーロードされたグローバルを呼び出しますoperator delete。 class MyClass { public: MyClass() { printf("Constructing MyClass...\n"); } virtual ~MyClass() { printf("Destroying MyClass...\n"); } void* operator new(size_t size) { printf("Newing MyClass...\n"); void* p = ::new MyClass(); printf("End of newing MyClass...\n"); return p; } void operator delete(void* p) { printf("Deleting MyClass...\n"); ::delete p; …

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