On 5/15/19 2:36 PM, Will Godfrey wrote:
My understanding is that nullptr is the 'modern' replacement for NULL, so I
can't see why it would fail.
It is.
In this case, the older version of QSharedPointer provides no way for
the compiler to convert a nullptr (which is actually a nullptr_t) to a
QSharedPointer which operator= requires. It's a bit convoluted and only
happens in rare situations. QSharedPointer prior to Qt 5.8 is
unfortunately one of those situations.
Gorey details are attached in a small test program.
As a cross-check I tried changing a few old-style NULL with nullptr in
Yoshimi, and it compiled without complaint, so I'm quite lost now :(
In most cases, nullptr is a drop-in replacement for NULL.
Ted.
// nullptr.cpp
// To Build:
// g++ -std=c++11 nullptr.cpp
// __cplusplus values:
// 201103L = C++11
// 199711L = C++98 (g++ 4.7 default)
#if __cplusplus >= 201103L
// This is C++11!
#else
#error Need to build with -std=c++11
#endif
class A
{
public:
explicit A(int *p) { m_p = p; }
// Ugh. Avoid assignment operators if you can.
A &operator=(const A &rhs)
{
m_p = rhs.m_p;
}
private:
int *m_p;
};
int main()
{
// nullptr is compatible with pointers in general.
int *p = nullptr;
// This is also OK.
A a(nullptr);
// This is not. Because the ctor is explicit, we must
// explicitly ask for the conversion for this to work.
//a = nullptr;
// Explicitly asking for the conversion works.
a = static_cast<A>(nullptr);
// Adding a (non-explicit) ctor to A that takes a nullptr_t
// also fixes the problem. Qt 5.8 adds this to QSharedPointer.
return 0;
}
_______________________________________________
Rosegarden-user mailing list
[email protected] - use the link below to unsubscribe
https://lists.sourceforge.net/lists/listinfo/rosegarden-user