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

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

1
std :: spanに比較演算子がないのはなぜですか?
/ / プレーン配列などのstd::spanサブ領域への軽量リファレンスとして設計されていませんか?それらとの一貫性を保つために、APIに比較演算子も含めるべきではありませんか?除外の理由は何でしたか?std::vectorstd::array 注:比較演算子で、私はどちらかのフルセットを意味する(<、<=、...)、または宇宙船<=>
10 c++  std  c++20  std-span 

1
C ++ 20以降、割り当てられたストレージでのポインター演算は許可されていますか?
C ++ 20標準では、配列型は暗黙の存続時間型であると言われています。 非暗黙的なライフタイムタイプの配列を暗黙的に作成できるということですか?このような配列を暗黙的に作成しても、配列の要素は作成されませんか? このケースを考えてみます //implicit creation of an array of std::string //but not the std::string elements: void * ptr = operator new(sizeof (std::string) * 10); //use launder to get a "pointer to object" (which object?) std::string * sptr = std::launder(static_cast<std::string*>(ptr)); //pointer arithmetic on not created array elements well defined? …

1
パイプライブラリ機能に範囲を使用できないのはなぜですか?
Jonathan Boccara(Fluent C ++の作者)がpipesというライブラリを作成しました。 リポジトリのメインページにあるこの「パイピング」は、見た目は同じですが、範囲の使用とは異なります。遅延プルではなく、積極的なプッシュに基づいています。しかし、範囲ライブラリを使用してさまざまな「パイプ」操作を実行することはできないと述べられています。例えば: unzip-圧縮された入力(基本的に一連のkタプル)を取り、kの独立した独立した出力を生成します。 fork-コンテナー/範囲の複数の(独立した)コピーを生成します。 なぜそうなるのか、原理的にはよくわかりません。(もちろん、終了イテレータ/センチネルを取得できない範囲を除いて。)

3
nullptrをuintptr_tに変換できますか?異なるコンパイラは同意しません
このプログラムを考えてみましょう: #include <cstdint> using my_time_t = uintptr_t; int main() { const my_time_t t = my_time_t(nullptr); } msvc v19.24でコンパイルできませんでした: <source>(5): error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'my_time_t' <source>(5): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type <source>(5): error C2789: 't': …
10 c++  c++11  gcc  visual-c++  clang 

1
コンセプトTSチェックはプライベートアクセス修飾子を無視します
RandomAccessIteratorを返すシーケンスがbegin / endにあるか、operator []が定義されていて非void型の値を返すという、Indexableという概念を記述したいと思います。 私は、Stroustrupの記事のアイデアをシーケンスの概念に使用し、次のように拡張しました。 template <class T> concept bool Indexable = Sequence<T> || requires(T t, size_t n) { { t[n] } -> NotVoid; }; ほとんどの場合に機能しますが、次の場合は失敗します。 struct Bad { std::vector<int> nums; private: int& operator[](size_t ind) { return nums[ind]; } }; static_assert(!Indexable<Bad>, "fail"); 何らかの理由で、私の概念は、operator []がプライベートとして定義され、trueを返すという事実を無視します。何が欠けていますか?
10 c++  c++-concepts 

