2016-07-15 4 views
0

Я читаю «The C++ Programming Language (4-е издание)», и я столкнулся с этим:Разыменование ссылка

template<class C, class Oper> 
void for_all(C& c, Oper op) // assume that C is a container of pointers 
{ 
    for (auto& x : c) 
     op(*x); // pass op() a reference to each element pointed to 
} 

Так от того, что я понимаю, что мы переборе c и получить ссылку на x, который является текущей итерацией. x затем передается оператору вызова функции op, но он разыменован первым? Почему вы должны были бы разыменовать x?

+2

См. Комментарий, где говорится, что 'C' является контейнером указателей. По-видимому, 'op()' не хочет указателя, он хочет значение, на которое указывает указатель. Поэтому вы должны косвенно. – Barmar

ответ

4

Вы сказали, что в комментарии в размещенном коде:

// assume that C is a container of pointers 

Это означает, что x является ссылкой на указатель. *x оценивает объект, на который указывает указатель.

op должен ожидать объект или ссылку на объект, а не указатель на объект.

+1

Ну, это объясняет. Кстати, код прямо из книги и не мой. Думаю, комментарий пронесся над моей головой. –