Pull to refresh

Comments 37

Да видел этот пост. Если обратите внимание, то увидите в источниках снизу. И учебник тоже в источниках увидите. Проблема в том, что и в этом посте и в учебнике что-то одно говорится, а что-то упускается. И не получается полной картины.Моя попытка это собрать всю информацию вместе и изложить относительно понятным языком и добавить простые примеры для новичка. Хотя и я, возможно, упустил какие-то детали.Как вы думаете?
Указано не все. Раздел 5.4 ISO/IEC 14882 указывает еще и functional notation (5.2.3). То есть, int i = int(a) тоже является кастом.
Можно конкретную ссылку? Попытаюсь обработать и добавить, если так.
Пожалуйста! http://www.open-std.org/JTC1/sc22/WG21/docs/papers/2011/n3242.pdf
Пусть и старая версия, но сойдет.
Является эквивалентом приведения только для простых типов.
Но соглашусь, статья является не полной без описания явных и неявных приведений типов в конструкторах и вызовах функций, из чего и следует данный вариант приведения.
Не ставил такой цели при написании поста. Но подумаю о возможном расширении поста в этом ключе.
Посмотрите ещё и cast operator:
operator T();
Оператор приведения const_cast удаляет квалификаторы const и volatile с исходного типа данных
Не только удаляет, но и может добавлять
Спасибо. Добавлю. Может еще чего-то не хватает?
Еще заметил опечатку
dynamic_cast

Общий вид приведения:
static_cast<new_type>(exp)
Пример бы, да пару слов о назначении, вроде к const из не-const типы приводятся автоматически, это и в примере видно: неконстантные ссылки передаются в функцию требующую константные ссылки.
Про добавление/удаление volatile вообще не слышал.
Долго не думал, поэтому пример несколько вырожденный, наверняка можно придумать удачнее
#include <iostream>

using namespace std;

void f(int *x)
{
    cout << __PRETTY_FUNCTION__ << endl;
}

void f(const int *x)
{
    cout << __PRETTY_FUNCTION__ << endl;
}

int main()
{
    int x = 5;
    int *px = &x;

    f(px);
    f(const_cast<const int*>(px));

    return 0;
}
Спасибо. К моменту как увидел ваш пример, уже добавил свой тоже вырожденный. Как думаете может как-то изменить его?
Мой пример показывает, для чего может использоваться «добавление» const (для вызова перегруженной функции), а ваш более общий, так что сравнивать наверное не совсем правильно
Понял вас. Добавил ваш пример в пост. Лишним не будет.
Вопросы ко всем посмотревшим пост. Может еще что-то в описание добавить? Или в примерах чего-то не хватает?
Не хватает вычитки текста (надо избавиться от «привидения» и «приводить») и ссылок на стандарты языка. Заодно не помешало бы написать, что для dynamic_cast нужны RTTI.
Вы считает, что без «привидения» и «приводить» будет более удобно для прочтения? Не потеряется ли смысл в некоторых местах?
Ссылки на стандарты языка? Но я их не использовал их как источник, как вы видите в списке источников снизу. Такая ссылка будет обманом.
Но может вы дадите мне ссылку где можно скачать и почитать данные стандарты, а лучше те части, где про приведение типов? Я постараюсь их прочитать и скорректировать пост или добавить что-то новое в него.
Про RTTI добавлю.
Привидение — это что-то страшное в простыне, или с моторчиком.
приведение dynamic_cast приводить к указателю на void


Особо хорошо было бы, если бы тут тоже было «привидение» :)

А стандарт языка — неоспоримый первоисточник знаний по языку, отсылка на него должна быть в принципе всегда, хотя бы в качестве номера вроде 5.2.7 для dynamic_cast или хоть ссылки в конце статьи.
Привидение — это что-то страшное в простыне, или с моторчиком.

Дошло чем вы :) Исправил.
По поводу стандарта согласен. Конечно, это первоисточник. Просто я брал информацию из других источников, которые, я надеюсь, туда заглядывали. Вы правы в том, что корректней было бы написать пост пользуясь только стандартом. Тогда наверно меньше бы было испорченного телефона. Я пока его не читал. Можно ли его скачать бесплатно?
Навскидку так нашлось:
www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

Наверняка есть другие ревизии и более новые ссылки, но базовые вещи не меняются обычно.
Именно зубрить его я не советую, просто поглядывайте туда в случае вопросов или неоднозначностей, в подобных статьях можно вставлять пару цитат из него на английском, тоже полезно будет. Что характерно, компиляторы не всегда на 100% придерживаются стандарта или трактуют по-своему вещи, там не указанные. Например, поведение dynamic_cast с выключенным RTTI разное в MSVC и GCC.
Если у кого-то из вас тех, кто читал пост есть примеры по теме как у пользователя 5nw, которые более полно раскрывают какие-то аспекты, то постите или скидывайте мне в личку и я добавлю их в пост.
При множественном наследовании есть тонкости. static_cast и dynamic_cast могут вернуть указатель не на исходный объект, а на его подобъект.
Вставил ваше дополнение в пост. Это действительно ценное дополнение, если честно я нигде про такое ни читал, а практике ситуация не встречалась. Как вам удалось об это узнать?
Если мне память не изменяет, прочитал в «Дизайн и эволюция языка C++» Страуструппа.
А потом рассуждал, что это значит с точки зрения теории категорий, по этому и запомнил :-).
От создателя языка дополнение получается. Эх хорошо бы было, если б он сам заглянул в этот пост и подправил некоторые моменты (-:
UFO just landed and posted this here
Вы имеете имеете в виду преобразование типов при помощи union? Почему не все гладко гладко с точки зрения языка? Поясните, пожалуйста.
UFO just landed and posted this here
знаю, что время прошло, но только наткнулся на данную статью. Автору стоит побольше думать над примерами кода, этот мусор никуда не годится, хотя бы имена переменных человеческие стоило сделать.

Мусор это ваш комментарий. Ни ко времени и ни к месту.

Sign up to leave a comment.

Articles