Почему `A & a = a` допустимо? - PullRequest
3 голосов
/ 14 апреля 2010
#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 находит все в порядке, и приложение вылетает позже (иногда далеко от ошибки). Вопрос: есть ли способ указать на такие ошибки?

1 Ответ

3 голосов
/ 14 апреля 2010

Assert не срабатывает, потому что вы не создаете экземпляр Base в вызове m_base(m_base). Это просто инициализация ссылки Base& m_base. Если вы действительно хотите вызвать конструктор копирования, объявите m_base как значение Base m_base.

Кроме того, один из способов уловить такую ​​ошибку - заставить ваш компилятор предупредить о неиспользованных параметрах Флаг gcc -Wunused-parameter или -Wextra -Wunused.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...