2016-12-30 6 views
-3
#include <functional> 

struct A 
{ 
    A() = default; 
    A(const A&) = delete; 
    A& operator =(const A&) = delete; 

    void foo() const 
    {} 
}; 

int main() 
{ 
    A a; 
    std::bind(&A::foo, &a); // ok 
    std::bind(&A::foo, a); // error 

    return 0; 
} 

пример, кажется, говорит:Всегда предпочитаете [std :: bind (& A :: mem_fn, & obj)] to [std :: bind (& A :: mem_fn, obj)]?

Вы должны всегда предпочитаютstd::bind(&A::foo, &a);вstd::bind(&A::foo, a);.

Серьезно, если копирование объекта A является дорогостоящим, его следует избегать.

Я не могу придумать ни одного случая, чтобы последнее было лучше. Итак, я просто задаюсь вопросом:

Почему стандарт C++ не запрещает последнее?

+3

Вы всегда должны выбирать '[&]() {a-> foo();}' to 'std :: bind()'. –

+2

Это зависит от того, что должна делать функция, должна ли она взять копию 'a' или просто ссылку? Если вы хотите передать функцию из области «a» и выполнить эту функцию, вам необходимо передать копию «a». – Mine

+0

+1 @Mine, это ответ. Спасибо и, пожалуйста, включите его в официальный ответ, я возьму его и надеюсь, что он поможет большему количеству людей. – xmllmx

ответ

0

Это зависит от того, что функция должна делать:

  • Если это взять ссылку на a:

    std::bind(&A::foo, &a); 
    

    Функция принимает ссылку на a, и, таким образом, оно должно быть в пределах a. Если a выходит из области действия, ссылка становится недействительной, а вызов функции - UB.

  • Должен ли он взять копию a:

    std::bind(&A::foo, a); 
    

    Функция делает копию a, и, таким образом, можно назвать в других местах.

Так что, если вы хотите, чтобы передать функции из сферы-х, и выполнить функцию, вы должны пройти мимо копии a.