Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация объекта pair<T,T> без конструктора T 
V
    Опции темы
archimed7592
Дата 8.12.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



ДжэкИФ, в случае сложного типа ты не сможешь отменить константность и сделать прочие опасные преобразования smile.
В принципе, кастить c-cast'ом противопоказанно в шаблонном коде, когда ты не знаешь, что из себя представляет T. В других же случаях можно, но я не рекомендую - плохой стиль, плохая привычка smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 8.12.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  8.12.2007,  14:06 Найти цитируемый пост)
тем, что оно ограничивает область преобразования

Это как же? Функциональный каст делает абсолютно те же преобразования, что и C-каст, просто синтаксис другой.

Цитата(JackYF @  8.12.2007,  14:06 Найти цитируемый пост)
Тем, что я знаю, делает ли компилятор физические преобразования (static_cast), логические (reinterpret_cast), вниз по иерархии классов (dynamic_cast), или же опасную отмену константности (const_cast).

Ну, тогда тебе надо было записать

Код

pair<CSpecSizeModel,CSpecSizeModel> ans(static_cast<CSpecSizeModel>(i), static_cast<CSpecSizeModel>(i));

Так сказать, вариант специально для слепых smile
PM MAIL   Вверх
archimed7592
Дата 8.12.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  8.12.2007,  18:14 Найти цитируемый пост)
Это как же? Функциональный каст делает абсолютно те же преобразования, что и C-каст, просто синтаксис другой.

Что и так можно?
Код

const int *cp = ...;
int *p(cp);



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 8.12.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @ 8.12.2007,  18:16)
Цитата(UnrealMan @  8.12.2007,  18:14 Найти цитируемый пост)
Это как же? Функциональный каст делает абсолютно те же преобразования, что и C-каст, просто синтаксис другой.

Что и так можно?
Код

const int *cp = ...;
int *p(cp);

А где ты тут видишь функциональный каст? smile

Вот так

Код

const int *cp = 0;
typedef int *PInt;
int *p = PInt(cp);

можно.
PM MAIL   Вверх
archimed7592
Дата 9.12.2007, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  8.12.2007,  19:09 Найти цитируемый пост)
можно.

Сранно, сранно...

Добавлено через 29 секунд
Ой, извините, дважды букву "т" пропустил smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



После того, что я увидел, как работает С-каст в в случае приведения вниз по иерархии - никогда не выдаёт ошибки, но в случае неправильного типа возвращает, вообще говоря, мусорный указатель - не хочу больше такого потенциального гемора.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 9.12.2007, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  9.12.2007,  01:44 Найти цитируемый пост)
После того, что я увидел, как работает С-каст в в случае приведения вниз по иерархии

Точно так же отработает и функциональное преобразование, которое ты выше использовал, ибо в случае одного аргумента это почти то же самое, что C-каст.

Добавлено через 53 секунды
Цитата(archimed7592 @  9.12.2007,  01:36 Найти цитируемый пост)
Сранно, сранно...

А чего странного-то?
PM MAIL   Вверх
archimed7592
Дата 9.12.2007, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  9.12.2007,  01:50 Найти цитируемый пост)
А чего странного-то? 

А ты букву "т" убери smile.

Добавлено через 44 секунды
JackYF, а можно пример, где получится мусор при приведении вниз по иерархии?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  9.12.2007,  08:38 Найти цитируемый пост)
а можно пример, где получится мусор при приведении вниз по иерархии? 

пожалуйста:

Код

#include <iostream>

class A
{
 private: 
        int a1, a2;

 public:
        A() : a1(1), a2(2) {}
        void f()
        {
                std::cout << "I am A::f()!\n";
        }
        virtual ~A() {}
};

class B
{
 private:
        double b1, b2;

 public:
        B() : b1(1.1), b2(2.2) {}
        void g()
        {
                std::cout << "I am B::g()!\n";
        }
        virtual ~B() {}
};

class C: public A, public B
{
        float c1, c2; 
public:
        C(): c1(666.6), c2(777.7) {}
        void h()
        {
                std::cout << "Tada! I am C::h()!\n";
                std::cout << "c1=" << c1 << " c2=" << c2 << std::endl;
                std::cout << "\nYes, I am here yet\n";
        }
};

int main()
{
        A* pa = new A;
        C* pc = (C*)pa;
        pc->h();

        return 0;
}


В результате выводится значения совсем левых мест памяти, а не C::c1, C::c2, что логично следует данного кода.

Добавлено через 24 секунды
а dynamic_cast<> вернул бы 0.

Добавлено через 1 минуту и 32 секунды
Цитата(UnrealMan @  9.12.2007,  01:50 Найти цитируемый пост)
Точно так же отработает и функциональное преобразование

нет. Оно вернёт 0. И я могу это проверить. А при любой попытке обратиться, если я забуду (надо же) проверить программа упадёт в кору.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 9.12.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Так Джеки, я сразу подчеркнул, что я говорю про сложные типы. Про указатели и прочие примитивные типы речи не шло - с ними и так всё понятно: ТАБУ.
А вот со сложными типами никаких опасных преобразований сделать невозможно. Под сложными я понимаю все пользовательские типы, кроме перечислений.

