Сообщение Re[3]: operator int от 26.05.2025 20:14
Изменено 26.05.2025 20:23 rg45
Re[3]: operator int
Здравствуйте, Marty, Вы писали:
M>Ну почему? У меня есть функция, принимающая int, например. При вызове этой функции вычисляется какое-то выражение. Я хочу сменить используемый в выражении тип с интегрального на свой MyInt. При отсутствии неявного operator int мне надо будет переписать выражение, добавив явный каст к интегральному типу. Это может иногда быть просто невозможно, в каких-нибудь чужих шаблонах.
Ну смотри — для инта функция есть, а для твоего типа у тебя такой функции нет. Уже получается, что твой тип не подобен инту.
M>А можно примеры сюрпризов?
Ну вот из недавнего. Разбирали один супер-пупер говно-класс типа универсальной обертки разного вида строк. И чего там в этом классе только не было — и функции и операторы, в т.ч. и неявного приведения. А вот чего не было в этом классе — так это операторов three-way сравнения. А именно эти операторы использовались в ассоциативных контейнерах стандартной библиотеки. В результате, при использовании объектов этого чудо-класса в качестве ключа мапы использовался не мудреный оператор сравнения, а оператор преобразования к const char*.
Мало? Еще пример: написали функцию, возвращающую "универсальную" ссылку, рассчитывая на то, что на выходе получится lvalue ссылка на оригинальный объект. Но в игру вмешался оператор неявного преобразования и вместо этого получилась rvalue ссылка на верменный объект. И оказалась эта ссылка битой, сразу же после выхода из функции.
Да и главная сложность не в том или другом частном примере, а в многообразии труднопредсказуемых "сюрпризов", которые способны подарить неявные преобразования.
M>Ну почему? У меня есть функция, принимающая int, например. При вызове этой функции вычисляется какое-то выражение. Я хочу сменить используемый в выражении тип с интегрального на свой MyInt. При отсутствии неявного operator int мне надо будет переписать выражение, добавив явный каст к интегральному типу. Это может иногда быть просто невозможно, в каких-нибудь чужих шаблонах.
Ну смотри — для инта функция есть, а для твоего типа у тебя такой функции нет. Уже получается, что твой тип не подобен инту.
M>А можно примеры сюрпризов?
Ну вот из недавнего. Разбирали один супер-пупер говно-класс типа универсальной обертки разного вида строк. И чего там в этом классе только не было — и функции и операторы, в т.ч. и неявного приведения. А вот чего не было в этом классе — так это операторов three-way сравнения. А именно эти операторы использовались в ассоциативных контейнерах стандартной библиотеки. В результате, при использовании объектов этого чудо-класса в качестве ключа мапы использовался не мудреный оператор сравнения, а оператор преобразования к const char*.
Мало? Еще пример: написали функцию, возвращающую "универсальную" ссылку, рассчитывая на то, что на выходе получится lvalue ссылка на оригинальный объект. Но в игру вмешался оператор неявного преобразования и вместо этого получилась rvalue ссылка на верменный объект. И оказалась эта ссылка битой, сразу же после выхода из функции.
Да и главная сложность не в том или другом частном примере, а в многообразии труднопредсказуемых "сюрпризов", которые способны подарить неявные преобразования.
Re[3]: operator int
Здравствуйте, Marty, Вы писали:
M>Ну почему? У меня есть функция, принимающая int, например. При вызове этой функции вычисляется какое-то выражение. Я хочу сменить используемый в выражении тип с интегрального на свой MyInt. При отсутствии неявного operator int мне надо будет переписать выражение, добавив явный каст к интегральному типу. Это может иногда быть просто невозможно, в каких-нибудь чужих шаблонах.
Ну смотри — для инта функция есть, а для твоего типа у тебя такой функции нет. Уже получается, что твой тип не подобен инту. Ты скармливаешь этой функции инт ВМЕСТО своего типа. Не важно, явно или неявно.
M>А можно примеры сюрпризов?
Ну вот из недавнего. Разбирали один супер-пупер говно-класс типа универсальной обертки разного вида строк. И чего там в этом классе только не было — и функции и операторы, в т.ч. и неявного приведения. А вот чего не было в этом классе — так это операторов three-way сравнения. А именно эти операторы использовались в ассоциативных контейнерах стандартной библиотеки. В результате, при использовании объектов этого чудо-класса в качестве ключа мапы использовался не мудреный оператор сравнения, а оператор преобразования к const char*.
Мало? Еще пример: написали функцию, возвращающую "универсальную" ссылку, рассчитывая на то, что на выходе получится lvalue ссылка на оригинальный объект. Но в игру вмешался оператор неявного преобразования и вместо этого получилась rvalue ссылка на верменный объект. И оказалась эта ссылка битой, сразу же после выхода из функции.
Да и главная сложность не в том или другом частном примере, а в многообразии труднопредсказуемых "сюрпризов", которые способны подарить неявные преобразования.
M>Ну почему? У меня есть функция, принимающая int, например. При вызове этой функции вычисляется какое-то выражение. Я хочу сменить используемый в выражении тип с интегрального на свой MyInt. При отсутствии неявного operator int мне надо будет переписать выражение, добавив явный каст к интегральному типу. Это может иногда быть просто невозможно, в каких-нибудь чужих шаблонах.
Ну смотри — для инта функция есть, а для твоего типа у тебя такой функции нет. Уже получается, что твой тип не подобен инту. Ты скармливаешь этой функции инт ВМЕСТО своего типа. Не важно, явно или неявно.
M>А можно примеры сюрпризов?
Ну вот из недавнего. Разбирали один супер-пупер говно-класс типа универсальной обертки разного вида строк. И чего там в этом классе только не было — и функции и операторы, в т.ч. и неявного приведения. А вот чего не было в этом классе — так это операторов three-way сравнения. А именно эти операторы использовались в ассоциативных контейнерах стандартной библиотеки. В результате, при использовании объектов этого чудо-класса в качестве ключа мапы использовался не мудреный оператор сравнения, а оператор преобразования к const char*.
Мало? Еще пример: написали функцию, возвращающую "универсальную" ссылку, рассчитывая на то, что на выходе получится lvalue ссылка на оригинальный объект. Но в игру вмешался оператор неявного преобразования и вместо этого получилась rvalue ссылка на верменный объект. И оказалась эта ссылка битой, сразу же после выхода из функции.
Да и главная сложность не в том или другом частном примере, а в многообразии труднопредсказуемых "сюрпризов", которые способны подарить неявные преобразования.