在使用 C++ 代码时,我曾多次看到以下类型错误:
QString str = str.toUpper();
这可能是一个相当容易犯的错误,但它可以编译和执行(有时会崩溃,有时不会)。我看不出在任何情况下这会是你真正想做的事情。
一些测试表明复制构造函数被调用,而不是默认的,并且对象是从复制构造函数中获得的。
谁能解释为什么这不是编译器错误,甚至不是警告?
在使用 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";