为什么在下面的代码中我不能使用auto
关键字?我不确定这是一个与Qt相关的问题还是一个c++问题?
#include <QFile>
void foo(const QString& path) {
auto f = QFile(path); // Error: QFile is marked as deletet here
QFile file(path); // works fine!!!
}
问题不在于auto
。这是因为您隐式地使用了复制构造函数,这对于任何QObject派生类都是不允许的。如果你这样做,它也不会起作用:
QFile f = QFile(path);
在变量声明中,auto
从初始值设定项值推导类型。如果不能指定初始值设定项,则不能使用auto
。
在C++17及更高版本中,有保证的拷贝省略,因此auto f = QFile(path);
将按预期推导为QFile f = QFile(path);
,然后将其进一步优化为仅QFile f(path);
,从而消除了从path
创建临时QFile
并将其复制到f
的任何需要。
在C++17之前,这种优化是不能保证的,它可能会发生,也可能不会发生。因此,虽然auto f = QFile(path);
仍将推断为QFile f = QFile(path);
,但如果从path
创建临时QFile
,则这将不起作用,因为该临时无法复制到f
中,因为QFile
的复制构造函数是delete
'd以防止复制(请参阅为什么QObject子类不可复制(。
因此,您的编译器似乎没有执行该优化,因此出现了错误消息,因此没有机会使用auto
来声明f
,除非您的编译器至少对函数返回值实现了复制省略,或者QFile
有一个移动构造函数,例如:
#include <QFile>
QFile getQFileFromPath(const QString& path) {
return QFile(path);
}
void foo(const QString& path) {
auto f = getQFileFromPath(path);
}