2017-01-19 3 views
8
#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""); 
} 

лязг и VC++ исправны, но GCC 6.2 Выходы:Это ошибка gcc?

[[email protected] ~]# 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(); 
    ^

Является ли это ошибка НКУ?

+7

Посмотреть ноты в http://en.cppreference.com/w/cpp/locale/wstring_convert/~wstring_convert –

+3

Часто программисты подозревают, что ошибка в процессоре, а затем в компиляторе и самое позднее они находят свою ошибку :) – i486

+2

@latedeveloper это ответ! – YSC

ответ

9

Это ошибка gcc?

№ деструктор std::codecvt защищен. См [locale.codecvt] (проект стандарта):

template <class internT, class externT, class stateT> 
class codecvt : public locale::facet, public codecvt_base { 
// ... 
protected: 
    ~codecvt(); 
}; 

Видимо другие реализации были выбраны для повышения наглядности для общественности, но это не является обязательным стандартом.


Также см LWG issue 721 (решил, как не дефект).

Это вызывает сожаление следствие первоначальной конструкции фасета.

В докладе дефект также пример того, как построить такой объект:

template<class I, class E, class S> 
struct codecvt : std::codecvt<I, E, S> 
{ 
    ~codecvt() 
    { } 
} 

... 

std::wstring_convert<codecvt<wchar_t, char, std::mbstate_t> >; 
+1

Я удивлен, увидев проблему LWG с 'void main()', и от Bo всех людей –

+0

Если это защищено, значит ли это, что вы можете обойти эту ошибку, выведя новый класс из 'codecvt'? –

+0

@MarkRansom: Это значит, что вы должны –

Смежные вопросы