[Interest] constexpr construct a QLatin1String from a raw string literal

Thiago Macieira thiago.macieira at intel.com
Tue Mar 14 20:23:21 CET 2017


On terça-feira, 14 de março de 2017 09:03:11 PDT Gunnar Roth wrote:
> Hello Qt and C++ experts.
>  
> I try to let the compiler generate a QLatin1String instance from a string
> literal. Q_DECL_CONSTEXPR inline explicit QLatin1String(const char *s)
> Q_DECL_NOTHROW : m_size(s ? int(strlen(s)) : 0), m_data(s) {}
> 
> cannot really do this as it uses strlen,  is this right? Only
> a QLatin1String(nullptr) would be generated at compile time. 

More or less correct.

strlen is not, officially, constexpr. I actually asked the C++ proposals mailing 
list about that last week and the conclusion was "we won't touch the C API".

However, GCC actually implements the strlen builtin as constexpr. So you could 
use __builtin_strlen.

Anyway, thanks for pointing this out. I've just submitted a change to drop 
that constexpr:
	https://codereview.qt-project.org/188478

> I can then do something like    if
> (arguments.contains(HmiGfx::RHQt::UtQt::Latin1Literal("--fullscreen"))) or
> define a variable like Q_CONSTEXPR Latin1Literal MY_PREFIX("Prefix");

The former does not need to be constexpr. The second, I have to ask why you 
need it for.

> My question is now, is this the right thing to do and could something like
> that be added to Qt itself?

I'm not sure. We could have added the array one and decided not to, as it 
changes behaviour:

	static const char data[] = "foo\0bar\0baz\0";
	QLatin1String foo(data);
	QLatin1String bar(data + 4);

Today, foo == "foo". If we add the overload, it becomes "foo\0bar\0baz\0". 
We've had this discussion with QString conversion from QByteArray: do we use 
QByteArray's length or do we strlen it? There were quite a few cases to be 
found that depended on the implicit NUL being found when we tried to change 
that, and we couldn't apply the change without too much breakage.

-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center




More information about the Interest mailing list