Вопрос любителям языка программирования 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 (соотв. имени объекта).
Извращения какие-то.
Это точно С++, не С#? С точки зрения С++, какой-то бред.
ЦитироватьЭто точно С++, не С#?
Ого, уже есть С#? как я отстал от прогресса...
ЦитироватьЦитироватьЭто точно С++, не С#?
Ого, уже есть С#? как я отстал от прогресса...
Конечно есть, С Шарп называют, только листинг вверху это не C#
ЦитироватьЦитироватьЦитироватьЭто точно С++, не С#?
Ого, уже есть С#? как я отстал от прогресса...
Конечно есть, С Шарп называют, только листинг вверху это не C#
С Шарп? А пишется С Диез. :)
ЦитироватьА пишется С Диез. :)
Так и есть, потому что sharp :wink: :)
Я Шарп практически не знаю (так, книжки в свое время полистывал) но это точно не с++.
class CClass
{
//...
};
//...
CClass Obj1;
CClass Obj2;
Obj1.~Obj1(); // !!
Obj2.~Obj2(); // !!
Obj1 и Obj2 - это экземпляры класса (а не классы), откуда взялись деструкторы ~Obj1() и ~Obj2()? Деструктор CClass должен быть ~CClass.
Кстати, в С++ вообще крайне не рекомендуется вызывать в явном виде деструктор.
Короче, то ли лыжи не едут, то ли я.... недостатоточно хорошо знаю С++ :)
А может это вообще чья-то шутка была. А мы тут голову ломаем.
ЦитироватьА может это вообще чья-то шутка была. А мы тут голову ломаем.
Наверно, и вообще, что такое MSVC?
Стандартам языка сей код явно не соответствует. Да и здравому смыслу тоже, ибо в области видимости внутри Obj1 Obj2 находиться не должен. Но в MSVC много странных приблуд... GCC пробовали откомпилироваь?
Хотя... что там внутри CClass написано? Obj1 и Obj2 точно не упоминаются?
ЦитироватьЯ Шарп практически не знаю (так, книжки в свое время полистывал) но это точно не с++.
class CClass
{
//...
};
//...
CClass Obj1;
CClass Obj2;
Obj1.~Obj1(); // !!
Obj2.~Obj2(); // !!
Obj1 и Obj2 - это экземпляры класса (а не классы), откуда взялись деструкторы ~Obj1() и ~Obj2()? Деструктор CClass должен быть ~CClass.
Кстати, в С++ вообще крайне не рекомендуется вызывать в явном виде деструктор.
Короче, то ли лыжи не едут, то ли я.... недостатоточно хорошо знаю С++ :)
Я позавчера случайно написал такое на работе (опечатка copy/paste :) ) и в ужасе обнаружил, что оно компилируется Майкрософтом :D . А gcc не компилирует этот бред :)
Может это такой глюк МСВС? В gcc не прокатывает, говорит
main.cpp:21: error: expected class-name before '(' token
Ну и т.д.
А может это тест на то, сколько человек полезут компилить и проверять? :)
P.S. Во! Ссылка: http://www.dinkumware.com/exam/
Можно выбрать компилятор и протестить как он скушает кусок кода. И действительно, VC++ успешно кушает приведенный кусок! mingw (gcc) ессно справедливо ругается. я так понимаю, Майкрософт как всегда по-своему понимает стандарты :)
Похоже, или устойчивая бага из версии в версию, или особенность внутренней логики компиляторов MS, которую не сочли нужным скрывать, или им зачем-то это нужно у себя. Ни в каких исходниках, поставляемых с MSVC 2005, не нашел использования, насколько позволяет автоматизированный поиск..
стандарту С++ не соответствует
компилится MSVC
ну и черт с ним :)
Выснилось следующее:
Цитировать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).
То есть, достаточно свободно подходят к этому п. стандарта. Это по стандарту (!), оказывается, такое не ясно, можно или нельзя, в общем, не совсем нельзя :) Интел тоже компилирует, но выдаёт предупреждение.
А с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?
Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
ЦитироватьА с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?
Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
а это вы с чего взяли?
вообще то теоретически считается что синтаксические ошибки отлавливает компилятор
иначе можно такого накомпилировать, что сто дебаггеров не разберутся :D
ЦитироватьЦитироватьА с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?
Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
а это вы с чего взяли?
вообще то теоретически считается что синтаксические ошибки отлавливает компилятор
иначе можно такого накомпилировать, что сто дебаггеров не разберутся :D
А можно вообще не реагировать на ошибки и "это самое накомпилировать", - как угодно, так и можно сделать. :smile:
ЦитироватьЦитироватьЦитироватьА с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?
Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
а это вы с чего взяли?
вообще то теоретически считается что синтаксические ошибки отлавливает компилятор
иначе можно такого накомпилировать, что сто дебаггеров не разберутся :D
А можно вообще не реагировать на ошибки и "это самое накомпилировать", - как угодно, так и можно сделать. :smile:
Тогда это не будет называться компиляцией. Это будет генерация рандомного машинного кода. :D
Коль уж такая замечательная тема открыта, вопрос, кто нибудь WPF пользовал?
2 LRV75 - А что это такое?
А вот тоже кажись в тему
(http://s40.radikal.ru/i089/1104/53/9381e7548548.jpg)
(http://s011.radikal.ru/i318/1104/45/7e9900795180.jpg)
ЦитироватьЦитироватьЦитироватьА с чего вы вообще взяли, что нельзя скомпилировать неправильный текст?
Его можно скомпилировать точно так же как правильный, только неизвестно что получится.
а это вы с чего взяли?
вообще то теоретически считается что синтаксические ошибки отлавливает компилятор
иначе можно такого накомпилировать, что сто дебаггеров не разберутся :D
А можно вообще не реагировать на ошибки и "это самое накомпилировать", - как угодно, так и можно сделать. :smile:
Собственно, значительная часть истории развития языков программирования как раз и посвящена тому, чтобы дать возможность компилятору на основании анализа текста гарантированно выявить максимум ошибок. А тут в системе 2010 года полную чушь пишешь, успешно компилируется, и выясняется, что, в общем-то, по стандарту и так можно... и по-другому можно и вообще по-любому в этой ситуации можно.. Бред, ИМХО.
ЦитироватьКоль уж такая замечательная тема открыта, вопрос, кто нибудь WPF пользовал?
Работал 4 месяца в фирме, где при мне уволился последний человек, который у них это использовал :). Говорил, что главный признак квалификации по этой теме - знание тьмы особенностей поведения и багообразных фич этой библиотеки. По интонации, сложилось мнение о том, что не очень-то удачная штука. Но сам не пробовал - через 4 месяца вернулся из той фирмы на прежнюю, где это не нужно и хорошо, что так :)
ЦитироватьКоль уж такая замечательная тема открыта, вопрос, кто нибудь WPF пользовал?
Это ужос глючный и кривой. Рекомендуется только тем, кто пишет софт для отмороженных любителей полупрозрачных разноцветных анимированных кнопочек. В этом случае затраты на борьбу с WPF будут сопоставимы с затратами на реализацию того же самого своими силами.
Всем, кто пишет софт для чего-то практически полезного WPF категорически противопоказан.
По теме если... Вот интересно, если этот код запустить... Че, правда чужой деструктор вызывается?
ЦитироватьПо теме если... Вот интересно, если этот код запустить... Че, правда чужой деструктор вызывается?
почему чужой?
вызывается как раз правильный - this то в деструктор передается неявно, и передается именно тот, который надо, то есть того объекта, через который вызывается деструктор
разговор про то, что вроде как синтаксис вызова деструктора такой в принципе не соответствует стандарту
Я сейчас бы (после обсуждения и на специализированном форуме) сказал так - приведённый текст не соответствует здравому смыслу. Ибо да, навевает на мысль о вызове чужого деструктора. Но он, оказывается, не противоречит, в общем-то, записи в стандарте :). Такое чувство, что при принятии стандарта был какой-то очень важный компилятор :), где была такая бажка, и, чтобы него не обижать :), решили записать, что, мол, допускается при такой записи неопределённое поведение программы :)
Стоп, о каком вообще вызове деструктора идет речь??? Имя деструктора есть имя класса, с добавленной спереди тильдой! А в программе вызывается неизвестно что! Таких членов - Obj1 и Obj2 - вообще нет в классе! Это просто имена локальных переменных, они вообще с именами членов никак пересекаться не должны... В стандарте же говорится совсем о другом:
class CClass1 {
...
}
class CClass2 {
...
}
...
CClass1 var1;
var1.~CClass2();
ЦитироватьСобственно, значительная часть истории развития языков программирования как раз и посвящена тому, чтобы дать возможность компилятору на основании анализа текста гарантированно выявить максимум ошибок. А тут в системе 2010 года полную чушь пишешь, успешно компилируется, и выясняется, что, в общем-то, по стандарту и так можно... и по-другому можно и вообще по-любому в этой ситуации можно.. Бред, ИМХО.
Совершенно верно, задача в том, чтобы
НЕ компилировать неправильную программу, а не в том, чтобы получить какой-то результат на основе неправильного текста. :smile:
Я уже не помню в каком именно древнем компиляторе, наверно в PL-1, можно было задавать "уровень ошибки", которая допускается при компиляции.
ЦитироватьЯ уже не помню в каком именно древнем компиляторе, наверно в PL-1, можно было задавать "уровень ошибки", которая допускается при компиляции.
Да и в современных компиляторах это можно делать. Но самого слабого уровня, обычно, бывает достаточно. Более сильные уровни - трактовка предупреждений как ошибок, то есть исключение сомнительных мест в коде.
Я всегда в MSVC предпочитаю на 4 уровне предупреждений работать. Много, чего видит. Но не включаю трактовать их, как ошибки. И исключаю явно предупреждение 4996 в настройках :)