У меня есть этот код, где, если вы прокомментируете строку, прокомментированную "Но это не работает?!" он компилируется просто отлично, но если вы этого не сделаете, компилятор генерирует ошибку.
По крайней мере, gcc 8.2 генерирует ошибку.
Но они кажутся мне идентичными. В чем проблема? Является ли этот правовой код вообще?
template <int x>
struct test_template {
static int size() { return x; }
};
constexpr int ce_strlen(char const *s)
{
int i = 0;
while (s[i]) ++i;
return i;
}
int joe()
{
constexpr int plen = ce_strlen(__PRETTY_FUNCTION__); // This works
test_template<plen> a; // This declaration is valid.
test_template<ce_strlen(__PRETTY_FUNCTION__)> b; // But this doesn't work?!
return a.size() + b.size();
}
Я столкнулся с этим, пытаясь придумать способ создания тегов профиля для интрузивной системы профилирования во время компиляции. Мне это удалось, но мой последний код не включает использование ce_strlen
.