2013-02-14 3 views
6

unique_ptr<char[]>unique_ptr<const char[]>으로 옮기는 가장 좋은 관용구는 무엇입니까?from unique_ptr <char[]> to unique_ptr <const char []>

사용 사례 : 일부 버퍼에 C 문자열을 생성한다고 가정합니다. 예외가 발생할 경우 적절한 정리를 위해 해당 버퍼는 unique_ptr을 사용하여 참조가 될 수 있습니다. 문자열이 생성되면 문자열을 더 이상 수정하지 않으려면 unique_ptr<const char[]>이라고 선언 된 클래스 멤버로 문자열을 옮길 수 있습니다.

std::unique_ptr<const char[]> res; 
std::unique_ptr<char[]> buf(new char[4]); 
buf[0] = 'f'; 
buf[1] = buf[2] = 'o'; 
buf[3] = '\0'; 
res = std::unique_ptr<const char[]>(const_cast<const char*>(buf.release())); 

간단하게하지 않는 것 이동하는 것은 아마도 다른 Deleter가 유형에, 일 : 여기

는 지금까지이 최고입니다. 심지어 에서 const char로 명시된 캐스트를 생략해도 작동하지 않습니다. Should `unique_ptr< T const [] >` accept a `T*` constructor argument?

위에서 설명한 내용을 달성하기 위해 더 나은 관용구가 있습니까? 내 코드는 꽤 어색하고 오히려 길어 보였습니다. 처음에는 개념이 얼마나 간단하게 들리는 지 고려했습니다.

+0

단지'고해상도 = 표준 : : 이동 (BUF) 사용은,'나를 위해 잘 컴파일 VS2010 및 VS2012 및 Clang 트렁크 (libC++ 트렁크 포함). 그래도 GCC 4.7.2 초크. – Xeo

+1

GCC 4.8 트렁크가 문제를 고쳤으며,'res = std :: move (buf)'도 사용할 수 있습니다. 그렇지 않으면, 나는 당신이이 던지기 물건을 다룰 수 있다고 생각하지 않는다. 'res.reset (const_cast (buf.release()));'로 줄을 단축 할 수있다. – Xeo

+0

@Xeo, GCC 4.8에 대한 정보와'reset '을 사용한 더 짧은 관용구는 매우 가치가 있습니다. 답으로 게시하십시오. – MvG

답변

6

VS2010 및 VS2012의 stdlib를 사용하면 res = std::move(buf)을 확장명으로 사용하고 DR2118에 대한 응답으로 변환 할 수 있습니다. libC++와 GCC 4.8의 libstdC++도 같습니다. GCC 4.7에 대한

, 당신은 const_cast 극복하지 않지만이어야 당신이 다소 줄 단축 할 수 있습니다

res.reset(const_cast<char const*>(buf.release())); 
관련 문제