Опять же, если код шаблонный, то ты просто пессемизируешь и полагаешь, что T - примитивный тип, соответственно никаких c-кастов не используешь. Если же ты точно знаешь с каким типом работаешь, то можешь пользоваться как тем, так и другим, но тут есть очень опасные грабли - ты можешь по привычке случайно воспользоваться c-кастом. Тогда капздец. Вот именно поэтому я рекомендую ими не пользоваться вообще и не пользуюсь сам. Правда, то что ф-циональный каст есть по сути то же, что и c-каст - для меня это, мягко говоря открытие...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  9.12.2007,  11:33 Найти цитируемый пост)
Про указатели и прочие примитивные типы речи не шло - с ними и так всё понятно: ТАБУ

ну так приведение вниз по иерархии только над указателями и может применяться.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 9.12.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(JackYF @  9.12.2007,  11:48 Найти цитируемый пост)
ну так приведение вниз по иерархии только над указателями и может применяться. 

Ну так в свете беседы о сложных объектах я и не понял о чём вообще речь smile.
Ладно, разобрались и хорошо smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 9.12.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  9.12.2007,  11:13 Найти цитируемый пост)
нет. Оно вернёт 0. 

Какой ещё ноль?

Ты несколькими постами ранее написал такой код:

Цитата(JackYF @  7.12.2007,  21:34 Найти цитируемый пост)
Код
pair<CSpecSizeModel,CSpecSizeModel> ans((CSpecSizeModel(i)),(CSpecSizeModel(i)));

CSpecSizeModel(i) - это явное преобразование в функциональной нотации.
(CSpecSizeModel)i - это будет явное преобразование в cast-нотации.
Оба эти преобразования эквивалентны. Только в случае с cast-нотацией здесь не надо будет ничего обрамлять дополнительными скобками, чтобы компилятор не считал ans функцией, на что я и указал.

Цитата(JackYF @  9.12.2007,  11:48 Найти цитируемый пост)
ну так приведение вниз по иерархии только над указателями и может применяться.

Да шо вы говорите?

Вот это

Код
static_cast<Derived &>(base_lvalue)

видимо, неправильное преобразование?

Это сообщение отредактировал(а) UnrealMan - 9.12.2007, 14:03
PM MAIL   Вверх
JackYF
Дата 9.12.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(UnrealMan @  9.12.2007,  14:02 Найти цитируемый пост)
Какой ещё ноль?

dynamic_cast<...> в случае неправильного приведения вниз по иерархии по указателю вернёт NULL, по ссылке - std::bad_cast.
а C-каст и в том, и в том случае просто вернёт неправильные указатель/ссылку.

Цитата(UnrealMan @  9.12.2007,  14:02 Найти цитируемый пост)
Да шо вы говорите?

Хорошо. Ещё по ссылке.


Цитата(UnrealMan @  9.12.2007,  14:02 Найти цитируемый пост)
static_cast<Derived &>(base_lvalue)

Да, такой оператор неверен. Он не должен скомпилироваться.

Цитата(UnrealMan @  9.12.2007,  14:02 Найти цитируемый пост)
CSpecSizeModel(i) - это явное преобразование в функциональной нотации.

Это вообще-то в данном случае вызов конструктора.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 9.12.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  9.12.2007,  15:22 Найти цитируемый пост)
Да, такой оператор неверен. Он не должен скомпилироваться.

Да шо вы говорите? smile

Цитата(5.2.9 Static cast)
An lvalue of type “cv1 B”, where B is a class type, can be cast to type “reference to cv2 D”, where D is a class derived (clause 10) from B, if a valid standard conversion from “pointer to D” to “pointer to B” exists (4.10), cv2 is the same cv-qualification as, or greater cv-qualification than, cv1, and B is not a virtual base class of D. The result is an lvalue of type “cv2 D.” If the lvalue of type “cv1 B” is actually a sub-object of an object of type D, the lvalue refers to the enclosing object of type D. Otherwise, the result of the cast is undefined. [Example:

Код
struct B {};
struct D : public B {};
D d;
B &br = d;
static_cast<D&>(br); // produces lvalue to the original d object

—end example]

Цитата(JackYF @  9.12.2007,  15:22 Найти цитируемый пост)
Это вообще-то в данном случае вызов конструктора. 

А вот что по этому поводу говорит стандарт:

Цитата(5.2.3 Explicit type conversion (functional notation))
A simple-type-specifier (7.1.5) followed by a parenthesized expression-list constructs a value of the specified type given the expression list. If the expression list is a single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (5.4).

CSpecSizeModel(i) - это явное преобразование в функциональной нотации, выполняемое при помощи конструктора.

Это сообщение отредактировал(а) UnrealMan - 9.12.2007, 16:07
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.