• Добро пожаловать на Черная дыра.
 

OFF C++: Очень сильно странный код :)

Автор Feol, 20.04.2011 16:32:59

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Feol

Вопрос любителям языка программирования C++

В чём смысл возможности откомпилировать в MSVC 2005, 2010 (в других средах не проверял) сей очень сильно странный код :D:

class CClass
{
 //...
};
//...
CClass Obj1;
CClass Obj2;
 
Obj1.~Obj1(); // !!
Obj2.~Obj2(); // !!
 
Obj1.~Obj2(); // !! :)
Obj2.~Obj1(); // !! :)
 
CClass *pObj1 = &Obj1;
CClass *pObj2 = &Obj2;
 
pObj1->~Obj1(); // !!
pObj2->~Obj2(); // !!
 
pObj1->~Obj2(); // !! :)
pObj2->~Obj1(); // !! :)

Фактически вызывается деструктор CClass с правильным указателем this (соотв. имени объекта).
Дичайший случай! Дичайший!

Sigmoid

Извращения какие-то.
Это точно С++, не С#? С точки зрения С++, какой-то бред.

Виктор Левашов

ЦитироватьЭто точно С++, не С#?
Ого, уже есть С#? как я отстал от прогресса...

LRV_75

Цитировать
ЦитироватьЭто точно С++, не С#?
Ого, уже есть С#? как я отстал от прогресса...
Конечно есть, С Шарп называют, только листинг вверху это не C#
Главное не наличие проблем, главное способность их решать.
У каждой ошибки есть Имя и Фамилия

Виктор Левашов

Цитировать
Цитировать
ЦитироватьЭто точно С++, не С#?
Ого, уже есть С#? как я отстал от прогресса...
Конечно есть, С Шарп называют, только листинг вверху это не C#
С Шарп? А пишется С Диез.  :)

LRV_75

ЦитироватьА пишется С Диез.  :)
Так и есть, потому что sharp  :wink:  :)
Главное не наличие проблем, главное способность их решать.
У каждой ошибки есть Имя и Фамилия

Sigmoid

Я Шарп практически не знаю (так, книжки в свое время полистывал) но это точно не с++.

class CClass
{
//...
};
//...
CClass Obj1;
CClass Obj2;

Obj1.~Obj1(); // !!
Obj2.~Obj2(); // !!

Obj1 и Obj2 - это экземпляры класса (а не классы), откуда взялись деструкторы  ~Obj1() и ~Obj2()?  Деструктор CClass должен быть ~CClass.
Кстати, в С++ вообще крайне не рекомендуется вызывать в явном виде деструктор.  

Короче, то ли лыжи не едут, то ли я.... недостатоточно хорошо знаю С++ :)

Виктор Левашов

А может это вообще чья-то шутка была. А мы тут голову ломаем.

LRV_75

ЦитироватьА может это вообще чья-то шутка была. А мы тут голову ломаем.
Наверно, и вообще, что такое MSVC?
Главное не наличие проблем, главное способность их решать.
У каждой ошибки есть Имя и Фамилия

Parf

Стандартам языка сей код явно не соответствует. Да и здравому смыслу тоже, ибо в области видимости внутри Obj1 Obj2 находиться не должен. Но в MSVC много странных приблуд... GCC пробовали откомпилироваь?

Хотя... что там внутри CClass написано? Obj1 и Obj2 точно не упоминаются?
Россия, вверх!

Feol

ЦитироватьЯ Шарп практически не знаю (так, книжки в свое время полистывал) но это точно не с++.

class CClass
{
//...
};
//...
CClass Obj1;
CClass Obj2;

Obj1.~Obj1(); // !!
Obj2.~Obj2(); // !!

Obj1 и Obj2 - это экземпляры класса (а не классы), откуда взялись деструкторы  ~Obj1() и ~Obj2()?  Деструктор CClass должен быть ~CClass.
Кстати, в С++ вообще крайне не рекомендуется вызывать в явном виде деструктор.  

Короче, то ли лыжи не едут, то ли я.... недостатоточно хорошо знаю С++ :)
Я позавчера случайно написал такое на работе (опечатка copy/paste :) ) и в ужасе обнаружил, что оно компилируется Майкрософтом :D . А gcc не компилирует этот бред :)
Дичайший случай! Дичайший!

boez

Может это такой глюк МСВС? В gcc не прокатывает, говорит
main.cpp:21: error: expected class-name before '(' token
Ну и т.д.

А может это тест на то, сколько человек полезут компилить и проверять? :)

P.S. Во! Ссылка: http://www.dinkumware.com/exam/

Можно выбрать компилятор и протестить как он скушает кусок кода. И действительно, VC++ успешно кушает приведенный кусок! mingw (gcc) ессно справедливо ругается. я так понимаю, Майкрософт как всегда по-своему понимает стандарты :)

Feol

Похоже, или устойчивая бага из версии в версию, или особенность внутренней логики компиляторов MS, которую не сочли нужным скрывать, или им зачем-то это нужно у себя. Ни в каких исходниках, поставляемых с MSVC 2005, не нашел использования, насколько позволяет автоматизированный поиск..
Дичайший случай! Дичайший!

vlad7308

стандарту С++ не соответствует
компилится MSVC
ну и черт с ним :)
это оценочное суждение

Feol

Выснилось следующее:

ЦитироватьThe invocation of a destructor is subject to the usual rules for member functions (9.3), that is, if the
object is not of the destructor's class type and not of a class derived from the destructor's class type,
the program has undefined behavior (except that invoking delete on a null pointer has no effect).

То есть, достаточно свободно подходят к этому п. стандарта. Это по стандарту (!), оказывается, такое не ясно, можно или нельзя, в общем, не совсем нельзя :) Интел тоже компилирует, но выдаёт предупреждение.
Дичайший случай! Дичайший!

Сторонний

А с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?

 Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
"Multiscitia non dat intellectum"

vlad7308

ЦитироватьА с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?

 Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
а это вы с чего взяли?

вообще то теоретически считается что синтаксические ошибки отлавливает компилятор
иначе можно такого накомпилировать, что сто дебаггеров не разберутся  :D
это оценочное суждение

Сторонний

Цитировать
ЦитироватьА с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?

 Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
а это вы с чего взяли?

вообще то теоретически считается что синтаксические ошибки отлавливает компилятор
иначе можно такого накомпилировать, что сто дебаггеров не разберутся  :D
А можно вообще не реагировать на ошибки и "это самое накомпилировать", - как угодно, так и можно сделать. :smile:
"Multiscitia non dat intellectum"

Parf

Цитировать
Цитировать
ЦитироватьА с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?

 Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
а это вы с чего взяли?

вообще то теоретически считается что синтаксические ошибки отлавливает компилятор
иначе можно такого накомпилировать, что сто дебаггеров не разберутся  :D
А можно вообще не реагировать на ошибки и "это самое накомпилировать", - как угодно, так и можно сделать. :smile:

Тогда это не будет называться компиляцией. Это будет генерация рандомного машинного кода. :D
Россия, вверх!

LRV_75

Коль уж такая замечательная тема открыта, вопрос, кто нибудь WPF пользовал?
Главное не наличие проблем, главное способность их решать.
У каждой ошибки есть Имя и Фамилия