引用您声明的相同变量

时间:2011-10-10 20:31:35

标签: c++ construction

在使用C ++代码时,我已经多次看到以下类型错误:

QString str = str.toUpper();

这可能是一个相当容易犯的错误,但它编译和执行(有时崩溃,有时没有)。我无法看到任何你想要做的事情。

一些测试表明,复制构造函数是调用的,而不是默认的,并且该对象是从复制构造函数中自己给出的。

任何人都可以解释为什么这不是编译器错误,甚至是警告?

2 个答案:

答案 0 :(得分:7)

从技术上讲,对象str是在达到等号时定义的,因此可以在此时使用。

错误在于尝试使用自身初始化对象,并允许编译器对此进行警告(如果它能够检测到它)。但是,由于在每种情况下都无法进行检测,因此不需要编译器。

例如,如果int x = f(x);不使用其参数的值,则int f(const int&)完全正确。编译器如何知道它是否还没有看到函数体呢?

答案 1 :(得分:-4)

没有错误或警告,因为它等同于:

QString str;
str = str.toUpper();

就像

一样
QString str = "aaa";

相同
QString str;
str = "aaa";

要在同一语句中执行此操作,您需要使用不能编译的构造函数:

QString str(str.toUpper());

就像:

QString str("aaa");

不等于

QString str;
str = "aaa";