Hi,

Il 19/02/26 08:31, Schimkowitsch Robert ha scritto:
Hi Guiseppe,

thanks for the reply!

QT_TYPESAFE_FLAGS features prominently in the Qt documentation, see e.g 
https://doc.qt.io/qt-6/qflags.html#operator-and-eq

I think that's a mistake, as QT_TYPESAFE_FLAGS itself is never documented...

What I found confusing is that operator!() is documented, but operator bool() 
is not. Also, the implicit conversion to int is not documented (at least I 
could not find it in the above page).

That's also a mistake. Would you mind filing a QTBUG for documentation?

There is "toInt()", but then I'd have to explicitly write

if (flags.toInt())
    // something

I noticed that I can apparently static_cast flags to bool, but if I want to 
return a bool from a function, I have to use the explicit cast (which would be 
fine, if that is the way it's supposed to work).

Going back to:

#ifdef QT_TYPESAFE_FLAGS
    constexpr inline explicit operator Int() const noexcept { return i; }
    constexpr inline explicit operator bool() const noexcept { return i; }
#else
    constexpr inline Q_IMPLICIT operator Int() const noexcept { return i; }
    constexpr inline bool operator!() const noexcept { return !i; }
#endif

if QT_TYPESAFE_FLAGS is not defined (the default), then a QFlags object will implicitly convert to bool through the operator Int(), including on function return:

https://gcc.godbolt.org/z/oPjhM661G


If instead it is defined (not recommended), then you can still test them using `if (flags)`, but you need an explicit cast when using `return` or similar forms of copy initializations, because the operator towards bool becomes `explicit`. This is a somewhat annoying quirk of C++ that may cause source incompatibilities (cf. https://codereview.qt-project.org/c/qt/qtbase/+/311100 )

For example,

// under QT_TYPESAFE_FLAGS
QFlags<E> flags;

bool f() {
  bool ok = flags;   // ERROR
  bool ok { flags }; // OK
  if (flags) {}      // OK
  return flags;      // ERROR
return bool(flags); // OK ; or (bool)flags, static_cast<bool>(flags), etc.
}



HTH,


--
Giuseppe D'Angelo | [email protected] | Senior Software Engineer
KDAB (France) S.A.S., a KDAB Group company
Tel. France +33 (0)4 90 84 08 53, http://www.kdab.com
KDAB - Trusted Software Excellence

Attachment: smime.p7s
Description: Firma crittografica S/MIME

_______________________________________________
Interest mailing list
[email protected]
https://lists.qt-project.org/listinfo/interest

Reply via email to