不能使用auto来声明变量



为什么在下面的代码中我不能使用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);
}

最新更新