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

Обход константности переменной - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ В файле-словаре найти и распечатать слова, http://www.cyberforum.ru/cpp-beginners/thread1145511.html
В файле-словаре найти и распечатать слова, которые могут быть полностью составлены из других слов словаря с помощью конкатенации, например: “БАЛКОН” = “БАЛ” + “КОН”; “БАРСУК” = “БАР” + “СУК”. #include "stdafx.h" #include <iostream> #include <fstream> #include <io.h> #include <stdio.h> #define bzero
C++ Сложить элементы массива Всем доброго времени суток. У меня такая проблема. Есть таблица из 5 элементов. Нужно их суммировать между собой. Допустим {1,3,5,7,9} = 1+3+5+7+9=25 Вот мой криворукий код. Не могу понять чего не хватает... #include <iostream> using namespace std; typedef struct { int tab = {1,3,5,7,9} //вот их и нужно посчитать. } http://www.cyberforum.ru/cpp-beginners/thread1145493.html
C++ разница между указатель на функцию и функция возврата указателя?
подскажите пожалуйста очень срочно надо (вопрос на зачет)
C++ Посоветуйте программу c++ для макинтош
Сейчас сижу учу эклипс, выдает 1000 ошибок, хотя все под него 100 раз переделываю на компе все работало. Нужно чтобы было много свистелок перделок - там гейм редактор, какой нить движок чтобы тоже можно было прикрепить , для сайтиков кнопочки создать и тд. Кароче как у майкрософрт только для мак. У меня последняя ось - маверик. Главное чтобы для программы именно книги и какие нить учебники ...
C++ Использование ASCII кодов http://www.cyberforum.ru/cpp-beginners/thread1145467.html
Подскажите как пользоваться таблицей ASCII кодов http://www.computerbooks.ru/books/Programming/Book.C_plus_plus_for_beginning/pic/38.gif вот нашол таблицу такую вот выше ссылка мне надо именно сформировать для вывода таблицы типо уголки как на той таблице 187 и 188 сейчас вот такая таблица cout<<"******************************* Cpicok tovarov *********************************";...
C++ Дать каждому элементу массива "описание" Как дать каждому элементу массива "описание" ? Например, такой массив: 4 4 hungry // чтоб было так, т.е. рядом с каждым элементом массива было "описание" элемента 7 satisfied 5 hungry 8 satisfied Если нет такой возможности, то как можно решить такую проблему ? Нужно, чтоб легко было обращаться к описанию элемента. подробнее

Показать сообщение отдельно
DrOffset
6841 / 4052 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
12.04.2014, 01:11     Обход константности переменной
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
ты хочешь сказать что следующие 4 байта после указателя содержат его размер?
Нет, он не об этом. Он говорит о том, что строковый литерал L"test string" имеет тип const wchar_t[12]. Видишь const, он там не случайно. Строка такая размещается обычно в сегменте констант и менять ее нельзя.
Теперь про указатели и массивы. Как видно из типа, это константный массив. Но массивы в С и С++ это не объекты первого класса, их нельзя копировать. Это такая абстракция для представления памяти, но настоящего объекта со свойствами присваиваемости, копируемости - нет. Именно поэтому есть всякие функции типа strcpy.
В общем в силу этих причин всякий раз когда мы передаем наш массив куда-то он неявно преобразуется к указателю. В языке Си было можно неявно снимать const при таком преобразовании, а вот в С++ нельзя! То есть если мы имели константный массив, то в таком, например, коде:
C++
1
wchar_t * p = "test string";
выполняется неявный каст массива к указателю и неявное снятие константности. В С++ такой код некорректен. Но, он же работает! Почему? Объясняю. С++ наследник С, в первую очередь в плане исходных кодов, поэтому очень много С кода стало разваливаться (переставать собираться компилятором С++) из-за таких вот приемов. Поэтому многие разработчики компиляторов просто пошли на уступки и не стали делать эту ситуацию ошибкой. GCC например выдает такое предупреждение:
warning: deprecated conversion from string constant to 'wchar_t*' [-Wwrite-strings]
Теперь к твоей проблеме. Т.к. у тебя тип без константности, а прототип функции с константностью, то при поиске подходящей перегрузки отдается предпочтение шаблону. Почему? Объясняю. Выбор происходит исходя из наилучшего соответствия. В нешаблонной функции стоит const, который говорит, что данные по указателю будут считаться константами. Наш указатель, утверждает, что данные неконстантны (хотя это на самом деле не так, как я выше объяснял). Следовательно здесь необходимо сделать разрешенный правилами языка неявный каст wchar_t * -> const wchar_t *. Теперь смотрим шаблонную функцию: const там применяется ко всему типу, то есть в этом случае мы получим константный указатель (wchar_t * -> wchar_t * const). Отличие здесь в уровне константности. То есть в шаблонном варианте так называемая qualification conversion применяется к первому уровню (т.е. к самому типу), а во втором, нешаблонном варианте ко второму уровню (т.е. к указываемому типу). Исходя из этого и выбирается шаблонная функция.
Вообще советую очень вдумчиво прочитать параграф 13.3.3.1.1 стандарта, и в частности параграф 4.4. Эта тема не очень простая и для того, чтобы больше так не встревать, ее надо бы хорошо разобрать.
Ну а пример твой лечится исправлением кода в соответствии со стандартом (уже постил aLarman):
C++
1
2
const WCHAR * H = L"sd";
A.Find(H, 0, 2);
Здесь мы вообще убрали необходимость кастов, поэтому выбралась нешаблонная функция. Потому что всегда, когда есть полностью подходящая нешаблонная функция, шаблонная не будет вызываться.
По поводу перегрузки советую заглянуть в раздел 13.3.
 
Текущее время: 14:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru