Если вы удалите const
s из конструктора pair::pair(const L& left,const R& right)
, тогда код pairDemo::pair<int, double> temp(x*2, x+y);
не будет работать, поскольку результат x*2
запрещает привязку к L& left
, а x+y
запрещает привязку до R& right
.
C ++ имеет это правило, потому что разработчики считали, что параметры функции неконстантных ссылочных типов должны указывать, что функция может изменить значение и что это изменение должно быть видимым для вызывающей стороны.
рассмотреть следующие вопросы:
void foo(int &i) {
i = 3;
}
foo(x); // sets x to 3
foo(1); // sets 1 to 3??? prohibited
Это может вызвать путаницу, если кто-то случайно вызовет foo
с временным, например 1
или или x+y
, или x*2
, поэтому C ++ решает сделать безопасную вещь и не разрешить их компилировать.
C ++ 11 добавляет «ссылки на значения», которые имеют некоторые другие правила.
void bar(int &&i) { // && means 'rvalue reference'
i = 3;
}
bar(1); // sets 1 to 3!
bar(x); // prohibited.
Ссылки на rvalue должны означать, что функция получает временное значение, и что бы она ни делала с ней, она не повлияет на внешний мир. Теперь опасность состоит в том, что функция, принимающая ссылку на rvalue, будет случайно вызвана с помощью временного метода. Поэтому правила пытаются запретить вам передавать невременные значения, такие как x
.