Форум программистов, компьютерный форум CyberForum.ru

Непонятки с конвертацией типов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Чем отличаются между собой 3 книги Шилдта по С++? http://www.cyberforum.ru/cpp/thread612582.html
Читаю сейчас его книгу "Руководство для начинающих", дальше хотел прочитать ещё его две книги "Базовый курс" и "Полный справочник". Но не пойму, одна дополняет другую или это просто новые издания? И ещё хотел бы потом прочитать что то из теории программирования. Выбрать "C++. Методики программирования Шилдта" или 3 тома "Искусство программирования Дональда Кнута" ? Говорят у Шилдта практичные...
C++ Передача аргумента в созданный поток Здравствуйте, суть такова: Создаётся некий поток: DWORD WINAPI MyThread(LPVOID lpParam) { MyStruct data = *(MyStruct*) lpParam; ... } http://www.cyberforum.ru/cpp/thread612537.html
C++ DFD множество одинаковых функциональных блоков
Не знай, куда эту тему определить.. В DFD есть блоки одинаковой функциональности: "осмотр логопеда", "осмотр педиатра", "осмотр невролога" и т.д. Какой-то определенной последовательности их следования нет. Нет ли возможности как-то отразить это одним блоком? Или так и придется все 10 вырисовывать? Спасибо всем, кто откликнется!!!
Класс метафункций: определение, примеры C++
класс метафункций:определение,примеры.
C++ Константные вычисления. Типы арифметических метафункций. http://www.cyberforum.ru/cpp/thread611861.html
Помогите написать прогу.Константные вычисления.Опрделение типоф арифметических метафункций над обертками интегральных типов.
C++ Сборка библиотеки pHash Всем привет! Возникла необходимость воспользоваться библиотекой pHash . Нужна она для вычисления хэшей изображений, аудио или видео. В частности мне нужно считать хэши для аудио файлов. Пишу под виндой, соответственно скачал версию библиотеки под винду. К самой библиотеки прилагался исходный код проекта под студию 2008. Однако как мне показалось, эта версия какая-то урезанная (вроде как есть... подробнее

Показать сообщение отдельно
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450

Непонятки с конвертацией типов - C++

01.07.2012, 20:27. Просмотров 1172. Ответов 13
Метки (Все метки)

Краткое описание примера. Определен класс Foo, единственное поле которого -- константная ссылка (const std::string &).
В классе определены лишь конструктор с сигнатурой Foo(const std::string &) и оператор конвертации обратно в константную ссылку на строку.
C++
1
2
3
4
5
6
7
8
class Foo {
  public:
    typedef const std::string & ValT;
    Foo(const std::string & _str) : str(_str) {}
    operator ValT() { return str; }
  private:
    ValT str;
};
  1. Строим объект foo класса Foo, конвертируем его в (const std::string &) и распечатываем:
    C++
    1
    2
    3
    
    std::string str("abcdef");
    Foo foo(str);
    std::cout << (const std::string &) foo << std::endl;
    Посмотреть результат компиляции
    Все отлично компилируется и работает как задумано.
  2. Теперь же попробуем перед печатью конвертнуть объект foo в (std::string &) (т.е. без const):
    C++
    1
    
    std::cout << (std::string &) foo << std::endl;
    Посмотреть результат компиляции
    Компилятор все прожевывает, компилирует, но при попытке исполнить получившийся бинарник выводится куча мусора вместо ожидаемой строки.
    Output limit exceeded. Application output is limited to 10240 symbols

Теперь вопросы:
  1. Почему вообще во втором случае компиляция оказывается успешной? Как компилятор умудряется конвертировать объект типа Foo в (std::string&), если для этого типа определена только конвертация в тип (const std::string &)?
  2. И как объяснить результат выполнения полученного бинарника? Т.е. даже если предположить, что компилятор тупо начхал на спецификатор const и просто использовал const std::string & как std::string &, то, казалось бы, все равно должна бы была вывестись та же самая строка "abcdef". Но на деле все совсем не так.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru