C++ 为什么` A&;a=a`有效吗? #包括 #包括 使用名称空间std; 结构基 { Base():m_member1(1){} 基础(施工基础和其他) { 断言(this!=&other);//这应该触发 m_成员1=其他m_成员1; } 国际货币联盟成员1; }; 结构派生 { 派生(基和基):m_基(m_基){}//m_基(基) 基地&m_基地; }; void main() { 基地; 导出(基); cout

C++ 为什么` A&;a=a`有效吗? #包括 #包括 使用名称空间std; 结构基 { Base():m_member1(1){} 基础(施工基础和其他) { 断言(this!=&other);//这应该触发 m_成员1=其他m_成员1; } 国际货币联盟成员1; }; 结构派生 { 派生(基和基):m_基(m_基){}//m_基(基) 基地&m_基地; }; void main() { 基地; 导出(基); cout,c++,constructor,reference,C++,Constructor,Reference,断言不会触发,因为您没有在调用m_Base(m_Base)中创建Base的实例。这只是初始化引用Base&m_Base。如果确实要调用复制构造函数,则将m_Base声明为值Base m_Base 另外,发现这种错误的一种方法是让编译器对未使用的参数发出警告。gcc标志是-Wunused parameter,或者-Wextra-Wunused,通常A&A=A;会给我提到的编译器警告。但在本例中,此警告不会出现。答案是正确的,没有调用copy构造函数。但我的问题是悬空引用。@psag,我建议的警告在

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


另外,发现这种错误的一种方法是让编译器对未使用的参数发出警告。gcc标志是
-Wunused parameter
,或者
-Wextra-Wunused

通常A&A=A;会给我提到的编译器警告。但在本例中,此警告不会出现。答案是正确的,没有调用copy构造函数。但我的问题是悬空引用。@psag,我建议的警告在这种情况下会被提出,因为您没有使用参数
Base&Base
。但是您是对的,我似乎无法让gcc直接警告
m\u Base(m\u Base)
(无论它是否是引用).这里有一个关于自我初始化的bug报告(
inti=i
):。但是当你使用变量时,它似乎关注于警告,而不是当你用它本身初始化它时,这似乎是它应该警告你的地方。我可以想象一个场景,当自我初始化应该可以的时候。也许有人出于某种原因想以这种奇怪的方式调用操作符=。但是引用应该总是指带有s的某个地方ize.(至少只要未删除引用的对象)
#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
}