So I'm curious, does it happen for 6.10.1? What I see is:
src/corelib/tools/qcontainerfwd.h
Code: Select all
namespace QtPrivate
{
[[maybe_unused]]
constexpr qsizetype MaxAllocSize = (std::numeric_limits<qsizetype>::max)();
}
src/corelib/tools/qarraydata.h
Code: Select all
#include <QtCore/qcontainerfwd.h>
//...
template <class T>
struct QTypedArrayData
: QArrayData
{
//...
constexpr static qsizetype maxSize() noexcept
{
// -1 to deal with the pointer one-past-the-end
return (QtPrivate::MaxAllocSize - sizeof(QtPrivate::AlignedQArrayData) - 1) / sizeof(T);
}
//...
};
src/corelib/tools/qarraydataops.h
src/corelib/tools/qarraydatapointer.h
src/corelib/tools/qlist.h
Code: Select all
#include <QtCore/qarraydatapointer.h>
//...
template <typename T>
class QList
#ifndef Q_QDOC
: public QListSpecialMethods<T>
#endif
{
using Data = QTypedArrayData<T>;
//...
using DataPointer = QArrayDataPointer<T>;
//...
DataPointer d;
public:
//...
static constexpr qsizetype maxSize() { return Data::maxSize(); }
constexpr qsizetype size() const noexcept
{
constexpr size_t MaxSize = maxSize();
Q_PRESUME(size_t(d.size) <= MaxSize);
return d.size;
//...
};
And
MaxSize's initializer looks like a constant expression to me (
QList<T>::maxSize() and
QList<T>::Data::maxSize() a.k.a.
QTypedArrayData<T>::maxSize() are constexpr member functions, sizeof expressions are constant expressions, and AFAIK
QtPrivate::MaxAllocSize is a variable usable in constant expressions)...