Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
1

Const_cast может добавлять константность?

01.12.2016, 00:24. Показов 1498. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Недавно мне задали вопрос, что может делать const_cast, я с серьёзным лицом ответил, что может удалять/добавлять константность указателям(и ещё некоторые вещи сказал, но тут опущу, для ясности). На что человек среагировал крайне неадекватно, посмотрел на меня круглыми глазами и спросил: "Добавлять константность???" Я даже замешкался на секунду и подумал, что не прав, но придя домой открыл стандарт и нашёл там примеры использования const_cast с добавлением константности(в 5.2.11 я не нашёл ничего, что прямо говорило бы об этом, пришлось искать примеры). Суть такова, что открыв первую попавшуюся книгу для новичков и посмотрев там "главу" о const_cast я увидел следующее(приблизительно):
...const_cast служит для удаления cv-квалификаторов у указателей и ссылок...
Я, на самом деле, никогда не думал о том, что const_cast в действительности может делать(и открыв стандарт крайне удивился его возможностям!), потому что никогда мне не приходилось его использовать. Но почему в книгах пишут всякий бред? Я думал, что книги дают довольно точное понятие о средствах языка. Получается, что я ошибался?

P.S. Тот человек, который задавал мне всякие вопросы ещё утверждал, что void main стандартом разрешено, поэтому в его компетентности сомневаться не приходится.

Добавлено через 8 минут

Не по теме:

Название у темы неудачное. Но сам ничего придумать не могу пока что, буду рад, если модераторы сами исправят на что-нибудь типа: "Нюансы языка: работа с const_cast", ну или на что-то такое.

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2016, 00:24
Ответы с готовыми решениями:

Константность ссылки в параметре при перегрузке оператора
Здравствуйте! При создании класса комплексные числа операцию сложения определяю так complex...

Как снять константность ссылки для передачи в функцию адреса
Здравствуйте. Есть функция с сигнатурой: void func(const tm & _tm); В теле функции надо...

Подскажите программку для ubuntu, которая может обрабатывать, резать, добавлять эффекты, делать слайд-шоу и пр
Подскажите программку для ubuntu, которая может обрабатывать, резать, добавлять эффекты, делать...

Как создать метакласс, который при создании класса может читать атрибуты из файла и добавлять их классу?
У метакласса должен быть конструктор,принимающий на вход имя файла. Помогите, пожалуйста.

12
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
01.12.2016, 00:48 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
 
 
class Foo
{
public:
    void fn() const
    {
        cout << "void fn() const" << endl;
    }
    void fn()
    {
        cout << "void fn()" << endl;
    }
};
int main()
{
    Foo* a = new Foo();
    auto t1 = const_cast< const Foo* >( a );
    auto t2 = const_cast< Foo* >( a );
 
    t1->fn();
    t2->fn();
}
1
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
01.12.2016, 00:53  [ТС] 3
rikimaru2013, Спасибо, конечно, но мой поток мыслей был направлен как раз на то, что он может это делать, а в книгах пишут, что только удалять может!

Не по теме:

Наверное это было из рассказа "заголовок прочитал, код написал". :D

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
01.12.2016, 01:01 4

Не по теме:

GbaLog-, ну почему) пару слов прочитал с 1 поста, после того как код уже вставил с IDE сюда)



Добавлено через 4 минуты
GbaLog-, внизу страницы нашёл сноску
) const_cast is not limited to conversions that cast away a const-qualifier
1
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
01.12.2016, 01:35 5
Цитата Сообщение от GbaLog- Посмотреть сообщение
Но почему в книгах пишут всякий бред? Я думал, что книги дают довольно точное понятие о средствах языка. Получается, что я ошибался?
Ну, вообще-то надо на автора смотреть. Если автор придурок, то что же он может написать кроме бреда?
Хотя и на старушку бывает прорушка. Дезинформацию по этому вопросу внес не кто иной, как сам Страуструп! В его третьем издании написано, что "const_cast аннулирует действие модификатора const", т.е. ни про добавление, ни про volatile ни слова. У Липпмана более трезво изложено, но про volatile тоже ничего не говорится.
Т.е. в учебниках данная тема действительно довольно темно изложена.

