3

GCC コンパイラを使用して C++11 の機能を試しています。次のコードがコンパイルされないことがわかりましたが、その理由はわかりません。nameの型が初期化値から自動的に推定されることを期待していました。

int main()
{
    auto name = "";
    cin >> name; // compile error occurs here
    cout << "Hello " << name << endl;
    return 0;
}

生成されるエラーは次のとおりです。

'std::istream {aka std::basic_istream}' 左辺値を 'std::basic_istream&&' にバインドできません | c:\program files\codeblocks\mingw\bin..\lib\gcc\mingw32\4.7.1\include\c++\istream|866|エラー: 'std::basic_istream<_CharT, _Traits>& std の引数 1 を初期化しています::operator>>(std::basic_istream<_CharT, _Traits>&&, _Tp&) [with _CharT = char; _Traits = std::char_traits; _Tp = const char*]'|

これは正確にはどういう意味ですか?

明示的に a として指定nameしてstringも問題ないことに注意してください。

4

2 に答える 2

4

auto変数に「書き込む」ことができない理由は、それがconst char *orconst char [1]であるためです。これは、文字列定数の型であるためです。

ポイントはauto、割り当てのタイプに対して「機能する」最も単純なタイプに解決することです。コンパイラは「変数で何をしているかを楽しみにしています」のではないので、後でこの変数に書き込み、それを使用して文字列を格納する必要があることを理解していないため、std::stringより理にかなっています。

コードはさまざまな方法で機能させることができます。

std::string default_name = "";
auto name = default_name;

cin >> name;
于 2013-07-12T10:05:46.870 に答える