【发布时间】:2017-05-04 19:23:13
【问题描述】:
这是非常基本的代码:
#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++ 中的一个错误,但在我提交错误之前想在这里检查一下。
【问题讨论】:
-
不知道标准是怎么说的——但是投掷 dtor 是完全错误的。
-
这背后有动机吗?
-
@Mordachai 谢谢,但这与问题无关
-
@Mordachai 你无法获得析构函数的地址。
-
@Mordachai 是什么让您认为
shared_ptr存储了指向类型析构函数的指针?它有一个指向自定义可调用删除器的指针,但这不是一回事。
标签: c++ c++11 g++ clang++ libc++