Передача по ссылке и комплексное продвижение

Почему компилятор не может продвигать 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, Это было бы невероятно запутанным, неинтуитивным и подверженным ошибкам. Так что язык запрещает это.

Акции и преобразования создают новый временный объект. Неконстантные ссылки не могут привязываться к временным файлам.

Другие вопросы по тегам