#include <iostream>
#include <assert.h>
using namespace std;
struct Base
{
Base() : m_member1(1) {}
Base(const Base & other)
{
assert(this != &other); // this should trigger
m_member1 = other.m_member1;
}
int m_member1;
};
struct Derived
{
Derived(Base & base) : m_base(m_base) {} // m_base(base)
Base & m_base;
};
void main()
{
Base base;
Derived derived(base);
cout << derived.m_base.m_member1 << endl; // crashes here
}
Приведенный выше пример является синтезированной версией опечатки.
Я использовал ссылку на члена класса Derived::m_base
, потому что я хотел убедиться, что член будет инициализирован так, как вызвал конструктор.
Одна проблема заключается в том, что ни GCC, ни MSVC не дают мне предупреждение на m_base(m_base)
. Но более серьезным для меня является то, что assert находит все в порядке, и приложение вылетает позже (иногда далеко от ошибки). Вопрос: есть ли способ указать на такие ошибки?