Почему в C++11 constexpr такой ограничительный?

Как вы, вероятно, знаете, в C++11 введено ключевое слово constexpr.

В C++11 введено ключевое слово constexpr, которое позволяет пользователю гарантировать, что функция или конструктор объекта является компилируемой константой. [...] Это позволяет компилятору понять и проверить, что [имя функции] является константой времени компиляции.

Мой вопрос заключается в том, почему существуют такие строгие ограничения на форму функций, которые могут быть объявлены. Я понимаю желание гарантировать, что функция является чистой, но подумайте вот о чем:

Использование constexpr в функции накладывает некоторые ограничения на то. что эта функция может делать. Во-первых, функция должна иметь непустотный возвращаемый тип. Во-вторых, тело функции не может объявлять переменные или определять новые типы. В-третьих, тело функции может содержать только объявления, нулевые утверждения и единственный оператор возврата. Должны существовать такие значения аргументов что после подстановки аргументов выражение в выражении return дает константное выражение.

Это означает, что эта чистая функция является незаконной:

constexpr int maybeInCppC1Y(int a, int b)
{
    if (a>0)
        return a+b;
    else
        return a-b;
  //can be written as   return  (a>0) ? (a+b):(a-b); but that isnt the point
}

Также вы не можете определять локальные переменные... :( Мне интересно, это решение разработчиков, или компиляторы не умеют доказывать, что функция a является чистой?

52
задан Lightness Races with Monica 11 August 2016 в 00:20
поделиться