Я знаю, что в C ++ 03 технически шаблон std::basic_string
не обязательно должен иметь непрерывную память. Тем не менее, мне любопытно, сколько существует реализаций для современных компиляторов, которые фактически используют эту свободу. Например, если кто-то хочет использовать basic_string
для получения результатов некоторого C API (как в примере ниже), кажется глупым выделять вектор, чтобы сразу превратить его в строку.
Пример:
DWORD valueLength = 0;
DWORD type;
LONG errorCheck = RegQueryValueExW(
hWin32,
value.c_str(),
NULL,
&type,
NULL,
&valueLength);
if (errorCheck != ERROR_SUCCESS)
WindowsApiException::Throw(errorCheck);
else if (valueLength == 0)
return std::wstring();
std::wstring buffer;
do
{
buffer.resize(valueLength/sizeof(wchar_t));
errorCheck = RegQueryValueExW(
hWin32,
value.c_str(),
NULL,
&type,
&buffer[0],
&valueLength);
} while (errorCheck == ERROR_MORE_DATA);
if (errorCheck != ERROR_SUCCESS)
WindowsApiException::Throw(errorCheck);
return buffer;
Я знаю, что подобный код может немного уменьшить переносимость, поскольку подразумевает, что std::wstring
является смежным, но мне интересно, насколько непереносимым является этот код. Другими словами, как компиляторы могут на самом деле воспользоваться свободой, которую дает несмежная память?
РЕДАКТИРОВАТЬ: Я обновил этот вопрос, чтобы упомянуть C ++ 03. Читатели должны заметить, что при нацеливании на C ++ 11 стандарт теперь требует, чтобы basic_string
был смежным, поэтому вышеупомянутый вопрос не является проблемой при нацеливании на этот стандарт.