【发布时间】:2017-06-04 07:34:19
【问题描述】:
#include <codecvt>
#include <string>
#include <locale>
std::string to_gbk(const std::wstring& u16_str)
{
using Facet = std::codecvt_byname<wchar_t, char, std::mbstate_t>;
std::wstring_convert
<std::codecvt<wchar_t, char, std::mbstate_t>>
wstr_2_gbk(new Facet("zh_CN.GBK"));
return wstr_2_gbk.to_bytes(u16_str);
}
int main()
{
to_gbk(L"");
}
clang 和 vc++ 都可以,但是 gcc 6.2 输出:
[root@localhost ~]# g++ main.cpp
In file included from /usr/include/c++/6.2.1/bits/locale_conv.h:41:0,
from /usr/include/c++/6.2.1/locale:43,
from main.cpp:3: /usr/include/c++/6.2.1/bits/unique_ptr.h: In instantiation of ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = std::codecvt<wchar_t, char, __mbstate_t>]’:
/usr/include/c++/6.2.1/bits/unique_ptr.h:236:17: required from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = std::codecvt<wchar_t, char, __mbstate_t>; _Dp = std::default_delete<std::codecvt<wchar_t, char, __mbstate_t> >]’
/usr/include/c++/6.2.1/bits/locale_conv.h:218:7: required from here
/usr/include/c++/6.2.1/bits/unique_ptr.h:76:2: error: ‘virtual std::codecvt<wchar_t, char, __mbstate_t>::~codecvt()’ is protected within this context
delete __ptr;
^~~~~~
In file included from /usr/include/c++/6.2.1/codecvt:41:0,
from main.cpp:1:
/usr/include/c++/6.2.1/bits/codecvt.h:426:7: note: declared protected here
~codecvt();
^
这是 gcc 的错误吗?
【问题讨论】:
-
程序员经常怀疑 CPU 中的错误,然后在编译器中,最迟他们发现自己的错误:)
-
@latedeveloper 这是一个答案!
-
@i486 - 这不是这里的情况。实现在这里是不确定的。
标签: c++ gcc compiler-bug