Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Использование const в классах.
|
|||
|---|---|---|---|
|
#18+
Вызывает недоумение несколько невнятная разница в конструкциях С++ с модификатором const: 1) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Даёт ошибку компиляции: Код: plaintext 1. 2. 3. 4. То есть компилятор не различает параметр метода uchar * ps и uchar * const ps, хотя я ясно выражаю желание иметь в качестве параметра константный указатель. Точно также реагируют на этот текст cl: Код: plaintext 1. 2. 3. 4. и g++ от Cygwin: Код: plaintext 1. То есть, декларации обоих методов ни одним из этих трёх компиляторов не различаются. Казалось бы... Однако, если оставить только один второй метод, то он чётко показывает, опять же на всех трёх компиляторах, что const в параметре метода не зря. При трансляции такого фрагмента ошибок не возникает Код: plaintext 1. 2. 3. 4. 5. 6. Но стоит попытаться изменить сам указатель ps, как тут же выскакивает ошибка компиляции, что совершенно правильно и законно. Понятно, что если работать с первым методом, без const'ов, то всё законно. Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. Что же получается? Компилятор не различает декларации методов, но различает тела? Кстати, если транслировать в ассемблер, то по именам функций видно, что компилятор всё же различает сигнатуры методов. Спрашивается где истина? Различает или не различает? Далее, пытаемся усовершенствовать декларации с помощью typedef Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. Опять не различает. Между тем мне то надо было: Код: plaintext 1. 2. И вот эти последние две строки чётко различаются компилятором, любым из трёх. Получается, что typedef как-то не совсем так как ожидалось делает определение типа. Кто объяснит происходящее? С уважением, Казаков С.А. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 13:41 |
|
||
|
Использование const в классах.
|
|||
|---|---|---|---|
|
#18+
KA3AKOBКто объяснит происходящее? Выражение любого типа может неявно приводиться к константному. Соответственно различать константность формальных параметров не имеет смысла: при вызове всё равно будет невозможно определить какую именно из перегруженных функций надо вызывать. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 13:51 |
|
||
|
Использование const в классах.
|
|||
|---|---|---|---|
|
#18+
KA3AKOB, ты в курсе, что Код: plaintext 1. и Код: plaintext 1. -- это разные вещи ? А тут: Код: plaintext 1. 2. 3. ты объявляешь одну и ту же функцию, потому что Puchar const ps и const Puchar ps -- это одно и тоже : Код: plaintext 1. 2. 3. void bbb(uchar * const ps) { ; *ps=0;} void bbb(const uchar * ps) {ps++; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 14:04 |
|
||
|
Использование const в классах.
|
|||
|---|---|---|---|
|
#18+
Уважаемый MasterZiv. 1) В курсе, разные вещи, об этом и пишу. Но я в праве предположить, что конструкция (Pchar const ps) эквивалентна конструкции (unsigned char * const ps), и соответственно (const Pchar ps) эквивалентна конструкции (const unsigned char * ps). Однако, как Вы утверждаете, и я с этим согласен, (unsigned char * const ps) и (const unsigned char * ps) разные вещи. Почему же, (Pchar const ps) и (const Pchar ps) одинаковы? По-видимому, так решили разработчики языка и компиляторов, но, по моему мнению, логика слегка шаткая. 2) Конструкции typedef uchar * Puchar; void bbb((uchar *) const ps) { ; *ps=0;} void bbb(const (uchar *) ps) { ; *ps=0;} не транслируются вовсе и здесь вопросов не возникает. С уважением, Казаков С.А. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 14:38 |
|
||
|
Использование const в классах.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Благодарю за ответ, но, либо я не совсем Вас понял, либо Вы ошибаетесь во втором утверждении. Различать константность формальных параметров имеет смысл, поскольку, уже на этапе компиляции можно выявить попытку изменять константный параметр. На этапе трансляции методы, имеющие параметры с модификатором const, это другие функции, нежели те, что имеют параметры без оных модификаторов. Это видно, если транслировать текст С++ в ассемблерный, имена функций будут другие. Что касается неявного преобразования, то, возможно, так сделали разработчики компилятора, но это странно, повторюсь, потому, что декларации методов не различаются, а реализации различаются компилятором. Поэтому мне и интересно, какие глубокие соображения были у разработчиков языка и компиляторов. Или это недоработка? С уважением, Казаков С.А. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 14:59 |
|
||
|
Использование const в классах.
|
|||
|---|---|---|---|
|
#18+
KA3AKOBНо я в праве предположить, что конструкция (Pchar const ps) эквивалентна конструкции (unsigned char * const ps), и соответственно (const Pchar ps) эквивалентна конструкции (const unsigned char * ps). неа, не в праве, потому что всё дело в волшебных пузырьках в указателе: в выражении Код: plaintext 1. 2. 3. квалификатор const относится к значению переменной ps типа Pchar, в то время, как в конструкции Код: plaintext 1. квалификатор const относится к значению указателя на переменную типа unsigned char, а в конструкции Код: plaintext 1. квалификатор const относиться к значению типа unsigned char, на которую указывает указатель ps. конструкция Код: plaintext 1. является, таким образом, тоже валидной, и показывает, что и указатель, и значение, на которое он указывает - константы, и их менять нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 15:04 |
|
||
|
Использование const в классах.
|
|||
|---|---|---|---|
|
#18+
KA3AKOBэто странно, повторюсь, потому, что декларации методов не различаются, а реализации различаются компилятором. Поэтому мне и интересно, какие глубокие соображения были у разработчиков языка и компиляторов. Или это недоработка? Не зацикливайся на реализации функции. Подумай над её вызовами. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 15:23 |
|
||
|
Использование const в классах.
|
|||
|---|---|---|---|
|
#18+
KA3AKOBУважаемый MasterZiv. 1) В курсе, разные вещи, об этом и пишу. Но я в праве предположить, что конструкция (Pchar const ps) эквивалентна конструкции (unsigned char * const ps), и соответственно (const Pchar ps) эквивалентна конструкции (const unsigned char * ps). Ещё раз, давай с нуля разбираться. Ты понимаешь, в чём разница между Код: plaintext 1. и Код: plaintext 1. ? Если да, объясни, как ты понимаешь, в чём. И в чём разница между Код: plaintext 1. и Код: plaintext 1. тоже объясни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 17:15 |
|
||
|
Использование const в классах.
|
|||
|---|---|---|---|
|
#18+
MasterZiv, я понимаю в чём разница :) Можно я объясню :D:D:D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 01:55 |
|
||
|
Использование const в классах.
|
|||
|---|---|---|---|
|
#18+
SashaMercury, В тебе я и не сомневался бы... Но тут речь о KA3AKOB ... Ему уже объяснили в принципе, надо только выяснить, понял ли он. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 02:42 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38729662&tid=2019326]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
72ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 12ms |
| total: | 185ms |

| 0 / 0 |
