C++ C++;11类内引用成员初始化产生坏拷贝

C++ C++;11类内引用成员初始化产生坏拷贝,c++,c++11,gcc,reference,list-initialization,C++,C++11,Gcc,Reference,List Initialization,以下是我的情况: 我有一个类,它有一个常量引用成员变量 我尝试从常量引用初始化该成员变量 我的问题是,当在类中初始化成员变量时,会生成相关对象的临时副本,并且临时变量的地址将用作引用。在构造函数初始值设定项列表中初始化成员变量时,不会复制。在g++4.8.3中,无论采用哪种方式,程序都可以在没有警告的情况下使用c++11或c++1y标志进行编译 下面是一个最小的程序和输出。我只是想更好地理解这个规则,这样我就知道它为什么会发生(或者它是否是一个bug) 根据上面的Peregring lk,似

以下是我的情况:

  • 我有一个类,它有一个常量引用成员变量
  • 我尝试从常量引用初始化该成员变量
我的问题是,当在类中初始化成员变量时,会生成相关对象的临时副本,并且临时变量的地址将用作引用。在构造函数初始值设定项列表中初始化成员变量时,不会复制。在g++4.8.3中,无论采用哪种方式,程序都可以在没有警告的情况下使用c++11或c++1y标志进行编译

下面是一个最小的程序和输出。我只是想更好地理解这个规则,这样我就知道它为什么会发生(或者它是否是一个bug)


根据上面的Peregring lk,似乎是一个编译器错误


这是一个臭名昭著的例子。已发布的C++11标准中存在一个缺陷,该缺陷无意中指定代码:

const A & m_a4{ g_aardvark };
实际上会从
g_aardvark
创建一个临时文件并绑定到该文件。这当然是胡说八道,但g++4.8遵循了已发布的文本。标准品由DR 1288修复,以便参考品直接结合

Clang始终实现了合理的行为,但直到4.9版本,g++才更新


使用标准引用和更简单的测试用例进行解释。

如果内存可用,这是gcc引用列表初始化中的一个错误,在4.9中修复。您应该能够使用更简单的代码进行复制,例如
int main(){A A;A const&b{A};}
您使用的是哪个编译器版本?此代码中没有副本:
creating an A at 0x601494
returning an A at 0x601494
returning an A at 0x601494
copying an A from instance at 0x601494 to instance at 0x7fffc595f87f
copying an A from instance at 0x601494 to instance at 0x7fffc595f87e
B has m_a1 at 0x601494
B has m_a2 at 0x601494
B has m_a3 at 0x7fffc595f87f
B has m_a4 at 0x7fffc595f87e
const A & m_a4{ g_aardvark };