Приведенные ниже исходные коды являются частью проверки членов объекта класса Document.
Мы попытались создать объект класса Value, который является «memberObject», и сохранить ссылку на объект в закрытой переменной-члене «Value».
Посмотрев на результаты, мы можем увидеть тип объекта 3 (Объект).
Однако после присвоения ссылочной переменной _value с memberObject выходные данные показывают тип, измененный на 0 (NULL).
Мы ожидаем, что такого изменения типа не должно быть.
Не могли бы вы объяснить, почему это происходит?
for (Value::MemberIterator itr = _document.MemberBegin(); itr != _document.MemberEnd(); itr++)
{
_itr = itr;
_name = itr->name.GetString();
_objectTypeID = (int)itr->value.GetType();
cout << "Member [" << _name << "] - type is [" << _objectTypeID << "]" << endl;
_typeID = _objectTypeID;
if (itr->value.IsObject())
{
Value& memberObject = _document[_name.c_str()];
cout << "Value type(1): " << memberObject.GetType() << endl;
_value = (Value&)memberObject;
cout << "Value type(2): " << memberObject.GetType() << endl;
}_st.push(_itr);
parseValue();
_itr = _st.top(); // returns the next element in the stack
_st.pop(); // removes an element from the stack
}
"firmwareSettings": {
"manageFirmware": false,
"firmwareBaselineUri": ""},
Элемент [firmwareSettings] — тип [3]
Тип значения (1): 3
Тип значения (2): 0
Такое поведение ожидается, поскольку оператор присваивания для GenericValue использует переместить семантику.
Вот оператор присваивания для GenericValue в rapidjson:
//! Assignment with move semantics.
/*! \param rhs Source of the assignment. It will become a null value after assignment.
*/
GenericValue& operator=(GenericValue& rhs) {
RAPIDJSON_ASSERT(this != &rhs);
this->~GenericValue();
memcpy(this, &rhs, sizeof(GenericValue));
rhs.flags_ = kNullFlag;
return *this;
}
когда memberObject назначен на _значение, оператор присваивает изменение flags_ member, который является значением, возвращаемым методом GetType () объекта rvalue.
Для более подробной информации о семантике перемещения, пожалуйста, смотрите Что такое семантика перемещения?
Других решений пока нет …