Проблема в том, что количество пользовательских преобразований, которые вызываются неявно, ограничено (до 1) стандартом.
B ob = a;
подразумевает две пользовательские конверсии:
- на
a
: следует вызвать Wrap<A>::operator A*()
- по результату:
B::B(A*)
следует вызвать
Объяснение @James Kanze: этот синтаксис называется "инициализация копирования", фактически эквивалентный B ob = B(a)
(при этом в большинстве случаев копия опускается). Это отличается от B ob(a)
, который является "прямой инициализацией" и сработал бы.
если вы явно укажете что-либо из этого, это будет работать, например:
B ob = B(a);
С другой стороны, для второго случая нет проблем:
ob = a;
является сокращением для:
ob.operator=(a);
Таким образом, требуется только одно определяемое пользователем преобразование, которое разрешено.
ИЗМЕНИТЬ:
Поскольку это требовалось в комментарии (к ответу Кирилла), мы можем догадаться о мотиве.
Цепные преобразования могут быть длинными, очень длинными, и поэтому:
- может удивить пользователей — неявные преобразования уже могут удивлять...
- может привести к экспоненциальному поиску возможностей (для компилятора) - ему нужно будет идти с обоих концов, пытаясь проверить все возможные преобразования и каким-то образом «соединить» их (по кратчайшему пути).
Кроме того, если есть более одного преобразования, вы рискуете иметь циклы, которые должны быть обнаружены (хотя диагностика, вероятно, не потребуется и будет зависеть от качества реализации).
Итак, поскольку предел необходим, чтобы избежать бесконечно длинных поисков (его можно было бы не указывать, с требуемым минимумом), и поскольку после 1 у нас могут быть новые проблемы (циклы), то 1 кажется таким же хорошим пределом, как и любой другой. .
person
Matthieu M.
schedule
25.05.2011
B oB;
скомпилировать, я должен сделатьB oB(a);
. Так что мне непонятно, к чему относится// ok
в третьей строкеmain
. - person Andre Holzner   schedule 25.05.2011warning C4928: illegal copy-initialization; more than one user-defined conversion has been implicitly applied
, но для его получения необходимо передать/Wall
. - person Michael Burr   schedule 25.05.2011