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
}