命名空间
变体
操作

std::basic_stringbuf<CharT,Traits,Allocator>::str

来自 cppreference.com
< cpp‎ | io‎ | basic stringbuf
 
 
 
 
(1)
std::basic_string<CharT, Traits, Allocator> str() const;
(直到 C++20)
std::basic_string<CharT, Traits, Allocator> str() const&;
(自 C++20 起)
template<class SAlloc>
std::basic_string<CharT, Traits, SAlloc> str( const SAlloc& a ) const;
(2) (自 C++20 起)
std::basic_string<CharT, Traits, Allocator> str() &&;
(3) (自 C++20 起)
void str( const std::basic_string<CharT, Traits, Allocator>& s );
(4)
template<class SAlloc>
void str( const std::basic_string<CharT, Traits, SAlloc>& s );
(5) (自 C++20 起)
void str( std::basic_string<CharT, Traits, Allocator>&& s );
(6) (自 C++20 起)
template< class StringViewLike >
void str( const StringViewLike& t );
(7) (自 C++26 起)

获取和设置底层字符串。

在下面的描述中,bufmode仅供说明的数据成员*this

1) 创建并返回一个 std::basic_string 对象,其中包含该 std::basic_stringbuf 的底层字符序列的副本。对于仅输入流,返回的字符串包含来自范围 [eback()egptr()) 的字符。对于输入/输出或仅输出流,包含从 pbase() 到序列中最后一个字符的字符,无论 egptr()epptr() 为何值。
为提高效率,为写入打开的缓冲区中的成员字符序列可以被过度分配。在这种情况下,只返回已初始化的字符:这些字符是从构造函数的字符串参数、最近一次对 str() 的设置器重载的字符串参数或从写入操作中获得的。一个使用过度分配的典型实现会维护一个高水位指针来跟踪缓冲区已初始化部分的末尾,此重载返回从 pbase() 到高水位指针的字符。
等效于 return std::basic_string<CharT, Traits, Allocator>(view(), get_allocator());.
(自 C++20 起)
2)(1) 相同,只是 a 用于构造返回的 std::basic_string。等效于 return std::basic_string<CharT, Traits, SAlloc>(view(), a);.
此重载仅在 SAlloc 满足 Allocator 要求时参与重载解析。
3) 创建一个 std::basic_string 对象,如同通过从 *this 的底层字符序列在 buf 中移动构造它一样。buf 可能需要首先调整为包含与 (1) 中相同的内容。之后,将 buf 设置为空并调用 init_buf_ptrs(),然后返回 std::basic_string 对象。
4) 使用 buf = s 替换底层字符序列,然后调用 init_buf_ptrs()
5)(4) 相同,只是 s 的分配器类型不是 Allocator
此重载仅在 std::is_same_v<SAlloc, Allocator>false 时参与重载解析。
6) 使用 buf = std::move(s) 替换底层字符序列,然后调用 init_buf_ptrs()
7) 隐式地将 t 转换为字符串视图 sv,如同通过 std::basic_string_view<CharT, Traits> sv = t; 一样,然后使用 buf = sv 替换底层字符序列,然后调用 init_buf_ptrs()
此重载仅在 std::is_convertible_v<const StringViewLike&,
                      std::basic_string_view<CharT, Traits>>
true 时参与重载解析。

内容

[编辑] 参数

s - 一个包含替换字符序列的 std::basic_string 对象
t - 一个对象(可转换为 std::basic_string_view)包含替换字符序列
a - 用于返回的 std::basic_string 的所有内存分配的分配器

[编辑] 返回值

1-3) 一个包含此缓冲区的基础字符序列的 std::basic_string 对象。
4-7) (无)

[编辑] 注释

此函数通常通过 std::basic_istringstream::str()std::basic_ostringstream::str()std::basic_stringstream::str() 访问。

功能测试 Std 功能
__cpp_lib_sstream_from_string_view 202306L (C++26) 使用 std::string_view 交互字符串流

[编辑] 示例

#include <iostream>
#include <sstream>
 
int main()
{
    int n;
 
    std::istringstream in;  // could also use in("1 2")
    in.rdbuf()->str("1 2"); // set the get area
    in >> n;
    std::cout << "after reading the first int from \"1 2\", the int is " 
              << n << ", str() = \"" << in.rdbuf()->str() << "\"\n"; // or in.str()
 
    std::ostringstream out("1 2");
    out << 3;
    std::cout << "after writing the int '3' to output stream \"1 2\""
              << ", str() = \"" << out.str() << "\"\n";
 
    std::ostringstream ate("1 2", std::ios_base::ate); // C++11
    ate << 3;
    std::cout << "after writing the int '3' to append stream \"1 2\""
              << ", str() = \"" << ate.str() << "\"\n";
}

输出

after reading the first int from "1 2", the int is 1, str() = "1 2"
after writing the int '3' to output stream "1 2", str() = "3 2"
after writing the int '3' to append stream "1 2", str() = "1 23"

[编辑] 缺陷报告

以下行为更改的缺陷报告被追溯应用于以前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 432 C++98 1. 重载 (1) 没有指定内容
基础字符序列
2. 重载 (4) 没有指定如何
输入和输出序列初始化
两者都指定
LWG 562 C++98 重载 (4) 设置 epptr() 指向最后一个基础字符之后
字符如果 bool(mode & std::ios_base::out) == true
epptr() 可以设置
超过该位置

[编辑] 另请参见

获取或设置底层字符串设备对象的內容
(std::basic_stringstream<CharT,Traits,Allocator> 的公共成员函数) [编辑]
(C++20)
获取底层字符序列的视图
(公共成员函数) [编辑]