Какая идиома лучше всего подходит для перемещения unique_ptr<char[]>
в 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()));
Простое перемещение не работает, вероятно, из-за разных типов удаления. Даже пропуск явного приведения от char
к const char
не работает, как обсуждалось в Если `unique_ptr‹ T const [] ›` принимает `T *` аргумент конструктора?
Есть ли лучшая идиома для достижения того, что я изложил выше? Мой код выглядит довольно неуклюжим и довольно длинным, учитывая, насколько простой концепция звучит на первый взгляд.
res = std::move(buf);
отлично компилируется для меня в VS2010 и VS2012 и стволе Clang (с стволом libc++). Однако GCC 4.7.2 задыхается от этого. - person Xeo   schedule 14.02.2013res = std::move(buf)
там. В противном случае, я не думаю, что вы сможете обойти эту штуку с актерами. Однако вы можете сократить строку доres.reset(const_cast<char const*>(buf.release()));
. - person Xeo   schedule 14.02.2013reset
очень ценны. Пожалуйста, опубликуйте их как ответ. - person MvG   schedule 14.02.2013std::string
. Просто не копируйте его, и он будет двигаться нормально. - person Nicol Bolas   schedule 14.02.2013std::exception::what()
, которое должно бытьconst char*
. Я проделал большую часть работы надstd::string
, поэтомуbuf
— это массив символов, которому я назначаю, аres
— это элемент, который я использую для сохранения результата до тех пор, пока само исключение не будет собрано. Думаю, вместо этого я мог бы вернуть результатstd::string::c_str()
. Однако невозможно заставить класс не манипулировать этой строкой, поскольку нетstd::string
, которому можно было бы присвоить, но нельзя изменить на месте. Что делает всю мою проблему здесь неприменимой. - person MvG   schedule 14.02.2013