Здравствуйте, fAX, Вы писали:
fAX>Люди добрые!
fAX>Так получилось, что у меня и большинства моих знакомых — линуксы. Нужно проверить, скушает ли VS такой код: fAX>
Здравствуйте, fAX, Вы писали:
fAX>Уже проверять не нужно, нашёлся добрый человек...
fAX>Теперь интересно другое, _должно_ ли это компилироваться по стандарту?
Нет: 12.4.2
Re: Проверьте, пожалуйста, будет ли это компилироваться...
Здравствуйте, _AK_, Вы писали:
_AK>Здравствуйте, fAX, Вы писали:
fAX>>Уже проверять не нужно, нашёлся добрый человек...
fAX>>Теперь интересно другое, _должно_ ли это компилироваться по стандарту?
_AK>Нет: 12.4.2
Да, спасибо, я уже посмотрел (просто у меня печатная копия, долго искал).
Тогда другой, надеюсь, последний, вопрос. Может ли быть такое, что код не будет компилироваться если не определён пользовательский деструктор?
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[4]: Проверьте, пожалуйста, будет ли это компилироваться..
Здравствуйте, fAX, Вы писали:
fAX>Тогда другой, надеюсь, последний, вопрос. Может ли быть такое, что код не будет компилироваться если не определён пользовательский деструктор?
Если пользовательский (явно объявленный) деструктор не определен, и этот деструктор используется, то программа не скомпонуется — линкер будет ругаться.
Но похоже ты имел ввиду, возможно ли получить ошибку компиляции, закомментировав явное объявление/определение деструктора?
В голову приходит только то, что неявно объявленный деструктор может иметь
спецификацию исключений, отличную от явно объявленного. Таким образом может быть нарушено требование, что функция, переопределяющая виртуальную функцию дожна иметь не менее строгую спецификацию исключений (см. 15.4/3 и 15.4/13):
struct A
{
virtual ~A() throw();
};
struct B
{
~B() throw(int);
};
struct D : public A
{
B b;
// ~D() throw(); // вместо требуемого ~D() throw() неявно объявлен ~D() throw(int)
};
Но во-1х из деструкторов обычно не рекомендуют выбрасывать исключения, и во-2х на практике VC игнорирует это дело, а Comeau всего лишь выдает предупреждение:
Comeau C/C++ 4.3.3 (Aug 6 2003 15:13:37) for ONLINE_EVALUATION_BETA1
Copyright 1988-2003 Comeau Computing. All rights reserved.
MODE:strict errors C++
"ComeauTest.c", line 11: warning: exception specification for implicitly declared
virtual function "D::~D" is incompatible with that of overridden
function "A::~A"
struct D : public A
^
In strict mode, with -tused, Compile succeeded (but remember, the Comeau online compiler does not link).
Я не представляю как в линуксе это компильнулось Деструктор изначально не может быть статичным (ведь при вызове метода уничтожается конкретный экземпляр класса — причем из кучи), даже если его предопределить как статичный — компилятор будет громко ругаться Это изначально неправильный подход при использовании объектно-ориентированной технологии. Для этих целей проще использовать стандартные операторы типа
int main(){
A *objA=new(A);
// ...
delete(objA);
}
А для удаления класса в целях его переопределения можно воспользоваться наследованием с перегрузкой методов.
.Da/.Net
Re[2]: Проверьте, пожалуйста, будет ли это компилироваться..
Здравствуйте, fAX, Вы писали:
fAX>Люди добрые!
fAX>Так получилось, что у меня и большинства моих знакомых — линуксы. Нужно проверить, скушает ли VS такой
... fAX>Если вас не затруднит, проверьте, а?