как работает привязка типа const в c ++? - PullRequest
1 голос
/ 12 апреля 2020

почему эта привязка в порядке

int main()
{
    double d = 4.56;
    const int &r = d;

    return 0;
}

, но это не

int main()
{
    double d = 4.56;
    int &r = d;

    return 0;
}

Может кто-нибудь объяснить мне, пока первая компиляция, а вторая показывает ошибку

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Ссылка int не может быть привязана к объекту типа double, потому что типы не совпадают.

Таким образом, чтобы инициализация ссылки вообще работала, новый временный объект правильный тип int должен быть создан. Это возможно, поскольку существует неявная последовательность преобразования из double в int.

. Затем ссылка должна привязываться к этому временному значению, то есть к выражению rvalue, но разрешено только const ссылкам lvalue привязать к значениям. Не const lvalue ссылки не могут делать это, что делает вторую программу плохо сформированной.

Обратите внимание, что в первой программе, хотя ссылка привязана к временному объекту, который обычно уничтожается при конец полного выражения, в котором он был создан, привязка к ссылке продлевает время жизни этого временного объекта до времени жизни ссылки. Таким образом, использование r в первой программе на самом деле нормально.

Однако доступ через r будет относиться не к d, а к тому новому временному объекту, который не зависит от d, что может быть удивительным, и поэтому я думаю, что это не очень хорошая идея, чтобы писать так. Используйте auto& или const auto&, чтобы убедиться, что r обязательно будет ссылаться на d и что не будет никакого неявного преобразования из-за несоответствия типов. Если вы хотите преобразование, просто используйте int вместо ссылки на int.

1 голос
/ 12 апреля 2020

Когда вы привязываетесь к преобразованному типу (double должен быть преобразован в int), вы получаете значение, так как преобразованный int является временным без адреса в памяти. Следовательно, привязка регулярной ссылки к нему не работает, потому что они могут привязываться только к glvalues. const ссылки на типы могут привязываться к prvalues, поэтому первая компилируется. Источник: https://en.cppreference.com/w/cpp/language/value_category

...