Добавлено через 8 минут
Цитата Сообщение от GbaLog- Посмотреть сообщение
Я думал, что книги дают довольно точное понятие
Кстати, недавно прочитал, что одним из проявлений клипового мышления является неспособность выстраивать иерархии.
Люди только с виду похожи друг на друга, а по интеллектуальным и духовным качествам разброс идет от минус до плюс бесконечности.
Иногда "клиповые" суждения просто поражают. Один, например, пишет: Страуструп пишет одно, а вася пупкин - другое, кому верить?
Или в теме человеку отвечает на вопрос один разумный и толковый, другой неадекват, который несет полную ахинею, и автор темы в растерянности - показания расходятся, кому верить?!
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
01.12.2016, 09:19 6
Цитата Сообщение от GbaLog- Посмотреть сообщение
что void main стандартом разрешено
Стандартом это не запрещено.
Но код при этом становится не переносимым.
Цитата Сообщение от GbaLog- Посмотреть сообщение
Но почему в книгах пишут всякий бред? Я думал, что книги дают довольно точное понятие о средствах языка.
Обычно, не константное неявно кастится к константному без всяких проблем.
А книги призваны объяснять что-то более разумным языком, чем в стандарте,
так что еще больше подвержены ошибкам, неточностям, и т.д.
Цитата Сообщение от GbaLog- Посмотреть сообщение
Получается, что я ошибался?
Если считали, что оно только снимает - то да.
Помимо const, оно также снимает/накладывает volatile:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
 
void foo(int &)
{
}
 
 
int main()
{
    volatile int x;
    foo(const_cast<int&>(x));//ok
}
1
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
01.12.2016, 10:05 7
Цитата Сообщение от Croessmah Посмотреть сообщение
Обычно, не константное неявно кастится к константному без всяких проблем.
А, ну да, в этом и объяснение.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
01.12.2016, 13:02  [ТС] 8
Цитата Сообщение от Mr.X Посмотреть сообщение
кому верить?!
А кому из писателей верить?
Цитата Сообщение от Croessmah Посмотреть сообщение
Стандартом это не запрещено.
Но код при этом становится не переносимым.
Цитата Сообщение от 3.6.1.2
An implementation shall not predefine the main function. This function shall not be overloaded. It shall
have a return type of type int, but otherwise its type is implementation-defined
. All implementations shall
allow both of the following definitions of main:
Я, конечно, в английском не очень силён, но по-моему shall переводится как "должен".
А, я понял, вторая часть предложения к этому же относится, во я дуб.
Цитата Сообщение от Croessmah Посмотреть сообщение
Обычно, не константное неявно кастится к константному без всяких проблем.
Ну это-то понятно. Меня больше распирало человеку тому доказать, что он неправ! А то он такой из себя весь важный был, как будто я только вчера учебник открыл, а он уже там 10 лет программирует на С++ такой крутой. Я хоть и зелёный, но уже не совсем! И не позволю с собой как с новичком обращаться!
Цитата Сообщение от Croessmah Посмотреть сообщение
Если считали, что оно только снимает - то да.
Помимо const, оно также снимает/накладывает volatile
Это высказывание было к этой цитате:
Цитата Сообщение от GbaLog- Посмотреть сообщение
Я думал, что книги дают довольно точное понятие о средствах языка.
Основные возможности const_cast'a я знал.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
01.12.2016, 15:05 9
Цитата Сообщение от GbaLog- Посмотреть сообщение
А кому из писателей верить?
Ну, как говорил В.О. Ключевский, Христы появляются редко, как кометы, а иуды не переводятся, как комары.
То же самое и в интеллектуальной сфере. Умных и толковых авторов можно по пальцам перечесть, а придурошных бумагомарателей пруд пруди.
Ну а так-то, как говорил А.С. Пушкин, нужно при контакте с новым человеком прежде всего сразу понять с кем имеешь дело, и действовать сообразно.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
01.12.2016, 15:12  [ТС] 10
Цитата Сообщение от Mr.X Посмотреть сообщение
Умных и толковых авторов можно по пальцам перечесть, а придурошных бумагомарателей пруд пруди.
Короче, читаю стандарт. Теперь уровень позволяет. Ну более или менее.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
01.12.2016, 16:07 11
Цитата Сообщение от GbaLog- Посмотреть сообщение
Короче, читаю стандарт.
Т.е. писателям решили вообще не верить?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
01.12.2016, 16:09  [ТС] 12
Цитата Сообщение от Mr.X Посмотреть сообщение
Т.е. писателям решили вообще не верить?
Почему? Вот сейчас как раз Александреску собираюсь продолжить читать.
Потом, может, ещё что-нибудь, если мозги не разлетятся по комнате.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
01.12.2016, 16:56 13
Цитата Сообщение от GbaLog- Посмотреть сообщение
Вот сейчас как раз Александреску собираюсь продолжить читать.
Удачи в этом деле. И не принимайте близко к сердцу.
0
01.12.2016, 16:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2016, 16:56
Помогаю со студенческими работами здесь

Какие из этих методов можно и стоит отметить как константные (имеется ввиду логическая константность)
Пусть теперь класс String выглядит следующим образом: struct String { String(const char...

const_cast
День добрый. Пытаюсь вот разобраться как работает данный оператор. Имеется пример: #include...

Const_cast ub
в каком-то видео для новичков увидел классный код такого плана const int x = 42; ...

Const_cast
Всем доброе утро! Ребят, объясните мне, глупой, почему мы можем изменять const_cast-ом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru