2016-11-02 2 views
2

Я искал the mongocxx query exemples, и я не понимаю, как использовать auto&& над auto& здесь.mongocxx cursor and rvalue ссылки

auto cursor = db["restaurants"].find({}, opts); 
     for (auto&& doc : cursor) { 
      std::cout << bsoncxx::to_json(doc) << std::endl; 
} 

В documentation, они используют это таким образом:

mongocxx::cursor cursor = collection.find(document{} << finalize); 
for(auto doc : cursor) { 
    std::cout << bsoncxx::to_json(doc) << "\n"; 
} 

Я хочу использовать for(auto& doc : cursor)

Что лучшая практика здесь, и почему?

ответ

2

В этом бит:

for (auto&& doc : cursor) 
... 

"Выражение диапазона" в "диапазона для" может возвращать temporary.

Это «Лучшая практика», чтобы использовать ссылку rvalue здесь (при использовании auto).

Посмотрите на это: http://en.cppreference.com/w/cpp/language/range-for

Цитата:

Если range_expression возвращает временный, срок службы продлевается до конца цикла, как указано связыванием с эталонным Rvalue __range , но будьте осторожны, что время жизни любого временного в пределах range_expression не увеличивается.

И это:

http://www.artima.com/cppsource/rvalue.html

Цитата:

Ссылка на Rvalue ведет себя так же, как Lvalue ссылки, за исключением того, что может связываться с временным (с RValue), в то время как вам не может привязывать ссылку (non const) lvalue к rvalue.

Смежные вопросы