Я бы использовал вектор. В ответ на ваше заявление о том, что вы выбрали плохой пример, на мгновение представьте, что у нас нет разумной постоянной верхней границы длины строки. Тогда это не так просто:
#include <string>
#include <vector>
#include <windows.h>
using std::wstring;
using std::vector;
wstring getComputerName()
{
DWORD size = 1; // or a bigger number if you like
vector<wchar_t> buffer(size);
while ((GetComputerNameW(&buffer[0], &size) == 0))
{
if (GetLastError() != ERROR_BUFFER_OVERFLOW) aargh(); // handle error
buffer.resize(++size);
};
return wstring(&buffer[0], size);
}
На практике вы, вероятно, можете сойти с рук, записав в строку, но я не совсем уверен. Вам, безусловно, нужны дополнительные гарантии, сделанные вашей реализацией std::wstring
, выходящие за рамки стандарта, но я ожидаю, что строки MSVC, вероятно, в порядке.
Я думаю, что если wstring::reference
равно wchar_t&
, то вы отсортированы. 21.3.4 определяет, что неконстантный operator[]
возвращает reference
и что он возвращает data()[pos]
. Так что, если reference
является простым wchar_t&
, тогда нет возможности для захватывающего поведения копирования при записи через ссылку, и строка должна фактически быть модифицируемой через указатель &buffer[0]
. Я думаю. Основная проблема здесь заключается в том, что стандарт допускает реализации более гибкие, чем оказалось необходимо.
Хотя это много усилий и комментариев, просто чтобы избежать копирования строки, поэтому я никогда не чувствовал необходимости избегать промежуточного массива / вектора.