Ответ 1
Действительно, это ошибка в GCC, как обсуждалось в комментариях, но я подумал, что я бы добавил некоторые дополнительные сведения о природе этой ошибки. В файле новостей GCC есть следующая строка:
__FUNCTION__
и__PRETTY_FUNCTION__
теперь рассматриваются как переменные с помощью синтаксического анализатора; ранее они рассматривались как строковые константы. Поэтому код, напримерprintf (__FUNCTION__ ": foo")
должен быть переписан наprintf ("%s: foo", __FUNCTION__)
. Это необходимо для шаблонов.
Но __PRETTY_FUNCTION__
самом деле не является переменной, это особый случай, рассматриваемый в синтаксическом анализаторе, как мы видим в constexpr.c
:
case DECL_EXPR:
{
tree decl = DECL_EXPR_DECL (body);
if (TREE_CODE (decl) == USING_DECL
/* Accept __func__, __FUNCTION__, and __PRETTY_FUNCTION__. */
|| DECL_ARTIFICIAL (decl))
return NULL_TREE;
return error_mark_node;
}
Если бы это была переменная, мы ожидаем, что она пройдет те же тестовые примеры, что и они:
constexpr const char* s2 = "TEST";
constexpr const char* s3 = s2;
test_template<ce_strlen("TEST")> c;
test_template<ce_strlen(s2)> d;
test_template<ce_strlen(s3)> e;