Първо, типът на низовите литерали е 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, не означава, че тази функция е конструктор на движение. Всичко, което предполага, е, че аргументът е rvalue и разумно може да се приеме, че текущото му представяне не е необходимо да се запазва. Низовият литерал изглежда е 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&&
, е конструктор за движение. Това е само случаят, когато е конструктор наT
!! - person Lightness Races in Orbit   schedule 12.04.2015N
обекти от типchar const
. Например низов литерал има този тип. Защо се предава препратка към rvalue на такъв refecens, не знам и всъщност не мисля, че работи: резултатът от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