2012-08-09 21 views
6

'有効な' std ::関数は何ですか?ここで

http://en.cppreference.com/w/cpp/utility/functional/function

operator boolが記載されている: "保存された呼び出し可能オブジェクトが有効であるかどうかをチェックします"。

おそらくデフォルトの構成std::functionは無効ですが、これは唯一のケースですか?

また、どのように有効かどうかを確認しますか?

operator()は、対象が有効でない場合と全く同じ場合がありますか?std::bad_function_call *これは、そうでない場合はfalse目標を持っている場合はtrue:

答えて

7

それはそのまま書かれていますが、混乱は正当です。 「有効」とは、「目標を持っている」ことを意味します。

それは機能が割り当てられていたときにstd::functionは「ターゲットを持っている」:

std::function<void()> x; // no target 
std::function<void()> y = some_void_function; // has target 

x = some_other_void_function; // has target 
y = nullptr; // no target 

x = y; // no target 

彼らは、彼らはそれを使用する前に、「有効」に定義、または単に公式の文言で立ち往生している必要がありますどちらか。

+0

OKなので、正当性チェックはタイプチェックにすぎず、 'std :: function'のデフォルトの呼び出しはまさに' std :: bad_function_call'が発生した場合です。 – dpj

+0

@ user710408:「妥当性のチェックはタイプチェックにすぎません」という意味は分かりません。コンパイル時にタイプ・チェックが実行されるとき、有効性(今では定義が "ターゲットを持っている"と仮定します)が実行時に決定されます。関数が有効でない(ターゲットを持たない)か、デフォルトの構造か、明示的に 'nullptr 'が割り当てられているかどうかにかかわらず、不正な関数呼び出しが発生します。 – GManNickG

+0

私はどちらかの意味を知っているとは思わない!ありがとう:) – dpj

1

言語標準は

explicit operator bool() const noexcept;

返し述べています。

functionには何も呼び出されないという意味です。構築されたデフォルトのfunctionは明らかにそうではありません。

関連する問題