Во-первых, строковые литералы имеют тип char const[N]
(для подходящей константы N
). Этот массив можно присвоить char const*
, и в этом случае он превратится в указатель на первый элемент. Его нельзя преобразовать в char*
. До C++11 преобразование в char*
разрешалось иметь дело с существующим кодом, который не был const
-правильным (например, потому что он начинался как код C до того, как C получил const
). Это преобразование было удалено для C++11.
Вопрос в том, чего вы на самом деле пытаетесь достичь: строковые литералы неизменяемы и сохраняются в течение всего времени жизни программы. Вы можете просто хранить столько указателей на них, сколько хотите, и нет смысла перемещать указатели, поскольку их копировать совсем дешево.
В своем вопросе вы указываете, что хотите создать конструктор перемещения, но конструкторы перемещения берут ссылку rvalue на класс, для которого они предназначены, например, это будет конструктор перемещения для вашего класса:
CTextBlock::CTextBlock(CTextBlock&& other)
: pText(other.pText) {
other.pText = 0;
}
(ваш класс не показывает никакой семантики владения для указателя pText
, и в этом случае конструкция перемещения не имеет большого смысла; приведенный выше код предполагает, что существует некоторая семантика владения и что нулевой указатель указывает, что объект не владеет что-либо).
Тот факт, что аргумент ограничен ссылкой на rvalue, не означает, что функция является конструктором перемещения. Все, что это подразумевает, это то, что аргумент является значением r, и можно разумно предположить, что его текущее представление не нужно сохранять. Строковый литерал выглядит как rvalue, потому что строковый литерал преобразуется в [временный] указатель на начало массива.
person
Dietmar Kühl
schedule
11.04.2015
CTextBlock&&
. Я вообще не вижу смысла в ссылке на rvalue. У вас есть проблема с попыткой указать на постоянные данные с помощью указателя на непостоянные данные. - person chris   schedule 12.04.2015template<size_t N>CTextBlock(char const(&&text)[N])
и используйтеstd::move
для литерала""
. Не уверен, что это сработает, но попробуйте. О, и сделайте членchar const*
:"literal"
строк постоянными данными. - person Yakk - Adam Nevraumont   schedule 12.04.2015T&&
, является конструктором перемещения. Это только в том случае, когда это конструктор ofT
!! - person Lightness Races in Orbit   schedule 12.04.2015N
объектов типаchar const
. Например, строковый литерал имеет такой тип. Почему передается ссылка на rvalue такой ссылки, я не знаю, и я действительно не думаю, что это работает: результатstd::move("foo") should be a
const` rvalue такого массива... - person Dietmar Kühl   schedule 12.04.2015char const*
, вам, вероятно, потребуется скопировать строковый литерал, поскольку символы в строковом литерале оказываютсяconst
. - person Dietmar Kühl   schedule 12.04.2015