2009-08-31 130 views
2

这个编译:-)VS2008 C++编译器错误?

string name; 
name = 1; 

这并不:

string name = 1; 

有什么想法?

我知道这是错误的。 。 。那不是重点。第一个给笑脸。

回答

14

第一次编译是因为赋值运算符被称为“string & operator =(char c)”的一个签名,编译器可以将1转换为char。

第二个不会编译,因为它调用没有兼容签名的复制构造函数。

4

第二个例子是真正的初始化而非赋值,即它调用构造函数而不是operator=。显然,类string没有一个将整数作为参数的构造函数,但它的赋值操作符对它是可以的。而你得到笑脸的原因是它是ASCII值为1的字符。

顺便说一下,这不是特定于Visual Studio。任何C++编译器都应该以相同的方式运行。

1

与问题无关,但您为什么不(和其他人)发布可编译代码。会:

#include <string> 
using namespace std; 

int main() { 
    string name; 
    name = 1; 
    string name2 = 1; 
} 

已经太多要问?鉴于此,我们可以看到“string”实际上是指std :: string而不是一些随机类。

+0

我想如果包含没有显示,那么它被认为是标准。如果是随机课程,那么你必须展示它。此外,他很快得到了正确的答案,从而强化了行为(对所有看到它的人)。我认为这就是它成为常态的原因。 –

+3

我同意这里的很多代码示例都不够完整,但对于这样简单的事情来说更是不必要的。此外,这不应该是一个答案,而是一个评论。 – krdluzni

+2

对我来说,并不是猜测'string'是指什么,但是我必须自己编写一个可编辑的例子才能玩弄它。我非常感谢他们递交了一个现成的例子,如果我有这个问题,我更有可能更加关注这个问题。 – sbi