废弃的成员函数:QtTypeTraits

以下 typeof <QtTypeTraits> 类的成员已被弃用。 它们提供以确保旧源代码继续工作。我们强烈建议在新的代码中避免使用它们。

函数

(自 6.6 弃用) typename std::add_const<T>::type &qAsConst(T &t)
(自 6.6 弃用) voidqAsConst(const T &&t)

函数文档

[constexpr noexcept, deprecated in 6.6] template <typename T> typename std::add_const<T>::type &qAsConst(T &t)

此函数自 6.6 起已弃用。我们强烈建议在新的代码中避免使用它。

请使用 std::as_const() 代替。

返回 tconst T 类型。

这是 Qt 对 C++17's std::as_const() 的实现,它类似于 std::move() 的转换函数。但是,由于没有保留引用,它不能有效地为右值实现,因此它不支持右值。

在 Qt 中,其主要用途是防止隐式共享的 Qt 容器解除引用

    QString s = ...;
    for (QChar ch : s) // detaches 's' (performs a deep-copy if 's' was shared)
        process(ch);
    for (QChar ch : qAsConst(s)) // ok, no detach attempt
        process(ch);

当然,在这种情况下,您(很可能)应该首先将 s 声明为 const

    const QString s = ...;
    for (QChar ch : s) // ok, no detach attempt on const objects
        process(ch);

但这通常并不容易实现。

需要注意的是,qAsConst() 不复制其参数,它只是执行 const_cast<const T>(t)

    for (QChar ch : funcReturningQString())
        process(ch); // OK, the returned object is kept alive for the loop's duration

这是设计来失败的,因为返回的引用会很快过时。因此,虽然这可以(但会断开返回的对象)

    for (QChar ch : qAsConst(funcReturningQString()))
        process(ch); // ERROR: ch is copied from deleted memory

但这项操作是无效的

为了防止这种结构编译(并在运行时失败),qAsConst() 具有一个其次、被删除的重载版本,用于绑定到右值。

此函数自 6.6 起已弃用。我们强烈建议在新的代码中避免使用它。

[deprecated in 6.6] template <typename T> void qAsConst(const T &&t)

这是一个重载函数。

    for (QChar ch : qAsConst(funcReturningQString()))
        process(ch); // ERROR: ch is copied from deleted memory

© 2024 Qt公司有限公司。本文件中包含的文档贡献者是各自版权的所有者。本文件中提供的文档是根据自由软件开发基金会发布的GNU自由文档许可版本1.3许可的。Qt及其相关标志是芬兰以及全世界其他国家的Qt公司的商标。所有其他商标均为各自所有者的财产。