2017-02-16 27 views
0
struct test 
{ 
    void f() {}; 
}; 
test t1; 

using memfun_t = void (test::*)(); 
memfun_t mf = &test::f; 


auto a1 = &test::f; // OK 
auto a2 = t1.*mf; // error 
auto a3 = &(t1.*mf); // still no luck 

Любые идеи, почему это невозможно вывести? Я был бы признателен за ответы, ссылающиеся на Стандарт.авто не удается вывести?

Edit:

Я нашел расширение RAD Studio язык под названием __closure, который, как представляется, будет решение этой проблемы. 1 Вот код:

class base { 
public: 
    void func(int x) { 
    }; 
}; 

typedef void(base::*pBaseMember)(int); 

class derived : public base { 
public: 
    void new_func(int i) { 
    }; 
}; 

int main(int argc, char * argv[]) { 
    derived derivedObject; 
    void(__closure * derivedClosure)(int); 

    // Get a pointer to the ‘new_func’ member. 
    // Note the closure is associated with the 
    // particular object, ‘derivedObject’. 
    derivedClosure = derivedObject.new_func; 

    derivedClosure(3); // Call ‘new_func’ through the closure. 
    return 0; 
} 

http://docwiki.embarcadero.com/RADStudio/Seattle/en/Closure

ответ

1

Вы не можете использовать

auto a2 = t1.*mf; // error 

так же, как вы не можете использовать:

auto a2 = t1.f; 

t1.f не является допустимым выражение. Указатель на функцию-член не может быть получен через экземпляр класса. В отличие от функций, не являющихся членами, которые распадаются на указатель функции при их использовании, функции-члены не распадаются на указатель функции-члена.

Соответствующий текст из C++ 11 Стандарт на:

унарными

...

4 Указатель на член только формируется, когда явное & используется и его операнд является квалифицированным идентификатором, не заключенным в круглые скобки. [Примечания: то есть выражение &(qualified-id), где qualified-id заключен в круглых скобках, не образует выражение типа «указатель на член.» Ни делает qualified-id, потому что не существует неявное преобразования из квалифицированного идентификатора для нестатической функции-члена для типа «указатель на функцию-член», поскольку от значения l-типа функции к типу «указатель на функцию» (4.3). Также нет &unqualified-id указатель на элемент, даже в пределах класс неквалифицированных идентификаторов. -end note]

+0

Ну вот и вопрос, не так ли? Почему он не может выводить указатель на функцию-член? – Lenz

+1

@Lenz, это был бы вопрос, если 'mf' не был частью сообщения. –

+0

@Lenz: он не может выводить указатель на функцию-член, потому что могут быть выведены только допустимые выражения, и это не является допустимым выражением. Почему это не действительное выражение? Потому что это правила функций-членов C++ и указатели-члены. –