1
テンプレートテンプレートクラスでのGCC / C ++ 17の問題
次の2つのオーバーロードを検討してください template<typename T> bool test() { return true; } template<template<typename ...> class T> bool test() { return false; } 1つ目は通常のクラスで機能し、2つ目はインスタンス化されていないテンプレートで機能します。例えば: std::cout<<test<int>()<<std::endl; <-- this yields 1 std::cout<<test<std::list>()<<std::endl; <--this yields 0 ここで、次のテンプレート関数を考えます。 template<typename U> bool templfun(){ struct A{ bool f(){ return test<A>(); // <-- this gives an error } }; return test<A>(); …
10 c++  templates  gcc  clang  c++17 

3
異なるコンパイラでのC ++とCの間の符号なしビットフィールド整数式の一貫性のない切り捨て
編集2: 以前にC ++ソースファイルに存在していた関数がそのままCファイルに移動され、誤った結果が返され始めたときに、奇妙なテストエラーをデバッグしていました。以下のMVEにより、GCCでの問題を再現できます。しかし、気まぐれでClangを使用して(そして後でVSを使用して)例をコンパイルすると、異なる結果が得られました!これをコンパイラの1つのバグとして扱うのか、CまたはC ++標準で許可されている未定義の結果の明示として扱うのか、私にはわかりません。奇妙なことに、どのコンパイラーも式に関する警告を出しませんでした。 犯人はこの表現です: ctl.b.p52 << 12; ここでp52は、と入力されuint64_tます。組合の一部でもありcontrol_tます(下記参照)。結果は64ビットに収まるため、シフト操作はデータを失わない。ただし、Cコンパイラを使用している場合、GCCは結果を52ビットに切り捨てることを決定します。C ++コンパイラでは、結果の64ビットがすべて保持されます。 これを説明するために、以下のサンプルプログラムは、同一の本体を持つ2つの関数をコンパイルし、それらの結果を比較します。c_behavior()Cソースファイルとcpp_behavior()C ++ファイルに配置されmain()、比較を行います。 サンプルコードを含むリポジトリ:https : //github.com/grigory-rechistov/c-cpp-bitfields ヘッダーcommon.hは、64ビット幅のビットフィールドと整数の和集合を定義し、2つの関数を宣言します。 #ifndef COMMON_H #define COMMON_H #include <stdint.h> typedef union control { uint64_t q; struct { uint64_t a: 1; uint64_t b: 1; uint64_t c: 1; uint64_t d: 1; uint64_t e: 1; uint64_t f: 1; uint64_t g: …

4
main()からNULLを返す理由
CやC ++プログラムでのNULL戻り値として使用するコーダーが時々見られます。main()たとえば、次のようなものです。 #include <stdio.h> int main() { printf("HelloWorld!"); return NULL; } このコードをgccでコンパイルすると、次の警告が表示されます。 警告:キャストなしでポインタから整数を返す[-Wint-conversion] これは、マクロNULLが展開され(void*) 0、mainの戻り値がtypeであるため、妥当intです。 私が短いC ++プログラムを作るとき: #include <iostream> using namespace std; int main() { cout << "HelloWorld!"; return NULL; } そして、それをg ++でコンパイルすると、同等の警告が表示されます。 警告:NULLから非ポインター型 'int'に変換しています[-Wconversion-null] しかし、なぜ警告をスローするときのNULL戻り値として使用するのmain()でしょうか。それは単に悪いコーディングスタイルですか? 警告にもかかわらず、の戻り値としてのNULL代わりに使用する理由は何ですか?0main() これが適切であるかどうかは実装定義であり、適切である場合、なぜ実装はポインタ値を取り戻したいのでしょうか?
10 c++  c  null  return  return-value 

2
関数型の引数のテンプレート引数の控除
次のプログラムを検討してください。 #include <iostream> template <typename T> void f( void ( *fn )( T ) ) { fn( 42 ); } void g( int x ) { std::cout << "g( " << x << " );\n"; } int main() { f( g ); } プログラムは正常にコンパイルされ、その出力は g( 42 ); 今度は、非テンプレート関数の名前を変更してみましょうgにf。 #include <iostream> …

1
C ++ 20でビューを使用してコンテナーを構築できますか?
範囲は、C ++ 20標準バージョンでC ++に導入されます。 私の質問:任意の範囲で(既存の)標準ライブラリコンテナを構築できますか?そしてさらに重要なのは、範囲ビューで? たとえば、これは: #include <vector> #include <iostream> #include <ranges> int main() { auto sq = [](int x) { return x * x; }; std::vector<int> vec { 3, 4, 5 }; std::vector<int> squares { std::ranges::views::transform(vec, sq) }; for(auto i : squares) { std::cout << i << ' '; …
10 c++  c++20  range-v3 

1
GCCでのunordered_map :: insert KeyEqual例外時のメモリリーク-強力な例外安全性保証に違反していますか?
私はGCC 7.3.1を使用していますが、coilluでもテストされています。これはバージョン9.2.0だと思います。以下を使用してビルドします。 g++ -fsanitize=address -fno-omit-frame-pointer rai.cpp ここにありrai.cppます: #include <iostream> #include <unordered_map> int main() { try { struct MyComp { bool operator()(const std::string&, const std::string&) const { throw std::runtime_error("Nonono"); } }; std::unordered_map<std::string, std::string, std::hash<std::string>, MyComp> mymap; mymap.insert(std::make_pair("Hello", "There")); mymap.insert(std::make_pair("Hello", "There")); // Hash match forces compare } catch (const std::exception& e) { …


1
C ++では^(){}および^ {}はどういう意味ですか?
最近、次のようなC ++コードを読みました。 setData(total, &user, ^() { struct dst_t to = {ip, port}; sendData(to, data); }); getData(total, ^{ recvData(data, NULL); }); 私も見たことがありませ^() {}ん^{}。彼らはどういう意味ですか?なんらかの匿名関数?
10 c++ 

5
バリアントのインデックスを取得して、そのコンテンツを取得するために使用できないのはなぜですか?
バリアントのコンテンツにアクセスしようとしています。何が入っているのかはわかりませんが、ありがたいことに、バリアントにはあります。だから私はバリアントにそれがどのインデックスにあるのか尋ねて、std::getそのコンテンツにそのインデックスを使うだけだと思った。 しかし、これはコンパイルされません: #include <variant> int main() { std::variant<int, float, char> var { 42.0F }; const std::size_t idx = var.index(); auto res = std::get<idx>(var); return 0; } エラーはstd::get呼び出しで発生します: error: no matching function for call to ‘get<idx>(std::variant<int, float, char>&)’ auto res = std::get<idx>(var); ^ In file included from /usr/include/c++/8/variant:37, from main.cpp:1: /usr/include/c++/8/utility:216:5: …
10 c++  c++17  variant 

2
読み取り専用のシナリオでnullで終了する文字列が必要になるのはいつですか?
私はstd::string_viewライブラリをいじくり回しており、私が取り組んでいるコードベースをstd::string_view可能な限り使用するように変更することを考えていました。ただし、私が読んだスレッドの多くでは、のstd::string_view代わりにいつ、どこで使用するかについて説明しましたconst std::string &。「nullで終了する文字列が必要ないとき」と多くの回答が言うのを見てきました。それで、私がWebを検索し始めたとき、「いつnullで終了する文字列が必要ですか?」この件に関して役立つ答えを見つけたことはありません。 にリンクする外部ライブラリの例が考えられますstd::string。そしてその場合、そのライブラリはそれを必要とするので、ヌルで終了する文字列が必要になります。別の例としては、文字列自体を変更する必要がある場合が考えられますが、変更する必要がある場合は渡されませんconst &。 では、nullで終了する文字列をいつ使用する必要があるでしょうか。 私が見たリンク: std :: string_viewはconst std :: string&よりどのくらい正確に高速ですか? std :: string_viewの代わりにconst&std :: stringを渡すのはいつですか? なぜ文字列ビューだけですか? C ++ 17でconst std :: string&引数を使用する意味はありますか?

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