使用花括号初始化来初始化指向std::shared_ptr的引用

7

最近我在编写一段代码时,发现了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不能。


无法在gcc 4.9上重现。可能已在版本之间修复。 - user3920237
可能是列表初始化中的缺陷。比较N3337和N3485。我会尝试找到缺陷报告。 - dyp
3
给你链接:http://open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#1288 - dyp
相关/重复:https://dev59.com/DWkv5IYBdhLWcg3wkBka - dyp
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接