6
std::promise<int> p1;
auto f = p1.get_future();

{
    std::promise<int> p2(std::move(pr));
}

bool valid = f.valid(); // true
f.wait(); // does not throw, or fail, but returns immediately
f.get(); // throws an exception

電話をかける前に未来がスローされるかどうかを確認する方法はありますgetか?チェックしてみたかったのvalidですが…どうやってvalidfalseを返すのかよくわかりません。値を設定せずにを破棄してpromiseも、それは行われません。

4

2 に答える 2

5

getを呼び出す前に、futureがスローされるかどうかを確認する方法はありますか?

いいえ、それは将来保存される値を受け取るのとどういうわけか等しいからです。

有効なものがチェックされることを望みました...falseを返すために有効なものを取得する方法がよくわかりません。

std::async未来が、、std::packaged_taskまたはによってのみ作成できる共有状態を参照している場合、Validはtrueを返しますstd::promise。反例は、デフォルトで構築されたものですstd::futuregetまた、一度呼び出した後、またはsharevalid(valid == true)futureで一度呼び出すと、validもfalseになります。無効な(有効な== false)未来で、またはムーブ代入演算子
以外の関数を呼び出すのはUBです。valid

値を設定せずにpromiseを破棄しても、それは行われません。

いいえ、それは有効なポイントではありません。将来は、反対側、つまり約束が果たされなかったというだけで、共有状態を参照しているからです。約束の破棄時に値または例外が設定されていない場合、約束が破られたことを示す例外が設定されます。

于 2013-03-18T00:15:19.993 に答える
1

getを呼び出す前に、futureがスローされるかどうかを確認する方法はありますか?

あなたの質問は次のようになります:関数を呼び出す前に関数
がスローされる かどうかを確認する方法はありますか?

両方の質問に対する答えは、一般的に、いいえです。

検討:

int func_that_might_throw()
{
  if (rand() % 2)
    throw 1;
  return 0;
}

std::future<int> f = std::async(&func_that_might_throw);

int result = f.get();

呼び出しは遅延関数を返す可能性があります。asyncその場合、関数は呼び出すまで実行されませんget()。したがって、一般に、結果が値か例外かを事前に判断する方法はありません。(を呼び出すことf.wait_for(std::chrono::seconds(0))で遅延関数を検出できますが、遅延関数を返さない可能性がasyncあります。その場合、保存された例外があるかどうかを確認しようとすると、関数が非同期で実行されている可能性があるため、例外があるかどうかを確認する必要があります。準備ができており、例外が保存されているため、チェックが非常に面倒になります。)

準備ができている共有状態の有効なfuture結果には、値または例外のいずれかがあります。どちらも有効な結果です。例外を処理したくない場合は、そもそも例外が共有状態に設定されていないことを確認する必要があります。

于 2013-03-18T11:27:08.197 に答える