2012-01-25 7 views
9

ストリームから1文字を読み込もうとしています。次のコードでは、 "あいまいなオーバーロード"コンパイラエラー(GCC 4.3.2、and 4.3.4)が発生します。私は間違っているの?一時的なストリームから文字を抽出するときのGCCコンパイラエラー

#include <iostream> 
#include <sstream> 

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

備考:2008はエラーなしでコンパイル

  • のVisual Studio
  • 他のタイプの作業している(intdouble
  • 私は最初の変数std::istringstream iss("a"); iss >> cを作成した場合、コンパイラはエラーを与えない
+0

実際には、3番目の箇条書きでは、最終的には一時変数を作成していません。 –

+0

@LightnessRacesinOrbit:ありがとう、私は最後の点を修正しました。 –

答えて

9

抽出操作または文字の>>は非メンバ関数テンプレートです:

template<class charT, class traits> 
    basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&); 

これは非const参照によりその最初の引数を取るので、あなたがそこに一時的右辺値を使用することはできません。したがって、このオーバーロードを選択することはできません。さまざまなメンバ関数のオーバーロードしか使用できません。

コードはの値を最初の引数として取る抽出演算子もあるため、C++ 11では有効です。

のVisual Studio 2008は、エラー

せずにコンパイルすることコンパイラの多くの非標準の拡張機能の一つは、一時的な右辺値にconst参照を非にバインドするをできるようにすることです。

他のタイプ(intdouble)の基本的なタイプのために働いて

ほとんど抽出演算子はが一時的右辺値を呼び出すことができるメンバ関数、されています。

私は最初の変数std::istringstream iss("a"); iss >> cを作成した場合、コンパイラはエラーを与えない

issは、非一時的左辺値あるので、それは非const参照にバインドすることができます。

+0

ビジュアルスタジオには、rvalueをnon-const lvalue refにバインドできる拡張機能がありますが、その拡張機能はVSで警告します。これはAskerが無視するものです。とにかくそのような素敵な答えのために+1: –

+0

@ Mr.Anubis:私はこのプログラムの警告を取得しません。私は 'std :: istringstream&ss = std :: istringstream(" a ");'どちらでも警告が出ません –

+0

@ Mr.Anubis:あなたのコメントの後、私は再び警告なしでそれをコンパイルしました!しかし、警告レベルを '/ W3'(デフォルトと思われる)から'/W4'に変更した後、私はそのような警告を受け取りました。 –

4

charを読み取るoperator>>の署名は、言語の規則によれば

template<class charT, class traits> 
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>& in,charT& c); 

で、一時的に非const参照に結合することができない一時的なように、第1パラメータにバインドすることはできません。

Visual Studio 2008では、これをMSエクステンションとして使用できます。それ以降のバージョンでは許可されていないことを警告します。

関連する問題