为什么`A& a = a`有效吗?

时间:2010-04-13 21:01:19

标签: c++ constructor reference

#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)给我一个警告。但对我来说更严重的是断言发现一切正常,应用程序崩溃(有时远离错误)。问题:有没有办法表明这样的错误?

1 个答案:

答案 0 :(得分:3)

断言不会触发,因为您未在通话Base中创建m_base(m_base)的实例。这只是初始化引用Base& m_base。如果您确实想要调用复制构造函数,请将m_base声明为值Base m_base

另外,捕获这种错误的一种方法是让编译器警告未使用的参数。 gcc标志为-Wunused-parameter-Wextra -Wunused