2013-07-12 74 views
3

我正在使用GCC编译器试验C++ 11的功能。我发现下面的代码不能编译,我不知道为什么。我期待name的类型会自动从初始化值中推导出来。为什么不能使用自动声明的变量?

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

产生的错误是:

cannot bind 'std::istream {aka std::basic_istream}' lvalue to 'std::basic_istream&&'| c:\program files\codeblocks\mingw\bin..\lib\gcc\mingw32\4.7.1\include\c++\istream|866|error: initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&&, _Tp&) [with _CharT = char; _Traits = std::char_traits; _Tp = const char*]'|

究竟是什么意思?

请注意,如果您明确指定name作为string,则不存在任何问题。

+4

'name'是'为const char [1]'。你不能''那个。 – chris

+2

尝试用'auto name = std :: string(“”)'。较长的回答:正如chris(和你的编译器)所说的,'auto'似乎是解析为一个'const'变量('_Tp = const char *]'),你不能'cin >>到那个。 – Nbr44

+1

@ Nbr44,除了'std :: string name;'变得更加明智:)重点是尝试'auto',不过,所以... – chris

回答

4

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

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

你的代码可以做出许多不同的方式工作,这里是一个有一定道理:

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

cin >> name; 
+0

或'auto name = std :: string();' – 0x499602D2

+0

是的,这是在评论中提出的。 –

+0

@MatsPetersson为什么自动?当你提供的数据类型? – UnKnown

0

这可能是对你有用,

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

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

return 0; 
} 
+0

我不认为OP想要代码,我想他想要一个解释... – PlasmaHH

+0

这已经解释,所以我没有写一个代码.... –

相关问题