使用throw dtor和libc ++的std :: make_shared无法编译

时间:2017-05-04 19:23:14

标签: c++ c++11 g++ clang++ libc++

这是非常基本的代码:

#include <memory>

class foo
{
public:
    ~foo() noexcept(false) { }
};

int main()
{
    auto x = std::make_shared<foo>();
    return 0;
}

编译如下:

g++ -std=c++11 test.cpp          <-- OK
clang++ -std=c++11 test.cpp          <-- OK
clang++ -std=c++11 -stdlib=libc++ test.cpp          <-- FAIL

使用libc ++编译时,它会失败:

/usr/bin/../include/c++/v1/memory:3793:7: error: exception specification of overriding function is more lax than base version
class __shared_ptr_emplace
    ^
/usr/bin/../include/c++/v1/memory:4423:26: note: in instantiation of template class 'std::__1::__shared_ptr_emplace<foo,
    std::__1::allocator<foo> >' requested here
    ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...);
                        ^
/usr/bin/../include/c++/v1/memory:4787:29: note: in instantiation of function template specialization
    'std::__1::shared_ptr<foo>::make_shared<>' requested here
    return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...);
                            ^
exc.cpp:11:19: note: in instantiation of function template specialization 'std::__1::make_shared<foo>' requested here
    auto x = std::make_shared<foo>();
                ^
/usr/bin/../include/c++/v1/memory:3719:13: note: overridden virtual function is here
    virtual ~__shared_weak_count();

我认为它可能是libc ++中的一个错误,但是在我提交错误之前想要检查一下。

1 个答案:

答案 0 :(得分:3)

问题归结为:

  • 这应该编译吗? A:也许
  • 如果你跑了怎么办?答:你得到了不确定的行为。

AS @ T.C.说,[res.on.functions] / 2陈述:

  

在某些情况下(替换函数,处理函数,用于实例化标准库模板组件的类型的操作),C ++标准库依赖于C ++程序提供的组件。如果这些组件不符合要求,则本国际标准对实施没有要求。

     

特别是,在以下情况下效果未定义:

     

[跳过]

     

- 如果任何替换函数或处理函数或析构函数通过异常退出,除非在适用的必需行为:段落中明确允许。

除了标准之外,抛弃析构函数已经很长时间了(至少从C ++ 98开始)。如果在飞行中有异常,并且在堆栈展开期间抛出另一个异常,则可以快速前往std::terminate()