c++ - 从临时流中提取字符时出现 GCC 编译器错误

标签 c++ compiler-errors g++ stringstream

我正在尝试从流中读取单个字符。使用以下代码,我得到一个“模糊重载”编译器错误(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 编译无误
  • 其他类型(intdouble)都可以用
  • 如果我首先创建一个变量 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/

相关文章:

c++ - 检查二进制数在特定位置是否有 '0' 或 '1'

c++ - 用 O(log(n+m)) 最坏情况合并两个排序数组

c++ - g++命令中 ".map"文件有什么用?

c++ - 在 "thin"64 位 DLL 包装器中包装 32 位 COM shell 扩展

python - 在 python 中线程化 c++ 程序

java - 为什么我会收到此错误 'illegal start of type' ?

groovy - 可以直接引用使用@Builder 声明的构建器类吗?

java - 创建具有数组返回类型的函数时出错

使用 "string"时出现 C++ 链接错误

c++ - 生成文件 - 错误 : file truncated