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

Constexpr не компилируется в VC2013

Этот код constexpr не скомпилирован в Visual Studio 2013 версии 12.0.21005.1 REL

Есть ли новый компилятор Visual Studio, который работает с constexpr?

#include <iostream>

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;
}

вывод из компиляции:

    1>------ Build started: Project: Project1, Configuration: Debug Win32 ------
    1>  Source.cpp
    1>....\source.cpp(3): error C2144: syntax error : 'int' should be preceded by ';'
    1>....\source.cpp(3): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Херб Саттер упоминает Constexpr в своем блоге, но неясно, в какой версии он работает/будет работать? http://herbsutter.com/2013/09/09/visual-studio-2013-rc-is-now-available/#comment-13521

4b9b3361

Ответ 2

constexpr не поддерживается в RTM Visual Studio 2013, см. таблицу совместимости . Это относится не только к версии RTM, но также и к обновлениям Visual Studio.

Если вы хотите придерживаться Visual Studio 2013, вы можете скачать Visual С++ Compiler ноябрь 2013 CTP, который поставляется с некоторыми новыми функциями, см. блог MSDN. К сожалению, Microsoft не имеет слияния с последними функциями Visual Studio Update и функциями CTP и четко заявляет, что они не планируют это делать.

Если мы хотим все это, нам нужно дождаться Visual Studio 2015, см. блог MSDN о просмотре VS 2015.

Ответ 3

Как упоминается другими, Ноябрь 2013 г. Предварительный просмотр технологии клиентов (CTP) даст вам доступ к constexpr *

Обратите внимание, что для загрузки нового компилятора вам потребуется изменить "Набор инструментов для платформы" на "Visual С++ Compiler Nov 2013 CTP (CTP_Nov2013)". Вы можете сделать это, открыв свой проект "Страницы свойств" и перейдя в "Свойства конфигурации" > "Общие", а затем изменив "Набор инструментов платформы".

* Существует некоторая противоречивая информация о том, в какой части constexpr у вас действительно есть доступ, но это определенно не все определения стандартов constexpr. Microsoft говорит здесь, что добавляет кэш 2013 года:

constexpr поддержка (кроме конструкторов)

Microsoft говорит здесь, что она содержит:

constexpr (кроме функций-членов)

Я даже не могу проверить, поддерживает ли он функции-член, потому что у него определенно нет поддержки для любого типа конструкции constexpr. Например этот код дает эту ошибку с CTP в ноябре 2013 года:

ошибка C2127: незаконная инициализация объекта constexpr с не константным выражением

Еще одно примечание: во время написания Visual Studio 2015 Preview до сих пор не поддерживает конструкцию constexpr. Держа пальцы в финальном выпуске.

Ответ 4

Вам нужно установить обновление VS2013 5. (я был на Update 3, и он не работал) На момент написания этой статьи было неприемлемо то, что было сказано о "Новом 2013 CTP". Вы можете сделать это, перейдя сюда: https://my.visualstudio.com

и будет загружен, или:  https://my.visualstudio.com/Downloads?q=visual%20studio%202013&wt.mc_id=o~msft~vscom~older-downloads