Je regardais la emulated version of nullptr et a vu cet opérateur conversion (un membre de nullptr_t):Comment l'opérateur de conversion de modèle ne de pointeur à la syntaxe fonction membre travail
template<class C, class T> // or any type of null
operator T C::*() const // member pointer...
{ return 0; }
Cette syntaxe pour pointer vers une fonction membre me embrouille. Je pense généralement à voir un tel type que quelque chose comme
R (C::*)(I1, I2, ...)
Avec le modèle ci-dessus, il n'y a pas d'arguments d'entrée. Je ne peux pas comprendre comment la déduction de type fonctionne dans ce cas. J'ai de la difficulté à formuler une question spécifique, autre que, comment cela fonctionne-t-il? Si j'ai le code comme ceci:
typedef int (MyClass::*MyTypedef)(float);
MyTypedef m = nullptr;
Je suppose que T déduit à int, et C déduit à MyClass. Qu'est-ce qui "arrive" à flotter?
Si vous analysez le type dans ses composants, la substitution a plus de sens. 'TC :: * [pointeur vers le membre de la classe C de type [T]]' où '[T]' est substitué par 'T (P) [fonction prenant P et retournant [T]]' a pour résultat 'T (C :: *) (P) [pointeur vers un membre de classe C de type [fonction prenant P et retournant [T]]] '. Voir http://stackoverflow.com/questions/17142130/what-are-the-expression-syntax-over-types-c-support/17147477#17147477 – willj