C++ 从临时流提取字符时发生GCC编译器错误

C++ 从临时流提取字符时发生GCC编译器错误,c++,compiler-errors,g++,stringstream,C++,Compiler Errors,G++,Stringstream,我正在尝试从流中读取单个字符。使用下面的代码,我得到一个不明确的重载编译器错误GCC4.3.2。我做错了什么 #include <iostream> #include <sstream> int main() { char c; std::istringstream("a") >> c; return 0; } 备注: VisualStudio2008编译时没有错误 其他类型int、double正在工作 如果我首先创建一个变量std

我正在尝试从流中读取单个字符。使用下面的代码,我得到一个不明确的重载编译器错误GCC4.3.2。我做错了什么

#include <iostream>
#include <sstream>

int main()
{
    char c;
    std::istringstream("a") >> c;
    return 0;
}
备注:

VisualStudio2008编译时没有错误 其他类型int、double正在工作 如果我首先创建一个变量std::istringstream issa;iss>>c,编译器不会给出错误 字符的提取运算符>>是非成员函数模板:

template<class charT, class traits>
  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
因为它通过非常量引用获取第一个参数,所以不能在那里使用临时右值。因此,您的代码不能选择此重载,只能选择各种成员函数重载,这些重载都与此用法不匹配

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

VisualStudio2008编译时没有错误

该编译器的许多非标准扩展之一是允许将临时右值绑定到非常量引用

其他类型int、double正在工作

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

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

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

运算符>>读取字符的签名是

根据语言规则,临时变量不能绑定到第一个参数,就像临时变量不能绑定到非常量引用一样


VisualStudio2008允许将其作为MS扩展。以后的版本会警告您这是不允许的。

实际上,在您的第三个要点中,您最终没有创建临时变量。@LightnessRacesinOrbit:谢谢,我更正了最后一点。我记得visual studio有一个扩展,可以将右值绑定到非常量左值ref,但这个扩展在VS中给出了警告,我猜被询问者忽略了。不管怎样,这么好的回答+1:@Mr.Anubis:我没有收到这个程序的警告。我没有收到std::istringstream&ss=std::istringstreama的警告;either@Mr.Anubis:在你的评论之后,我再次编译了它,没有任何警告!但是在将警告级别从/W3(似乎是默认值)更改为/W4之后,我收到了这样一个警告。@ChristianAmmer:Okie doke。真可惜。愚蠢的MSVC。该代码应该在最低级别发出警告@轻快竞赛:这取决于你是否喜欢学究而不是实用主义。代码是有效的,只是不可移植。我想存在一个特定的便携式开关,相当于-pedantic,可以诊断这些情况。
template<class charT, class traits>
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>& in,charT& c);