std::ios_base::iword
来自cppreference.com
long& iword( int index ); |
||
首先,充分地分配或重置能确保 index
是合法下标的私有存储(long 的动态数组或另一可索引数据结构),然后返回到带下标 index
的私有存储 long 元素的引用。
此 ios_base
对象上任何其他操作都可能使返回的引用失效,包含对 iword()
的另一调用,但存储的值会保持,使得以相同下标从 iword(index) 读取将产生相同值,直到下次调用 std::basic_ios::copyfmt()。值能用于任何目的。必须通过先前的 xalloc() 调用获得元素下标,否则行为未定义。新元素初始化为 0。
如果函数失败(可能由分配失败导致)并且 *this 是一个 basic_ios<>
对象或子对象的基类子对象,那么调用可能会抛出 std::ios_base::failure 的 std::basic_ios<>::setstate(badbit)。
参数
index | - | 元素的下标值 |
返回值
到该元素的引用。
异常
设置 badbit 时可能会抛出 std::ios_base::failure。
示例
运行此代码
#include <iostream> #include <string> struct Foo { static int foo_xalloc; std::string data; Foo(const std::string& s) : data(s) {} }; // 分配 Foo 对象所用的 iword 存储 int Foo::foo_xalloc = std::ios_base::xalloc(); // 如果 iword 保有 1,那么此用户定义 operator<< 会打印字符串 std::ostream& operator<<(std::ostream& os, Foo& f) { if(os.iword(Foo::foo_xalloc) == 1) return os << std::string(f.data.rbegin(), f.data.rend()); else return os << f.data; } // 此输入/输出操纵符在 0 与 1 间翻转在 iword 存储的数字 std::ios_base& rev(std::ios_base& os) { os.iword(Foo::foo_xalloc) = !os.iword(Foo::foo_xalloc); return os; } int main() { Foo f("example"); std::cout << f << '\n' << rev << f << '\n' << rev << f << '\n'; }
输出:
example elpmaxe example
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 36 | C++98 | 存储的值在返回的引用失效的情况下不一定会保持 | 存储的值在下次调用 copyfmt() 前会一直保持
|
LWG 41 | C++98 | 此函数在失败时会自己设置 badbit, 但 ios_base 没有提供这样的接口
|
由 basic_ios 设置 badbit(如果 *this 是它的基类子对象) |
参阅
在需要时重置私有存储的大小,并访问位于指定下标的 void* 元素 (公开成员函数) | |
[静态] |
返回能安全用作 pword() 和 iword() 下标的程序范围内独有的整数 (公开静态成员函数) |