преобразование из 'size_t' в 'rapidjson::SizeType'

У меня есть этот пример кода С++:

void test()
{
    rapidjson::Document doc;
    doc.SetObject();

    const std::string source = "The quick brown fox jumps over the lazy dog";   
    rapidjson::Value source_val;
    source_val.SetString( source.c_str(), source.length(), doc.GetAllocator() );        
}

И во время компиляции на платформе x64 я получаю это предупреждение:

предупреждение C4267: «аргумент»: преобразование из size_t в rapidjson::SizeType, возможная потеря данных

Как я могу правильно преобразовать длину строки (size_t) в Rapidjson SizeType?


person mtb    schedule 09.05.2016    source источник


Ответы (2)


Согласно документации:

RapidJSON использует 32-битные индексы массива/строки даже на 64-битных платформах вместо использования size_t. Пользователи могут переопределить SizeType, определив RAPIDJSON_NO_SIZETYPEDEFINE.

person uh oh somebody needs a pupper    schedule 09.05.2016

Как я могу правильно преобразовать длину строки (size_t) в Rapidjson SizeType?

Неявное преобразование, которое вы уже используете, является правильным способом преобразования из size_t в rapidjson::SizeType.

Предупреждение не обязательно означает, что ваша программа неверна.

В этом случае он просто предупреждает, что rapidjson::SizeType не может представлять все значения, представляемые size_t. Поэтому, если вы попытаетесь использовать более длинную строку, чем может быть представлено rapidjson::SizeType, вы получите неожиданное поведение.

Если вы хотите поддерживать такие строки, вы должны переопределить rapidjson::SizeType, как описано в документации в другом ответе.

можно ли избавиться от этого предупреждения?

Явное приведение типов обычно убеждает компилятор в том, что вы не выполнили преобразование случайно: static_cast<rapidjson::SizeType>(source.length())

person eerorika    schedule 09.05.2016
comment
Я знаю, что предупреждение не является ошибкой, но можно ли избавиться от этого предупреждения? - person mtb; 09.05.2016
comment
Да, static_cast — это решение, но я считаю документацию Rapidjson по определению RAPIDJSON_NO_SIZETYPEDEFINE более элегантной. Спасибо за ваш ответ. - person mtb; 09.05.2016
comment
Просто помните, что на самом деле использование таких длинных строк сделает xml неразборчивым в 32-битных системах. - person eerorika; 09.05.2016