您可以简单地使用&s[0]
作为非空字符串。这给你一个指针到缓冲区
当你用它来放的ň人物那里string
的长度(不仅仅是容量)必须至少ň事先字符串的开始,因为没有破坏数据就无法调整它。
即,使用可以是这样的:
auto foo(int const n)
-> string
{
if(n <= 0) { return ""; }
string result(n, '#'); // # is an arbitrary fill character.
int const n_stored = some_api_function(&result[0], n);
assert(n_stored <= n);
result.resize(n_stored);
return result;
}
因为C++ 11这种做法已正式工作。在此之前,在C++ 98和C++ 03中,缓冲区没有正式保证是连续的。然而,实际上这种方法自从C++ 98开始工作以来,第一个标准是可以在C++ 11中采用连续缓冲区要求的原因(在利勒哈默会议中增加了它,我认为这是2005年)是没有现成的标准库实现与非连续的字符串缓冲区。
关于
” C++ 17加入添加非const data()
到std::string
但它仍然说,你不能修改缓冲区。
我不知道有任何这样的措辞,因为这将打败非const的目的data()
我怀疑这种说法是正确的。
关于
”现在我计划的信息,并复制该缓冲区大量的工作将有一个显着的影响,我想避免它。
如果复制缓冲区有明显的影响,那么您应该避免无意中复制std::string
。
一种方法是将其包装在不可复制的类中。
“* C++ 17在'std :: string'中添加了非const的data()',但它仍然表示不能修改缓冲区。它在哪里说呢?在访问'&std [0]''&str.font()'之前访问 – ildjarn
,...确保有内存,_ie_表示'str.size()> 0'。如果你只是实例化'str',使用'str.resize()' – Garf365
@ildjam看起来我完全误解了那篇论文。 '.data()'应该可以工作。 – Lyberta