2015-12-02 11 views
10

C++ 17にはCallableのコンセプトがあり、std::is_function<T>::valuetrueのタイプとはまったく異なる点がありました。彼らは同等ですか? 1つは他のスーパーセットですか?Callable概念とstd :: is_function型形質の違いは何ですか?

+4

うまくいけば、 'operator()'のオーバーロードされたオブジェクトが呼び出せますが、関数ではありません –

+0

@ M.M名前に問題があると思います。関数*は呼び出し可能ですが、関数オブジェクトも同様です。より良い名前がないのは残念です... ...? – VermillionAzure

答えて

13

C++ 17には、それはC++ 11以降の標準でありますCallable概念

を持つことになります。

相当ですか? 1つは他のスーパーセットですか?

いいえ、実際には完全に分離しています。 Callableはオブジェクト型にのみ適用され、ポインターツーメンバーからオーバーロードされたoperator()型まで、関数ポインタへの関数ポインタへの暗黙的な変換を伴う型へのすべてが含まれます。

is_functionは、実際の関数型(定義ではオブジェクト型ではない)に対してのみtrueです。

+1

'Callable'も関数には適用されませんか? –

+0

@NeilKirkいいえ、標準ではありません。 [\ [func.wrap.func \]/2](http://eel.is/c++draft/func.wrap.func#2)を参照してください( "タイプFの呼び出し可能なオブジェクトfは呼び出し可能です... ")、[\ [func.def \]/3-4](http://eel.is/c++draft/function.objects#func.def-3)("呼び出し可能な型は関数オブジェクト型呼び出し可能なオブジェクトは呼び出し可能な型のオブジェクトです。 ")、[\ [function.objects \]/1](http://eel.is/c++draft/function.objects# 1)( "関数オブジェクト型は、関数呼び出しでpostfix-expressionの型となるオブジェクト型です。" –

+2

LWGは[ここでの文言を調整する可能性があります](http://wg21.link/lwg2393 )、この答えに影響するような方法ではない( 'Callable'を' Lvalue-Callable'に改名することを除いて)。 –

関連する問題