1

boost::optional値を変更する関数に参照として左辺値を渡すことはできますか? このようなもの ( http://coliru.stacked-crooked.com/a/f77d3b095af3d66b ):

#include <iostream>

#include <boost/optional.hpp>

void foo(int& x)
{
    x = 3;
}

int main() {
    boost::optional<int> y;
    foo(*y);
    std::cout << *y << std::endl;
}

当然のことながら、これは機能しません。

この関数は、出力引数として標準型を使用する必要があります (例: int& x)。これを正しく説明していることを願っています。私は私の意図の一般的な可能性について尋ねています。

4

2 に答える 2

2

はい。optionalコンパイルエラーが示唆するように初期化する必要があります:

boost::optional::reference_type boost::optional::get() [with T = int; boost::optional::reference_type = int&]: アサーション `this->is_initialized()' が失敗しました。

これは機能し、印刷されます3

#include <iostream>
#include <boost/optional.hpp>

void foo(int& x)
{
    x = 3;
}

int main() {
    boost::optional<int> y = 2;
    foo(*y);
    std::cout << *y << std::endl;
}

op によって指摘された重要な注意点は、初期化値がコンパイル時に不明な場合でも、boost はとにかくオプションの状態 ( onoperator*または on get()) をアサートするということです。これは、オプションが設定されていない場合 ( boost::none)、アプリケーションがクラッシュすることを意味します。 .

したがって、有効な値を含むオプション ( non boost::none) で初期化するか、 を渡すことができoptional<int>&ます。

于 2015-06-21T15:00:37.823 に答える
1

ここで非常に注意してください。boost::optional を std::optional に交換すると、 std::optional はコンパイラで保護されません。std::optionalで初期化されていないことを確認してください。コンパイルエラーはありません。オプションへの書き込みは許可されていますが、オプションはまだ初期化されているとは見なされません。つまり、 (bool)y == false

#include <iostream>
#include <boost/optional.hpp>
#include <boost/optional/optional_io.hpp>
#include <optional>

void foo(int& x)
{
    x = 3;
}

int main() {
    {
      boost::optional<int> y = 2;
      foo(*y);
      std::cout << *y << " " << !!y << std::endl;
    }

    {
      std::optional<int> y;
      foo(*y);
      std::cout << *y << " " << !!y << std::endl;
    }
}

出力は

3 1
3 0

http://coliru.stacked-crooked.com/a/a169e7c43052a206

于 2018-10-12T08:15:37.763 に答える