Это вопрос о моей голове, но он работает, с const, но не с constexpr, и мне интересно, можете ли вы, умные люди, объяснить. Скомпилировано с g ++ -std = c ++ 14.
struct Service
{
std::string name;
enum {
thread,
interrupt,
end_types
} que_type;
};
const Service namedServices[] =
{
{"abc", Service::thread},
{"efg", Service::thread},
{"hij", Service::interrupt},
{"klm", Service::thread},
{"nop", Service::interrupt},
{"qrs", Service::thread},
{"", Service::end_types}
};
constexpr int thcnt()
{
int cnt = 0;
for (const Service* sp = namedServices; sp->que_type != Service::end_types; sp++) {
if (sp->que_type == Service::thread)
cnt++;
}
return cnt;
}
int main(int argc, char** argv)
{
std::string strs[thcnt()];
...
Это компилируется и, насколько я могу судить, делает правильные вещи. Если я перехожу на
constexpr Service namedServices[] =
, я получаю
... error: the type 'const Service []' of constexpr variable 'namedServices' is not literal
};
^
Это кажется странным, но, возможно, на это есть веская причина. Или, может быть, это будет исправлено в c ++ 20.
спасибо