LINUX.ORG.RU

Почему это компилируется?

 


0

1
vector<Parent*> array;
for(auto i : reinterpret_cast<vector<Child<T, N> > >(array))
i->func(reinterpret_cast<T*>(a), reinterpret_cast<N*> (b));

согласно стандарту, вроде как, можно конвертировать только указатели и целочисленные типы. gcc 4.8.2

★★★★★

Может баг был.

#include <vector>

class Parent {};

class Child : public Parent {};

int
main(void)
{
    using namespace std;

    vector<Parent*> array;
    for(auto i : reinterpret_cast<vector<Child>>(array))
        ;
    return 0;
}
@$ g++ -std=c++11 reinterpret-cast.cpp
reinterpret-cast.cpp: In function ‘int main()’:
reinterpret-cast.cpp:13:55: error: invalid cast from type ‘std::vector<Parent*>’ to type ‘std::vector<Child>’
     for(auto i : reinterpret_cast<vector<Child>>(array))
                                                       ^
@$ g++ --version
g++ (GCC) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
xaizek ★★★★★
()
Ответ на: комментарий от anonymous

По логике да, просто в ОП посте также было. Оно в любом случае ошибку выдаёт на 4.9.2.

xaizek ★★★★★
()
Ответ на: комментарий от unt1tled

на сколько я знаю

Насколько я знаю, на сколько слонов землю не ставь, черепахи грамотней не станут.
:(

Stahl ★★☆
()
Ответ на: комментарий от unt1tled

Это я вежливо придираюсь к твоему правописанию.
Разумеется я мог написать что-то вроде:«Эй, мудила! Неужели ты своими дегенеративными нервными обмылками не можешь понять разницу между „насколько“ и „на сколько“ ?»
Но это было бы грубо :)

Stahl ★★☆
()
Ответ на: комментарий от Stahl

я уж было подумал, что ты придираешься к моему знанию С++

unt1tled ★★★★
()
Ответ на: комментарий от Stahl

хахах! держи плюсик в карму! :-D
/me утащил цитату

aol ★★★★★
()

Забавный всё-таки язык C++. Обычно ведь как бывает: кто-то задает на форуме вопрос, почему у него код не компилируется, а другие подсказывают, что надо исправить, дабы компиляция прошла. А с C++ всё ровно наоборот. Народ приходит на форум и с ужасом вопрошает: «Господа, почему даже это компилируется?».

CARS ★★★★
()
Ответ на: комментарий от CARS

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

I-Love-Microsoft ★★★★★
()

хм, компилиться, может, и будет. gcc иногда не особо следует стандартам и не делает некоторых проверок.
но работать не будет. потому что виртуальные таблицы съедут. reinterpret_cast тупо приводит указатель или адрес переменной к другому типу. с виртуальными таблицами в классах такое не проканает. если будет хоть одна виртуальная функция - скорее всего, будет падать. хотя возможно, что просто съедут ссылки на методы и будет непредсказуемое поведение.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

вместо того, чтобы написать что так reinterpre_cast так пользуют только эпилиптоидные негодяи, ты ликбез проводишь, ну!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.