我正在尝试从流中读取单个字符。使用以下代码,我得到一个“模糊重载”编译器错误(GCC 4.3.2,and 4.3.4)。我做错了什么?
#include <iostream>
#include <sstream>
int main()
{
char c;
std::istringstream("a") >> c;
return 0;
}
备注:
- Visual Studio 2008 编译无误
- 其他类型(
int
、double
)都可以用 - 如果我首先创建一个变量
std::istringstream iss("a"); iss >> c
,编译器没有报错
最佳答案
字符的提取操作符>>>
是一个非成员函数模板:
template<class charT, class traits>
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
因为它的第一个参数是通过非const
引用获取的,所以您不能在那里使用临时右值。因此,你的代码不能选择这个重载,只能选择各种成员函数重载,没有一个符合这个用法。
您的代码在 C++11 中有效,因为还有一个提取运算符将 rvalue 引用作为第一个参数。
Visual Studio 2008 compiles without errors
该编译器的许多非标准扩展之一是允许临时 rvalues 绑定(bind)到非 const
引用。
Other types (
int
,double
) are working
大多数基本类型的提取运算符都是成员函数,可以在临时右值上调用。
If I first create a variable
std::istringstream iss("a"); iss >> c
, the compiler gives no error
iss
是一个非临时左值,因此它可以绑定(bind)到一个非const
引用。
关于c++ - 从临时流中提取字符时出现 GCC 编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004030/