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 = 常量字符*]'|

这到底是什么意思?

请注意,如果您明确指定name为 astring则没有问题。

4

2 回答 2

4

您不能“写入”auto变量的原因是它是 a const char *or const char [1],因为这是任何字符串常量的类型。

的重点auto是解决最简单的可能类型,该类型对分配类型“有效”。编译器不会“期待看到你对变量做了什么”,所以它不明白稍后你会想要写入这个变量,并用它来存储一个字符串,所以std::string会更有意义。

可以使您的代码以多种不同的方式工作,这是一种有意义的方式:

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

cin >> name;
于 2013-07-12T10:05:46.870 回答
0

这可能对你有用,

string getname()
{
  string str;
  cin>>str;
  return str;
}

int main()
{
    auto name = getname();
    cout << "Hello " << name << endl;

return 0;
}
于 2013-07-12T09:54:31.293 回答