LINUX.ORG.RU

C++ и приведение типов


0

3
class A
{
public:
    operator int() const { return 123; }
    operator bool() const = delete;
};

Пробуем 'if', работает как и ожидается:

A a;
if ( a ) {}

main.cpp:27:9: error: use of deleted function ‘A::operator bool() const’
main.cpp:8:2: error: declared here

Пробуем 'switch', не работает:

A a;
switch ( a ) {}

main.cpp: In function ‘int main()’:
main.cpp:23:13: error: ambiguous default type conversion from ‘A’
main.cpp:23:13: error:   candidate conversions include ‘A::operator int() const’ and ‘A::operator bool() const’

Почему в случае 'switch' он пытается использовать приведение к bool, которое было удалено? Как правильно запретить неявное приведение к bool?

★★★★★

Я не гура в плюсах, но ключевое слово таки `ambiguous`.

GreenBag ★★
()
Ответ на: комментарий от anonymous

Хм, я думал это работает только для виртуальных функций.

frozenix ★★★
()

которое было удалено?

оно не было удалено, цель delete - выдать ошибку при попытке использования, а не скрытие чего либо

wota ★★
()
Ответ на: комментарий от wota

оно не было удалено, цель delete - выдать ошибку при попытке использования, а не скрытие чего либо

Спасибо, уже почитал стандарт. Поведение delete действительно аналогично прятанию под private, только с абсолютным запретом доступа.

Dendy ★★★★★
() автор топика
Ответ на: комментарий от KennyMinigun

Решение:

Да, такое решение помогает. Да только if(a) начинает ошибку пропускать. Собственно, ради её обнаружения всё и затевалось.

Ну, или явно:

Сейчас так и сделал — явным приведением. А хотелось бы неявным (-:

Dendy ★★★★★
() автор топика
Ответ на: комментарий от wota

Отлично, то что нужно! Как я понял explicit операции приведения типов это тоже нововведение в C++11, буду плавно переводить проект на современные C++-рельсы.

Dendy ★★★★★
() автор топика

А в чём смысл, если не секрет? Зачем удалять оператор приведения к bool'у если его можно не определать и не объявлять?

KblCb ★★★★★
()

ambiguous default type conversion from ‘A’

Тут же русским по белому написано - хер знает, что из двух вариантов использовать.

andreyu ★★★★★
()
Ответ на: комментарий от KblCb

Наверное, потому что если определить каст в int и не определить в bool, то конструкции виде if (obj) будут работать, чего денди не хочет.

anonymous
()
Ответ на: комментарий от andreyu

Может быть «тут» еще и решение где-то спряталось?
ОПу то нужно было именно решение, а не перевод ошибки конпилятора (привет, tailgunner!).

anonymous
()
Ответ на: комментарий от anonymous

Может быть «тут» еще и решение где-то спряталось?

Подсказать компилятору, о каком типе мечтает разработчик? В компиляторы еще не встраивают libastral.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Я это сказал к тому, что ОПу нужно было решение его проблемы и он его получил (от человека).
А вот смысл твоего бесполезного поста с переводом ошибки от меня ускользает.

anonymous
()
Ответ на: комментарий от anonymous

Наверное, потому что если определить каст в int и не определить в bool, то конструкции виде if (obj) будут работать, чего денди не хочет.

Именно. В моём случае может быть неявное кастирование к enum и приводить его неявно к bool — путь к скрытым ошибкам. Насколько я понимаю, в C++99 варианта решения нет?

Dendy ★★★★★
() автор топика
Ответ на: комментарий от Dendy

На сцене появляются питонщики, которые за краснотой глаз разглядели только слово рельсы и орут «руби нинужна!»

cdshines ★★★★★
()
Ответ на: комментарий от anonymous

Эм… Я правильно понимаю, что это происходит из-за того что компилятор неявно приводит любой int к bool (в целях совместимости с C) и топикстартер пытается этого избежать подсунув ему явный оператор привидения к bool который меж тем удалён? Просто если всё так, то я не понимаю, что у него не работает…

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

Если добавить приведение к bool, то перестаёт работать switch(a), который начинает видеть приведение к двум интегральным типам: int и bool.

Dendy ★★★★★
() автор топика
Ответ на: комментарий от frozenix

Можно номер страницы в стандарте?

По памяти только помню раздел 8.4.3.

Dendy ★★★★★
() автор топика
Ответ на: комментарий от Miguel

А хотелось бы неявным

Не надо.

Я пишу шаблонный класс для enum, который ведёт себя как enum, но запрещает неявные приведения, сравнения и присваивания с bool и int, имеет конструктор и прочие методы. Если есть варианты решения «как надо» — буду рад услышать.

Dendy ★★★★★
() автор топика
Ответ на: комментарий от Miguel

Для простоты примера я в начале привёл код, оставляющий неявное приведение к int, но запрещающий неявное приведение к bool. Реальная задача немного отличается: оставить неявное приведение к enum, но запретить int и bool.

Dendy ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.