# operator>>(std::basic_istream)

< cpp‎ | io‎ | basic istream

定义于头文件 `<istream>` |  |
template< class CharT, class Traits > basic_istream<CharT,Traits>& operator>>( basic_istream<CharT,Traits>& st, CharT& ch ); template< class Traits > basic_istream<char,Traits>& operator>>( basic_istream<char,Traits>& st, signed char& ch ); template< class Traits > basic_istream<char,Traits>& operator>>( basic_istream<char,Traits>& st, unsigned char& ch ); | (1) |
| (2) |
template< class CharT, class Traits> basic_istream<CharT,Traits>& operator>>( basic_istream<CharT,Traits>& st, CharT* s ); template< class Traits > basic_istream<char,Traits>& operator>>( basic_istream<char,Traits>& st, signed char* s ); template< class Traits > basic_istream<char,Traits>& operator>>( basic_istream<char,Traits>& st, unsigned char* s ); |  | (C++20 前)
template< class CharT, class Traits, std::size_t N > basic_istream<CharT,Traits>& operator>>( basic_istream<CharT,Traits>& st, CharT (&s)[N] ); template< class Traits, std::size_t N > basic_istream<char,Traits>& operator>>( basic_istream<char,Traits>& st, signed char (&s)[N] ); template< class Traits, std::size_t N > basic_istream<char,Traits>& operator>>( basic_istream<char,Traits>& st, unsigned char (&s)[N] ); |  | (C++20 起)
template< class Istream, class T > Istream&& operator>>( Istream&& st, T&& value ); | (3) | (C++11 起)

1-2) 进行字符输入操作。
1) 表现为有格式输入函数 (FormattedInputFunction) 。在构造并检查 sentry 对象，因而可能跳过前导空白符后，释出一个字符并存储之到 `ch`。若无字符可用，则设置 `failbit` （在有格式输入函数 (FormattedInputFunction) 所要求的设置 `eofbit` 外）。
2) 表现为有格式输入函数 (FormattedInputFunction) 。在构造并检查 sentry 对象，因而可能跳过前导空白后，释出相继字符，并存储它们到 `s` 指向其首元素的字符数组 (C++20 前)的相继位置。若满足下列条件之一，则释出停止：

  - 找到空白字符（以 `ctype<CharT>` 平面确定）。不释出该空白字符。

释出了 st.width() - 1 个字符（若 st.width() 大于零） | (C++20 前)
释出了 min(std::size_t(st.width()), N) - 1 个字符（若 st.width() 大于零） 否则为释出了 N - 1 个字符 | (C++20 起)

  - 输入序列中出现文件尾（也会设置 `eofbit` ）

任一情况下，存储额外的空字符值 CharT() 于输出结尾。若未释出字符，则设置 `failbit` （仍写入空字符到输出的首位置）。最后调用 st.width(0) 取消 std::setw 的效果，若存在。
3) 给定到输入流对象的右值引用，调用适合的释出运算符（等价于 st >> std::forward<T>(value) ）。此重载仅若表达式 st >> std::forward<T>(value) 为良构且 `Istream` 为公开且无歧义派生自 std::ios_base 的类类型才参与重载决议。

### 注解

释出作为流的最末字符的单个字符不会设置 `eofbit` ：这异于有格式输入函数，例如以 operator>> 释出最末的整数，但此行为匹配 std::scanf 用 "%c" 格式指定符的行为。

### 参数

st | - | 要自之释出数据的输入流
ch | - | 到要存储释出字符的字符的引用
s | - | 指针，指向 (C++20 前)要存储释出字符的字符数组

### 返回值

`st`

### 示例

    #include <iostream>
    #include <iomanip>
    #include <sstream>

    int main()
    {
        std::string input = "n greetings";
        std::istringstream stream(input);
        char c;
        const int MAX = 6;
        char cstr[MAX];

        stream >> c >> std::setw(MAX) >> cstr;
        std::cout << "c = " << c << '\n'
                  << "cstr = " << cstr << '\n';

        double f;
        std::istringstream("1.23") >> f; // 右值流释出
        std::cout << "f = " << f << '\n';
    }

输出：

    c = n
    cstr = greet
    f = 1.23

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 1203 | C++11 | 右值流的重载返回到基类的左值引用 | 返回到派生类的右值引用
LWG 2328 | C++11 | 右值流的重载要求另一参数为左值 | 使之接受右值
LWG 2534 | C++11 | 右值流的重载未被制约 | 已制约

### 参阅

operator>> | 提取带格式数据 (公开成员函数)