Подтвердить что ты не робот

Почему MSVС++ 11 отклоняет constexpr квалификацию функции?

Итак, играя с 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 показывает, что это необязательно.

Итак, чего я, очевидно, не вижу здесь?

4b9b3361

Ответ 1

Довольно просто - потому что Visual Studio не поддерживает constexpr (до Visual Studio 2015).

Обратите внимание, что MSVС++ 11 - это Visual Studio 2012; VС++ 10 - это Visual Studio 2010.