使用brace-init初始化对std :: shared_ptr的引用

时间:2014-10-04 15:23:08

标签: c++ gcc clang shared-ptr

我最近正在编写一个代码,我偶然发现了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没有。

1 个答案:

答案 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 );