c++ - 为什么 `A & a = a` 有效?

标签 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) 处给我警告。但对我来说更严重的是断言发现一切都很好,后来应用程序崩溃了(有时离错误还很远)。问题:有什么办法可以指出这样的错误吗?

最佳答案

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

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

关于c++ - 为什么 `A & a = a` 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2633164/

相关文章:

c++ - C++ 数组反向器中的 EXC_BAD_ACCESS 错误

c++ - Qt C++ tcp 客户端与 python 扭曲服务器

JavaScript 对象属性返回未定义

delphi - 使用 Tcollection 在 delhi 中保存 vcl 对象引用

c++ - C++ 中的 STL : no match for 'operator*'

C++11:无序实例成员初始化的不一致警告

c++ - 如何使应用程序具有大地址感知能力?

c# - 是否有使用继承构造函数的约定

c++ - 已删除的构造函数必须是私有(private)的吗?

javascript - 带有 jQ​​uery Mobile 的 OpenLayers