在处理c++代码时,我看到了以下几次类型错误:
QString str = str.toUpper();
这可能是一个相当容易犯的错误,但它编译和执行(有时会崩溃,有时不会)。我看不出在任何情况下这是你真正想做的事情。
一些测试显示调用了复制构造函数,而不是默认构造函数,并且对象本身是从复制构造函数中给定的。
谁能解释一下为什么这不是一个编译器错误,甚至一个警告?
从技术上讲,对象str
是在到达等号时定义的,因此它可以在该点使用。
错误发生在试图用自身初始化对象时,并且允许编译器对此发出警告(如果它能够检测到的话)。但是,由于不是在每种情况下都可以检测,所以不需要编译器。
例如,int x = f(x);
是完全正确的,如果int f(const int&)
不使用其参数的值。如果编译器还没有看到函数体,它怎么知道呢?
没有错误或警告,因为它相当于:
QString str;
str = str.toUpper();
一样QString str = "aaa";
与
相同QString str;
str = "aaa";
要在同一条语句中做到这一点,你需要使用构造函数,它不会编译:
QString str(str.toUpper());
就像:
QString str("aaa");
不等于
QString str;
str = "aaa";