Передача по ссылке и комплексное продвижение
Почему компилятор не может продвигать char
в int&
но не имеет проблем при передаче его по ссылке на const (char
в int const&
)?
Пример кода:
#include <iostream>
using namespace std;
void func1(int & i) { cout << "int & " << i << endl; }
void func2(int const & i) { cout << "const int & " << i << endl; }
int main() {
char mychar = 'a';
func1(mychar); // compiler-error
func2(mychar); // no error
return 0;
}
2 ответа
Это разрешено:
char c = 'X';
const int& i = c;
Мы безоговорочно продвигаем c
в int
и обязательный i
к тому временному. Это не может привести к путанице. i
имеет то же значение c
сделал, это просто другой тип.
Но что случилось бы, если бы та же логика была разрешена с const
:
char c = 'X';
int& i = c;
i = 'J';
i
не может связываться напрямую с c
- это неправильный тип. Нам все еще нужно продвигать c
и int
и связать i
к тому временному. Но когда мы назначаем i
мы просто модифицируем временную привязку - c
все равно будет X
, Это было бы невероятно запутанным, неинтуитивным и подверженным ошибкам. Так что язык запрещает это.
Акции и преобразования создают новый временный объект. Неконстантные ссылки не могут привязываться к временным файлам.