問題タブ [libc++]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++11 および [17.5.2.1.3] ビットマスク型
標準では、整数型、enum
、およびから選択できますstd::bitset
。
これらの選択肢を考えると、なぜライブラリの実装者は一方を他方よりも優先して使用するのでしょうか?
適切な例として、llvm の libcxx は、これらの実装オプションの (少なくとも) 2 つの組み合わせを使用しているようです。
ctype_base::mask
整数型を使用して実装されます。
<__locale>
regex_constants::syntax_option_type
enum
+ オーバーロード
された演算子を使用して実装されます。<regex>
gcc プロジェクトの libstdc++ は3 つすべてを使用します。
ios_base::fmtflags
列挙型 + オーバーロードされた演算子を使用して実装されます。<bits/ios_base.h>
regex_constants::syntax_option_type
整数型を使用して
実装され、
Bothregex_constants::match_flag_type
を使用して実装されます。std::bitset
<bits/regex_constants.h>
私の知る限り、gdbはこれら3つの選択肢のいずれのビットフィールドネスも「検出」できないため、強化されたデバッグとの違いはありません。
enum
解と整数型の解は、常に同じスペースを使用する必要があります。std::bitset
を保証するものではないようですsizeof(std::bitset<32>) == std::uint32_t
ので、何が特に魅力的なのかわかりませんstd::bitset
。
マスクのenum
組み合わせは列挙子を生成しないため、解決策は型の安全性がわずかに低いようです。
厳密に言えば、上記はn3376に関するものであり、FDIS に関するものではありません (私は FDIS にアクセスできないため)。
この分野で利用可能な啓発をいただければ幸いです。
c++ - 型が不完全なstd::unique_ptrはコンパイルされません
私はpimpl-idiomを使用していstd::unique_ptr
ます:
ただし、不完全な型の使用に関するコンパイルエラーが発生します。304行目<memory>
:
sizeof
不完全な型への''の無効な適用'uixx::window::window_impl
'
私の知る限りstd::unique_ptr
、不完全なタイプで使用できるはずです。これはlibc++のバグですか、それともここで何か間違ったことをしていますか?
templates - typedefで型が不完全なリストのインスタンス化
llvmのコンパイルに問題があります。問題は、現在のコンパイラ(clang + libc ++)が、テンプレートパラメータが定義される前にテンプレートをインスタンス化しようとすることです。コード例は次のとおりです。
コンパイラからのエラーは次のとおりです。
私が知る限り、コンパイラーstd::list<NodeEntry>
はイテレーターを取得するためにインスタンス化を試みます。NodeEntryがまだ定義されていないため、これは失敗します。そしてもちろん、EdgeEntryはNodeEntryを使用しており、その逆も同様です。
明らかな質問は次のとおりです。どうすれば修正できますか?
教育的な質問は次のとおりです。型を定義するときにコンパイラがテンプレートをインスタンス化しようとするのはなぜですか。リストで何かをするまで待つべきではありませんか?
ありがとう。
debugging - Xcode4.3.1でlibc++を使用しているときに、適切な変数表示を取得するにはどうすればよいですか?
Xcode4.3.1のC++11言語ダイアレクトとlibc++を標準ライブラリとして使用しています。この組み合わせでの言語サポートは素晴らしいですが、デバッグは苦痛です。Xcodeの「SummaryFormat」機能もlldbのSummaryFormat機能も、標準タイプ(std :: string、std :: vectorなど)をきれいに印刷して表示しません。これらのタイプのきれいなプリンターを書くことは、それらの複雑さのために非常に重要です。(たとえば、std ::stringはlibc++では非常に複雑です。)
この状況で、他の開発者はSTLタイプの適切な変数表示をどのように取得していますか?または、Xcode /lldbでlibc++を使用している人はまだいませんか?
macos - libc++ コンパイル済みブーストとのリンク
私はまだ libc++ とブーストに苦労しています。
ここのようにlibc ++でブーストをコンパイルしました: Clang ++ / libc ++でBoostをコンパイル/リンクする方法は?
今、私は自分のマシンの1つでこのコンパイルエラーを見ていますが、もう1つは正確なコードで完全にうまくコンパイルされています。どちらもコンパイラのバージョンは同じで、環境変数も同じです。
エラーは次のとおりです。
ABI の非互換性の問題がまだ残っていますか?
コードは次のとおりです。
コードは正常にコンパイルされますが、リンク時にのみエラーが発生します。コンパイルからの追加情報は次のとおりです。
一方、正常にコンパイルされるマシンでは、文字通り libc++ の速度を「見る」ことができます。Xcode で使用すると、非常に高速で、libc++ によるコード補完は驚くべきものです。
しかし、さらに楽しむ前に、この問題の真相を突き止めたいと思います...
c++ - std::unordered_map でオブジェクト参照をキーとして使用する
C++ の unordered_map コンテナーでオブジェクト参照をキーとして使用できるかどうかを知りたいです。
この単純なスニペットをコンパイルしようとすると、メソッドの再定義に関するいくつかのエラーが発生しました。
libc++ での clang の使用
/usr/include/c++/v1/unordered_map:352:12: エラー: クラス メンバーを再宣言できません
size_t operator()(const _Cp& __x) const
libstdc++ で gcc 4.6 を使用する
/usr/include/c++/4.6/bits/hashtable_policy.h:556:5:エラー: 'std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std ::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator [with _Key = Object&, _Pair = std::pair, _Hashtable = std::_Hashtable, std::allocator >、std::_Select1st >、std::equal_to、object_hash、std::__detail::_Mod_range_hashing、std::__detail::_Default_ranged_hash、std::__detail::_Prime_rehash_policy、false、false、true>、std::__detail ::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = int]'はオーバーロードできません
/usr/include/c++/4.6/bits/hashtable_policy.h:537:5 : エラー: 'std::__detail::_Map_base<_Key, _Pair , std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& を使用std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator[](const _Key&) [with _Key = Object&, _Pair = std::pair, _Hashtable = std: :_Hashtable, std::allocator >, std::_Select1st >, std::equal_to, object_hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>, std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = int]'</p>
代わりに古い gnu hash_map (__gnu_cxx::hash_map) を使用すると、この問題は発生しません。
これは新しい標準によって課せられた何らかの制限ですか? もしそうなら、それはなぜですか?
この制限を回避する方法はありますか?
c++ - Clang ++非静的データメンバーの初期化エラー? C++11
Clang が何を言っているのか、または G++-4.7 が正常にコンパイルしているように見えるので、それが正しいかどうかを理解できないようです。
このエラーはstd::uniform_int_distribution
、非静的メンバーの中括弧で初期化しようとしたことが原因です。
以下は失敗します (token_count
はテンプレート パラメーターです)。
std::uniform_int_distribution<Int> random_dist{0, token_count-1};
エラーで:
ただし、次のようにして初期化できます。
std::uniform_int_distribution<Int> random_dist = std::uniform_int_distribution<Int>(0, token_count - 1);
次のコマンドを使用してコンパイルしています: clang++ -std=c++11 -stdlib=libc++ -lc++abi
with Clang-3.2.
の出力clang -v
:
c++ - unordered_mapによるテンプレートコードの膨張
とはまったく同じコードを使用できるため、unordered_map
型消去を使用して実装されているのではないかと思いました(マシンコードのno-opであるキャストを除く)。つまり、両方の実装は、コードサイズを節約することに基づくことができます。unordered_map<Key, A*>
unordered_map<Key, B*>
unordered_map<Key, void*>
更新:この手法は、一般にシンテンプレートイディオムと呼ばれます(それを指摘してくれた以下のコメント提供者に感謝します)。
アップデート2:ハワード・ヒナントの意見に特に興味があります。彼がこれを読んでくれることを願っています。
だから私はこの小さなテストを書きました:
そして、さまざまな設定でコンパイルされた出力のサイズを決定しました。
私が試したすべての設定で、の多くの内部コードがunordered_map
2回インスタンス化されているようです。
(AppleのXcodeのコンパイラを使用)
ここで質問になります。実装者がこの単純な最適化を省略することを選択したために、説得力のある技術的な理由がありますか?
また、なぜ地獄-Os
は宣伝されているものとは正反対の効果なのですか?
アップデート3:
Nicol Bolasが提案したように、私はshared_ptr<void/A/B>
裸のポインター(で作成され、make_shared
でキャストされたstatic_pointer_cast
)の代わりに測定を繰り返しました。結果の傾向は同じです。
c++ - libc++ の std::function コールバック
重複の可能性:
std::function のコピー コンストラクターは、テンプレート型の引数の型が完全な型である必要がありますか?
std::function で構築されたコールバックを持つ単純なクラスがありますが、C++11 / libc++ で構築されていません。エラーが表示されると思いますが、解決策がわかりません。
完全なエラー ログ:
したがって、std::function は完全ではありません。しかし、私はこのクラスがこのクラスへのコールバックへの参照を取得できるようにしたいと考えています。だから私は少しピクルスにいます。C++11でこれを処理する方法を知っている人はいますか?
注: このコードは、使用時に問題なくコンパイルされます<tr1/functional>
c++ - clang libc++ エラー: 暗黙的に削除されたコピー代入演算子が選択されたオーバーロードの解決
clang 3.1 を使用してコンパイルする C++11 プロジェクトを取得できません。コンパイラへのコマンドは次のとおりです。
そして、「-stdlib=libc++」ディレクティブを含めたために発生するエラーは次のとおりです。
どうすればこれを機能させることができるかについて、誰かが私にアドバイスできますか?
コンパイルしようとしているファイルには、このエラーが発生するために C++11 コードを含める必要さえありません。「-stdlib=libc++」ディレクティブだけで問題が発生します。
ダグ、あらゆる支援に感謝します。
更新: こんにちは -- コードはかなり基本的なものですが、可能な限り基本的なものにする際に、次のエラーに遭遇しました:
このエラーを取得するために、コードを次のように削除しました。
これにより、これはかなり根本的に間違っているように見えます。
「-stdlib=libc++」ディレクティブをコンパイラに取り出すと、このエラーは発生しません。