使用大括号init初始化对std::shared_ptr的引用

Using brace-init to initialize a reference to std::shared_ptr

本文关键字:shared ptr 引用 std 初始化 init      更新时间:2023-10-16

我最近正在编写一段代码,在GCC和Clang中偶然发现了一些不寻常的东西。使用大括号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没有。

@Dyp指出的CWG缺陷1288已得到确认,并已为GCC 4.9.0修复。解决方法是使用直接初始化而不使用列表初始化:

// Note the parentheses
std::shared_ptr<int> a { nullptr }, &b ( a );