从临时流中提取char时GCC编译器错误

Chr*_*mer 9 c++ compiler-errors g++ stringstream

我正在尝试从流中读取单个字符.使用以下代码,我得到一个"模糊过载"编译器错误(GCC 4.3.2 和4.3.4).我做错了什么?

#include <iostream>
#include <sstream>

int main()
{
    char c;
    std::istringstream("a") >> c;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

备注:

  • Visual Studio 2008编译时没有错误
  • 其他类型(int,double)正在工作
  • 如果我首先创建一个变量std::istringstream iss("a"); iss >> c,编译器不会给出错误

Mik*_*our 9

>>字符的提取运算符是非成员函数模板:

template<class charT, class traits>
  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
Run Code Online (Sandbox Code Playgroud)

由于这是通过非const引用获取其第一个参数,因此您不能在那里使用临时rvalue.因此,您的代码无法选择此重载,只有各种成员函数重载,其中没有一个匹配此用法.

您的代码在C++ 11中有效,因为还有一个提取运算符将右值引用作为第一个参数.

Visual Studio 2008编译时没有错误

该编译器的许多非标准扩展之一是允许临时rvalues绑定到非const引用.

其他类型(int,double)正在工作

基本类型的大多数提取运算符都是成员函数,可以在临时右值上调用.

如果我首先创建一个变量std::istringstream iss("a"); iss >> c,编译器不会给出错误

iss是一个非临时左值,因此它可以绑定到非const引用.