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

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

2
C ++機能の影響を受けている、またはC ++機能から派生しているC機能はどれですか。[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 5か月前に閉鎖。 元々Cの一部ではなかったが、C ++で/のために発明され、その利点のために後でCに採用された実際のC標準の機能は何ですか? 顕著な例の1つは、1行コメントです//。これは、最初はC ++から来たもので、後にCによって採用されました。 C ++の開発から明示的または暗黙的にもたらされた実際のC標準のその他の機能を知っていますか? 情報:もちろん、C ++はCから派生していることは知っていますが、派生したC ++の開発から採用された機能について考えていました。

2
C ++でn番目の「nextafter」浮動小数点値を取得する標準的な方法はありますか
C ++にはstd::nextafter()があり、指定された浮動小数点値fの次の表現可能な値を返します。私の場合、下位仮数ビットにnビットのスロップを許可したいので、3ビットのスロップは、ある特定の値fの後に8番目の次の値を取得する必要があります。私はnextafter()8回電話することができますが、これを処理するより良い方法はありますか? ほとんどの値について、IEEE 754のレイアウトのおかげで、FP値をにキャストしuint_64、許容誤差(1<<33ビットのスロップ)を追加してから、にキャストし直すことで問題を解決できますdouble。ただし、IEEE 754浮動小数点(良い仮定ですが、堅実でもありません)。 (背景として、これはFPの不正確さのためにサーフェスの内側に時々配置される光線とサーフェスの交点を巻き上げるために使用します。堅牢な浮動小数点に精通している人epsilonは、なぜ恐ろしい解決策であるかを理解します。)

2
テンプレートクラスの演算子+オーバーロードの戻り値の型
テンプレート化されたnumクラスを構築しようとしています。このクラスには、valタイプがのパブリック属性が必要Tです。これは、唯一のテンプレートパラメータです。さらに、値を提供する場合は、属性(val)をこの値で初期化する必要があります。これを行うには、次のコードを作成しました。 #include <iostream> template<class T> class Num { public: T val; Num():val(0) { std::cout<<"default constr used"<<std::endl; } Num(T value):val(value) {std::cout<<"constr (T value) used"<<std::endl; } ~Num() { std::cout<<"destructor used"<<std::endl; } template<typename U> Num operator+(const Num<U>& other) { return val+other.value; } }; さらにmain()、次のようなプログラムをテストする関数を作成しました。 int main() { std::cout << Num<int>(1) + Num<double>(2.0); return …

2
マクロを使用して追加の要素で配列を初期化する
マクロに応じて2つの異なる方法で配列を初期化しています。 # if feature_enabled const int v[4] = {1, 2, 3, 4}; #else const int v[5] = {0, 1, 2, 3, 4}; #endif 問題は、割り当てのデータが実際には大きな行列であり、さまざまな理由から、わずかな変更を加えてデータをコピーするだけでは適切な解決策ではないということです(配列の先頭に1つだけ要素があります)。 最後のn-1要素を本質的に複製せずに、ここで行ったのと同じことを行う方法があるかどうか疑問に思っていました。

5
ユーザー定義リテラルのすべての「通常の」使用は未定義の動作ですか?
ユーザー定義のリテラルはアンダースコアで始める必要があります。 これは多かれ少なかれ一般的によく知られているルールであり、ユーザーのリテラルについて話しているすべての素人のサイトで見つけることができます。それは私(そしておそらく他の人たち?)が「なんてでたらめな」ベースで以来、露骨に無視してきたルールでもあります。もちろん、これは厳密には正しくありません。厳密に言うと、これは予約済み識別子を使用するため、未定義の動作を呼び出します(実際には、コンパイラから肩をすくめるほどではありません)。 それで、私が標準のその(私の意見では役に立たない)部分を故意に無視し続けるべきかどうかを考えて、私は実際に何が書かれているかを調べることにしました。なぜなら、誰もが知っていることが重要なのです。重要なのは、標準で書かれていることです。 [over.literal]「一部の」リテラル接尾辞識別子は予約されており、にリンクして[usrlit.suffix]いることを示しています。後者は、アンダースコアで始まるものを除いて、すべて予約されていると述べています。わかりました。これは、私たちがすでに知っていて、明示的に書かれた(または逆に書かれた)こととほぼ同じです。 また、明白だが厄介なことを示唆するメモが[over.literal]含まれています。 上記の制約を除いて、それらは通常の名前空間スコープ関数と関数テンプレートです まあ、確かにそうです。彼らがそうではないと言っているところはどこにもないので、あなたは彼らがそうであると他に何を期待するでしょう。 しかし、ちょっと待ってください。グローバル名前空間で[lex.name]アンダースコアで始まる各識別子は予約されていることを明示的に述べています。 現在、リテラル演算子は通常、明示的に名前空間に入れない限り(これはだれもしないと思います!?)、大部分はグローバル名前空間にあります。したがって、名前はアンダースコアで始まる必要があり、予約されています。特別な例外についての言及はありません。したがって、すべての名前(下線あり、またはなし)は予約済みの名前です。 「通常の」使用法(アンダースコアかどうかにかかわらず)が予約名を使用しているため、ユーザー定義のリテラルを名前空間に入れることが本当に期待されていますか?

1
コンパイル時に解決されない文字列リテラルとの比較
私は最近、次のようなものを見つけました。 #include <string> // test if the extension is either .bar or .foo bool test_extension(const std::string& ext) { return ext == ".bar" || ".foo"; // it obviously should be // return ext == ".bar" || ext == ".foo"; } 関数は明らかにコメントが示唆することを行いません。しかし、それはここでのポイントではありません。これはifステートメントで2つ以上のOR条件を使用できますか?あなたが関数を適切に書く方法を私は完全に知っているので! コンパイラがこのスニペットをどのように処理するのか疑問に思い始めました。私の最初の直感は、これがreturn true;基本的にコンパイルされるということでした。この例をgodboltに接続すると、GCC 9.2もclang 9も最適化でこの最適化を行わないことがわかりました-O2。 ただし、コードを1に変更する #include <string> using namespace std::string_literals; …

1
void func(A())を理解する
これは私のコードです #include <iostream> class A { public: int a = 0; A(int i = 0) : a(i) {} }; void func(A()) { std::cout << "Hello" << std::endl; } int main() { A(*p)() = NULL; func(p); } 私を混乱させたのは、A()in void func(A())がのコンストラクタでは(*)()なくA に等しいということAです。これはどのように作動しますか?
8 c++ 

2
多次元配列の空の文字列リテラルがnullポインターに減衰するのはなぜですか?
いくつかの文字列リテラルで初期化された多次元C文字列配列を定義したいと思います。ではC Iは、次の操作を行います: #include <stdio.h> const char *strArr[2][1] = { {"foo"}, {""}}; int main(void) { printf("%p\t%p\n", strArr[0][0], strArr[1][0]); return 0; } gcc -std=c18 -pedantic test.c結果をコンパイルして実行すると、次のようになります。 $ ./a.out 0x55d95410f004 0x55d95410f008 予想どおり、空の文字列リテラルはstrArr[1][0]有効なポインタに減衰します。 しかし、私は同じコードを試してみてくださいC ++: #include <cstdio> const char *strArr[2][1] = { {"foo"}, {""}}; int main(void) { printf("%p\t%p\n", strArr[0][0], strArr[1][0]); return 0; } g++ …

2
デストラクタで削除するとクラッシュする
次のプログラムでは、char* lineを介してオブジェクト間でコンテンツをコピーするつもりstrcpyです。ただし、プログラムが終了すると、デストラクタはobj2正常に動作しますが、objクラッシュは発生しません。gdbはline、両方のオブジェクトのの異なるアドレスを表示します。 class MyClass { public: char *line; MyClass() { line = 0; } MyClass(const char *s) { line = new char[strlen(s)+1]; strcpy(line, s); } ~MyClass() { delete[] line; line = 0; } MyClass &operator=(const MyClass &other) { delete[] line; line = new char[other.len()+1]; strcpy(line, other.line); return *this; } int …
8 c++  strcpy 

2
一致するテンプレートクラスの部分クラステンプレートの特殊化が、テンプレートが一致しない別の部分的特殊化とあいまいであるのはなぜですか?
質問はタイトルの文章で説明するには難しすぎるかもしれませんが、これは最小限の例です: #include <iostream> #include <type_traits> template <class T, class U, class Enabler> struct my_trait : std::false_type {}; template <class T, class U> struct my_trait<T, U, std::enable_if_t<std::is_same<T, U>::value>> : std::true_type {}; template <class T> class temped {}; template <class T> struct my_trait<temped<T>, temped<T>, void> : std::false_type {}; template <class T, class …

1
このスレッドサニツァー警告のレースはどこですか?
以下のコードは、macOSでスレッドサニタイザーを使用して実行すると警告を生成します。レースの場所がわかりません。shared_ptrおよびweak_ptrの制御ブロックはスレッドセーフであり、からのプッシュとポップstd::queueはロックを保持したまま行われます。 #include <future> #include <memory> #include <queue> class Foo { public: Foo() { fut = std::async(std::launch::async, [this] { while (!shouldStop) { std::scoped_lock lock(mut); while (!requests.empty()) { std::weak_ptr<float> requestData = requests.front(); requests.pop(); (void)requestData; } } }); } ~Foo() { shouldStop.store(true); fut.get(); } void add(const std::weak_ptr<float> subscriber) { std::scoped_lock lock(mut); requests.push(subscriber); } …

3
値またはコールバック関数の割り当て時のC ++オーバーロードテンプレート
次のようなことをしようとしています... template <class T> struct Wrapper { template <class U> void set(const U& u) { myT = u; } template <class F> void set(F f) { myT = f(); } T myT; }; ここでSFINAEを使用する必要があることはわかっていますが、コールバックパラメーターと値パラメーターをどのように区別しますか?値をコールバックとして使用できないと想定しても安全です。 私が試したenable_ifとis_function, result_of、invoke_result、is_invocable、など、それのどれも右に動作しません。可能ですか?
8 c++  templates  c++17 

1
(一部の)アイテムを1つのstd :: mapから別のstd :: mapに効率的に移動する方法は?
2つのstd::map<>オブジェクトがaありb、いくつかの述語に基づいて、1つのマップから別のマップにいくつかの要素(ノード)を移動(extract+ insert)したいと思いpます。 for (auto i = a.begin(); i != a.end(); ++i) if (p(*i)) b.insert(a.extract(i)) このコードはclangでsegfaultします。問題は、iノードがaから抽出された後のの増加であると思います。 ポストインクリメントを使用してこれを修正する正しい/唯一の方法はありますか?例: for (auto i = a.begin(); i != a.end();) if (p(*i)) b.insert(a.extract(i++)) else ++i; 編集:現在の設定ではこれを再現できないため、「gccで動作する理由」に関する部分を削除しました。ある時点でそれが以前は使用されていたと確信していますが、gcc 9.2.1では(segfaultの代わりに)デッドロックが発生します。いずれにしても、後の増分extract()は機能しません。
8 c++  stl  c++17  stdmap 

2
従属名のテンプレートの明確化
次の例をコンパイルして、次の問題が発生しました。 template <int N> class Matrix { public: template <int Idx> int head() { return Idx; } }; template <typename T> class Test { static constexpr int RayDim = 3; public: int func() const { Matrix<RayDim> yF; return yF.head<1>(); // ^ is template keyword required here? } }; struct Empty …
8 c++ 

3
ユーザーが関数テンプレートパラメーターを指定して、それを推論することを強制できないようにするにはどうすればよいですか?
テンプレート関数があるとしましょう: template <typename A, typename B> A fancy_cast(B) { return {}; } 使用目的はのようなものですfancy_cast<int>(1.f)。 ただし、ユーザーが2番目のテンプレートパラメータを手動で指定することを妨げるものは何もありませんfancy_cast<int, int>(1.f)。 typename B指定されないようにして、それを推論させるにはどうすればよいですか? 私はこれを思いつきました: // Using this wrapper prevents the code from being // ill-formed NDR due to [temp.res]/8.3 template <auto V> inline constexpr auto constant_value = V; template < typename A, typename ...Dummy, typename B, …
8 c++ 

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