Я бы предположил, что последние две строки в этом коде должны компилироваться.Может ли std :: string :: c_str() использоваться всякий раз, когда ожидается строковый литерал?
#include "rapidjson/document.h"
int main(){
using namespace rapidjson ;
using namespace std ;
Document doc ;
Value obj(kObjectType) ;
obj.AddMember("key", "value", doc.GetAllocator()) ; //this compiles fine
obj.AddMember("key", string("value").c_str(), doc.GetAllocator()) ; //this does not compile!
}
Мое предположение было бы неправильным. Одна строка компилируется, а другая - нет.
Метод AddMember
имеет несколько вариантов, как задокументировано here, но помимо этого ... почему возврат .c_str()
не эквивалентен строковому литералу?
Насколько я понял, где бы ни был принят литерал строки, вы можете пройти string::c_str()
, и он должен работать.
PS: Я компиляции с VC++ 2010.
EDIT:
Отсутствие #include <string>
не проблема. Он уже включен document.h
Это ошибка:
error C2664: 'rapidjson::GenericValue<Encoding> &rapidjson::GenericValue<Encoding>::AddMember(rapidjson::GenericValue<Encoding> &,rapidjson::GenericValue<Encoding> &,Allocator &)'
: cannot convert parameter 1 from 'const char [4]' to 'rapidjson::GenericValue<Encoding> &'
with
[
Encoding=rapidjson::UTF8<>,
Allocator=rapidjson::MemoryPoolAllocator<>
]
and
[
Encoding=rapidjson::UTF8<>
]
EDIT2:
Просьба игнорировать тот факт, что .c_str()
называется на временной стоимости. Этот пример предназначен только для отображения ошибки компиляции. Фактический код использует строковую переменную.
EDIT3:
Альтернативный вариант кода:
string str("value") ;
obj.AddMember("key", "value", doc.GetAllocator()) ; //compiles
obj.AddMember("key", str, doc.GetAllocator()) ; // does not compile
obj.AddMember("key", str.c_str(), doc.GetAllocator()) ; // does not compile
Включите ''? Кроме того, 'main()' всегда возвращает 'int'. –
Строковый литерал имеет тип массива, а 'c_str()' возвращает указатель. Возможно иметь функциональные перегрузки, которые могут отличить друг от друга (но довольно недружелюбно заставить их вести себя по-разному). –
Время жизни 'string (" value "). C_str()' очень ограничено. поэтому, если не будет выполнена копия 'const char *', у вас может быть висящий указатель. – Jarod42