問題タブ [boost-optional]
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++ - std::optional のコピー コンストラクタを実装するには?
を実装std::optional
していますが、そのコピー コンストラクターの 1 つに問題が発生しました。
これが私の実装のスケッチです。
問題は、コンパイラーがoptional
のconstexpr
コンストラクターに空の本体がないことを訴えることです。
それ以外の方法で初期化する方法がわかりません。optional::m_data
また、Web の参照実装を見つけることができませんでした (boost::optional
明らかに を使用していませんconstexpr
)。
助言がありますか?
c++ - GCC '*((void*)& b +4)' を回避する方法は、boost::optional を使用しているときに、この関数の警告で初期化されていない可能性があります
次のようなコードがあります。
Boost 1.53 を使用して GCC 4.7.2 でコンパイルする場合は、次のコマンドを使用します。
g++ -c -O2 -Wall -DNDEBUG
次の警告が発行されます。
13:3: 警告: '<em>((void)& b +4)' は、この関数で初期化されていない状態で使用される可能性があります [-Wmaybe-uninitialized]
どうやら、根本的な問題は GCC にあります。GCC Bugzillaを参照 してください。回避策を知っている人はいますか?
c++ - boost::optional の使い方
私はboost::optional
以下のように使用しようとしています。
次のエラーが表示されます
prog.exe: /usr/local/boost-1.55.0/include/boost/optional/optional.hpp:631: boost::optional::reference_type boost::optional::get() [with T = myClass; boost::optional::reference_type = myClass&]: アサーション `this->is_initialized()' が失敗しました。
おそらく、オプションの変数が正しく初期化されていません。正しい方法でそれを行う方法は?
make_optional
編集::いくつかの非常に良い答えが得られました.さらにいくつかの質問があります.1.関数の最後で使用して'func'
返すのは良い考えですか? また 2. 私には割り当てるboost::none
価値がないことを強調するために割り当てることを考えていましたが、それが理由boost::none
です。しかし、それが有効かどうかわかりませんか?
c++ - より良いscoped_ptrとしてboost::optionalを使用しない理由
boost::optional を scoped_ptr として使用するのが一般的ではないのはなぜですか。オブジェクトがヒープではなくスタック上に作成されるため、より良いようです。しかし、私はそれがこのように使用されているのを見たことがありません。私の質問は、boost::optional を一種の scoped_ptr として使用することの欠点は何ですか?
c++ - ブーストの分割方法::オプション?
私はそのようなコードを持っています:
各引数boost::optional<double>
も次のとおりです。
エラーは次のとおりです。
Error 1 error C2676: binary '/' : 'boost::optional<T>' does not define this operator or a conversion to a type acceptable to the predefined operator
2 IntelliSense: no operator "/" matches these operands
operand types are: boost::optional<double> / boost::optional<double>
分割が定義されていないように見えることは理解しています。boost::none
2つの引数のいずれかがそうである場合、結果が期待されますnone
-それ以外の場合は、通常の二重除算になります。これは自分で書けばいいのでしょうか?
c++ - std::experimental::optional を解除するには?
Boost を使用すると、次を使用してオプションのインプレースを作成できます。
そして、それを解除します:
C++14 / 実験的サポートにより、代わりに以下を使用してオプションのインプレースを構築できます。
でもどうやって解除しようか迷ってます…
c++ - 範囲ベースの for ループで生のポインターを範囲として表示する
for-range ループ構文で、生のポインターを範囲のように動作させるにはどうすればよいですか。
動機:
boost::optional
(将来のstd::optional
) 値を範囲と見なすことができるため、 for range ループ http://faithandbrave.hateblo.jp/entry/2015/01/29/173613 で使用できるようになりました。
私が自分の簡易版を書き直したとき:
使用されます
そのコードを見ながら、生の (null 許容の) ポインターにも一般化できると想像しました。
通常の代わりにif(dptr) std::cout << *dptr << std::endl;
。これは問題ありませんが、上記の他の構文を実現したかったのです。
試み
Optional
最初に、上記のバージョンのポインターを作成して動作させようとしましたが、できませんでしbegin
た。end
そのため、型を明示し、すべてのテンプレートを削除することにしました。
ほとんどそこに、それはのために働く
しかし、おそらく同等の for-range ループでは機能しません。
2 つのコンパイラが教えてくれます。error: invalid range expression of type 'double *'; no viable 'begin' function available
何が起こっている?範囲ループがポインターに対して機能することを禁止するコンパイラーの魔法はありますか。範囲ループ構文について間違った仮定をしていますか?
皮肉なことに、標準にはオーバーロードがstd::begin(T(&arr)[N])
あり、これはそれに非常に近いものです。
注意してください。
はい、その考えはばかげています。
最初の要素のみを反復します。より明確で現実的な回避策は、@Yakk によって提案された回避策のようなことを行うことです。
このようにして、1 つの要素のみを繰り返し処理していること、およびその要素がオプションであることは明らかです。
わかりました、わかりました、に戻りif(ptr) ... use *ptr
ます。