Это на самом деле не имеет ничего общего с тем, что неявное преобразование . Более того, это не имеет большого отношения к конверсиям . Это действительно о значениях против значениях .
Когда вы преобразуете 99
в тип X
, результатом будет rvalue . В C ++ результаты преобразований всегда являются rvalues (если вы не конвертируете в ссылочный тип). В C ++ запрещено приписывать неконстантные ссылки к значениям.
Например, этот код не будет компилироваться
X& r = X(99); // ERROR
потому что он пытается присоединить неконстантную ссылку к r-значению. С другой стороны, этот код в порядке
const X& cr = X(99); // OK
потому что это нормально, чтобы прикрепить константную ссылку к значению.
То же самое происходит и в вашем коде. Тот факт, что это подразумевает неявное преобразование, является своего рода не относящимся к делу. Вы можете заменить неявное преобразование явным
один
implicit_conversion_func(X(99));
и в конечном итоге та же ситуация: с const
он компилируется, без const
нет.
Опять же, единственная роль, которую здесь играет преобразование (явное или неявное), заключается в том, что оно помогает нам получить значение. В общем, вы можете создать rvalue другим способом и столкнуться с той же проблемой
int &ir = 3 + 2; // ERROR
const int &cir = 3 + 2; // OK