Qt5:QSharedPointer <const t =“”> :: create()时编译错误

时间:2018-05-16 07:08:03

标签: qt shared-ptr

QSharedPointer :: create()是否“预期”无法工作或是否为错误?我收到一个错误:

/usr/include/qt5/QtCore/qsharedpointer_impl.h:439:9: error: 
invalid conversion from ‘const void*’ to ‘void*’ [-fpermissive]
new (result.data()) T(std::forward<Args>(arguments)...);

从原始const指针工作中从非对象共享指针和构造函数进行转换。

我为Qt5.7.0和Qt5.10.0得到了这个。

这是一个最小的例子:

#include <QSharedPointer>

struct A {};

int main(int argc, char *argv[])
{
    auto ca = QSharedPointer<const A>::create();
    return 0;
}

这是一个文件(不是最小的)示例,但工作案例很少,2个不工作和调试。注释定义用于“不编译”部分。

#include <QSharedPointer>
#include <QDebug>

#define FROM_PTR
//#define CONST_CREATE
#define FROM_RAW_PTR
#define PERFECT_FORWARD_CREATE
//#define PERFECT_FORWARD_CREATE_CONST
#define BUILTIN_CAST


class A
{
public:
    A() = default;
    A(int i) : _i{i} {}
    void foo() const { qDebug() << "const foo" << _i; }
    void foo() {  qDebug() << "foo" << ++_i; }

private:
    int _i{0};

};

using ASPtr = QSharedPointer<A>;
using ASCPtr = QSharedPointer<const A>;


int main(int argc, char *argv[])
{
    Q_UNUSED(argc)
    Q_UNUSED(argv)

#ifdef FROM_PTR
    qDebug() << "FROM_PTR";
    auto a1 = ASPtr::create();
    a1->foo();

    auto ca1 = static_cast<ASCPtr>(a1);
    ca1->foo();
    qDebug() << "\n";
#endif // FROM_PTR


#ifdef CONST_CREATE
    qDebug() << "CONST_CREATE";
    auto ca2 = ASCPtr::create();
    ca2->foo();
    qDebug() << "\n";
#endif // CONST_CREATE


#ifdef FROM_RAW_PTR
    qDebug() << "FROM_RAW_PTR";
    auto ca3 = ASCPtr(new const A);
    ca3->foo();
    qDebug() << "\n";
#endif // FROM_RAW_PTR


#ifdef PERFECT_FORWARD_CREATE
    qDebug() << "PERFECT_FORWARD_CREATE";
    auto a2 = ASPtr::create(10);
    a2->foo();
    qDebug() << "\n";
#endif //  PERFECT_FORWARD_CREATE


#ifdef PERFECT_FORWARD_CREATE_CONST
    qDebug() << "PERFECT_FORWARD_CREATE_CONST";
    auto ca4 = ASCPtr::create(20);
    ca4->foo();
    qDebug() << "\n";
#endif //  PERFECT_FORWARD_CREATE


#ifdef BUILTIN_CAST
    qDebug() << "BUILTIN_CAST";
    QSharedPointer<A> a3 = ASPtr::create();
    a3->foo();

    auto ca4 = a3.constCast<const A>();
    ca4->foo();
    qDebug() << "\n";
#endif // BUILTIN_CAST


    return 0;
}

1 个答案:

答案 0 :(得分:3)

这是一个已知的Qt错误(QTBUG-49748)。虽然它在Qt 5.6.0中被标记为已解决,但错误仍然存​​在,如评论中所指出的那样。

为什么会这样?

查看类QSharedPointer qsharedpointer_impl.h的实现。

特别是这一行:

new (result.data()) T(std::forward<Args>(arguments)...);

使用result.data()作为新表达式 placement params 。不幸的是,可以使用const指针作为展示位置参数(有关详细信息,请参阅此处的this问题)。

因此,除了通过官方错误跟踪器向Qt开发人员报告此内容之外,您无能为力。

如果您没有被迫使用Qt,那么您可以查看标准库提供的智能指针(例如 std :: shared_ptr )。

更新

正如Qt错误跟踪器中所报告的那样, 5.11 here是相关提交)中的已修复错误。基本上,他们使用 std :: remove_cv 从指定的类型中删除最顶层的const。