問題タブ [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.

0 投票する
1 に答える
760 参照

c++ - std::optional のコピー コンストラクタを実装するには?

を実装std::optionalしていますが、そのコピー コンストラクターの 1 つに問題が発生しました。

これが私の実装のスケッチです。

問題は、コンパイラーがoptionalconstexprコンストラクターに空の本体がないことを訴えることです。

それ以外の方法で初期化する方法がわかりません。optional::m_dataまた、Web の参照実装を見つけることができませんでした (boost::optional明らかに を使用していませんconstexpr)。

助言がありますか?

0 投票する
4 に答える
11984 参照

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を参照 してください。回避策を知っている人はいますか?

0 投票する
4 に答える
108126 参照

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です。しかし、それが有効かどうかわかりませんか?

0 投票する
2 に答える
385 参照

c++ - より良いscoped_ptrとしてboost::optionalを使用しない理由

boost::optional を scoped_ptr として使用するのが一般的ではないのはなぜですか。オブジェクトがヒープではなくスタック上に作成されるため、より良いようです。しかし、私はそれがこのように使用されているのを見たことがありません。私の質問は、boost::optional を一種の scoped_ptr として使用することの欠点は何ですか?

0 投票する
1 に答える
708 参照

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::none2つの引数のいずれかがそうである場合、結果が期待されますnone-それ以外の場合は、通常の二重除算になります。これは自分で書けばいいのでしょうか?

0 投票する
3 に答える
2770 参照

c++ - std::experimental::optional を解除するには?

Boost を使用すると、次を使用してオプションのインプレースを作成できます。

そして、それを解除します:

C++14 / 実験的サポートにより、代わりに以下を使用してオプションのインプレースを構築できます。

でもどうやって解除しようか迷ってます…

0 投票する
3 に答える
2132 参照

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ます。