首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抛出dtor和libc++的libc++不编译

抛出dtor和libc++的libc++不编译
EN

Stack Overflow用户
提问于 2017-05-04 19:23:13
回答 1查看 816关注 0票数 8

下面是非常基本的代码:

代码语言:javascript
复制
#include <memory>

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

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

汇编如下:

代码语言:javascript
复制
g++ -std=c++11 test.cpp          <-- OK
clang++ -std=c++11 test.cpp          <-- OK
clang++ -std=c++11 -stdlib=libc++ test.cpp          <-- FAIL

使用libc++编译时,它失败的原因如下:

代码语言:javascript
复制
/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++中的一个bug,但我想在提交bug之前在这里检查一下。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-11 05:35:07

这个问题归结为:

  • 这个应该编译吗?A:也许
  • 如果你运行它会发生什么?答:你会有不明确的行为。

正如@T.C.所说,res.on.function/2声明:

在某些情况下(替换函数、处理函数、用于实例化标准库模板组件的类型的操作),C++标准库依赖于C++程序提供的组件。如果这些组件不符合它们的要求,则本国际标准不对实现提出任何要求。 特别是,在下列情况下未界定其影响: 跳过 -如果任何替换函数或处理程序函数或析构函数操作通过异常退出,除非在适用的必要行为中特别允许:第1段。

抛开标准,抛出一个析构函数已经是一个很长很长时间的坏主意(至少从C++98开始)。如果在运行中有异常,并且在堆栈展开过程中抛出另一个异常,那就是快速访问std::terminate()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43791221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档