我最近正在编写一个代码,我偶然发现了GCC和Clang中的一些不寻常的东西。使用brace-init会在gcc中触发编译错误,而直接初始化(例如&b = a
)也可以。下面的代码是我遇到的这种行为的一个非常简单的例子,我想知道为什么GCC没有编译代码,因为shared_ptr都没有采用initializer_list而a
是左值
#include <iostream>
#include <memory>
int main( )
{
std::shared_ptr<int> a { nullptr }, &b { a };
a = std::make_shared<int> ( 1e3 );
std::cout << ( b ? *b : 0 ) << std::endl;
return 0;
}
Clang 3.4编译了这个,但GCC 4.8没有。
答案 0 :(得分:3)
@Dyp指出的CWG Defect 1288已被GCC 4.9.0确认并修复。解决方法是使用direct initialization而不使用list initialization:
// Note the parentheses
std::shared_ptr<int> a { nullptr }, &b ( a );