2015-04-09 4 views
0

Недавно я написал что-то вроде следующего. Однако я очень смущен, что ему удалось скомпилировать. Ну, теперь, когда это произошло, у меня есть некоторые вопросы ...Передача константной ссылки std :: pair на функцию

void tree_walk(const std::pair<tree, node> &tree_root) 
{ 
    tree t = tree_root.first; 
    node current = tree_root.second; 

    // code which walks the tree, updating current as we go along. 
} 

Мне интересно, вызывает ли вызов tree.first копирует дерево? Какова семантика передачи std :: pair в качестве ссылки?

ответ

5

tree_rooting.first ничего не копировать, но

tree t = tree_root.first; 

делает. Если вы не хотите, чтобы скопировать дерево, вы можете сделать

const tree &t = tree_root.first; 

Чтобы ответить на ваш второй вопрос: Вы правильно прошли pair к функции в качестве const ссылки. Если вы хотите изменить входные данные, просто оставьте const в сигнале функций, чтобы передать ссылку не const.

1

Не понимаю, что здесь вводит в заблуждение. Вы передали пару по константной ссылке, содержащей дерево и узел. Затем вы сделали локальные копии дерева и узла, а затем сделали с ними все. Семантика ссылки pair по константе точно такая же, как и любой другой тип по ссылке const.

0

В вашей части коды, дерево копируется в:

tree t = tree_root.first 

Если вы не хотите, чтобы изменить значение, присутствующее в пары вы передаете его как сопзИте, если вы хотите изменить значения, то вы делаете NOT передать его как const

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