错误:没有匹配函数来调用...返回语句

use*_*291 4 c++ qt initialization explicit return

我在openSUSE Leap 15上使用Qt 5.9.4上的GCC7.

我有以下课程:

class ManSuppProps : public QObject
{
    Q_OBJECT

public:
    explicit ManSuppProps(QString parentName);
    explicit ManSuppProps(){}
    explicit ManSuppProps(const ManSuppProps &manSuppProps);
    explicit ManSuppProps(ManSuppProps &manSuppProps);
    ~ManSuppProps();

private:
    QVector3D m_suppPos;
    QString m_suppParentName;

}
Run Code Online (Sandbox Code Playgroud)

通过以下构造函数的实现:

ManSuppProps::ManSuppProps(QString parentName)
    : QObject()
    , m_suppPos(QVector3D(0, 0, 0))
    , m_suppParentName(parentName)
{
    qDebug()<<"Constructing ManSuppProps object ...";
}

ManSuppProps::ManSuppProps(const ManSuppProps &manSuppProps)
    : QObject()
    , m_suppPos(manSuppProps.getSuppPos())
    , m_suppParentName(manSuppProps.getSuppParentName())
{
}

ManSuppProps::ManSuppProps(ManSuppProps &manSuppProps)
    : QObject()
    , m_suppPos(manSuppProps.getSuppPos())
    , m_suppParentName(manSuppProps.getSuppParentName())
{

}

ManSuppProps::~ManSuppProps(){}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:没有匹配函数来调用'ManSuppProps :: ManSuppProps(ManSuppProps&)'

在具有类成员的另一个类的方法中ManSuppProps:

ManSuppProps EditorScene::manSuppProps()
{
    return m_manSuppProps; // error is thrown here
}
Run Code Online (Sandbox Code Playgroud)

考虑到我有所有的构造函数,我不明白为什么会收到错误.任何人都可以帮忙.

son*_*yao 7

这是预期的行为.请注意,相应的构造函数声明explicit

explicit ManSuppProps(ManSuppProps &manSuppProps);
Run Code Online (Sandbox Code Playgroud)

return m_manSuppProps;执行复制初始化,

4)从按值返回的函数返回时

并且复制初始化不考虑explicit构造函数.

(强调我的)

如果T是一个类类型和类型的CV-不合格版本otherIS T或从派生的类T,的非显式的构造T进行检查和最佳匹配是由过载分辨率来选择.然后调用构造函数来初始化对象.

复制初始化比直接初始化更不容许:显式构造函数不转换构造函数,也不考虑复制初始化.

  • ......这就是为什么我永远不会复制并移动c'tors`explicit`,即使所有其他c'tors都是. (2认同)
  • fwiw,[C++核心指南同意](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-explicit)不要因为同样的原因将复制/移动构造函数声明为`explicit`:"_**注**复制和移动构造函数不应该是"显式的",因为它们不执行转换.显式复制/移动构造函数使得传递和返回值很难._" (2认同)