Итак, играя с constexpr, MSVC (Visual Studio 2012) дал мне ошибку, пытаясь квалифицировать мою функцию с помощью ключевого слова constexpr
, используя эту простую программу (включая пропущенную):
constexpr int factorial(int n)
{
return n <= 1 ? 1 : (n * factorial(n-1));
}
int main(void)
{
const int fact_three = factorial(3);
std::cout << fact_three << std::endl;
return 0;
}
constexpr
был выделен красным цветом со следующим сообщением:
Ошибка: это объявление не имеет класса хранения или спецификатора типа
и попытка скомпилировать программу дала следующий результат:
1 > main.cpp(5): ошибка C2144: синтаксическая ошибка: 'int' должен предшествовать ';'
1 > main.cpp(5): ошибка C4430: отсутствует спецификатор типа - int. Примечание: С++ не поддерживает default-int
Это действительно озадачивает меня, поскольку это пример, который использует Cppreference для иллюстрации использования constexpr
. Сначала я использовал простую функцию, которая возвращала литерал, т.е. constexpr int func(){return 5;}
, но который дал ту же ошибку. Я интерпретировал первое сообщение как "он должен быть функцией-членом структуры или класса", но пример из Cppreference показывает, что это необязательно.
Итак, чего я, очевидно, не вижу здесь?