Невозможно скомпилировать простую программу на C ++ 17 - PullRequest
5 голосов
/ 03 ноября 2019

Я пытаюсь использовать функцию C ++ 17 if constexpr, но не могу скомпилировать простую функцию.

Код:

template <auto B>
int foo()
{
    if constexpr(B)
    {
        return 1;
    }
    else
    {
        return 2;
    }
}  // <- I get an error here 

int main()
{
    return foo<false>();
}

Вывод ошибки компилятором:

<source>(12): error #1011: missing return statement at end of non-void function "foo<B>() [with B=false]"

  }

Используются -std=c++17 -O3 -Wall -Werror флаги компилятора и icc 19.0.1 компилятор.

Это допустимый код C ++ 17? В чем причина этой ошибки?

1 Ответ

5 голосов
/ 03 ноября 2019

Это правильный код C ++ 17?

Да, это действительно. Ровно один оператор возврата будет отброшен, а другой останется. Даже если ничего не осталось, C ++ по-прежнему позволяет вам опустить оператор возврата из функции. Вы получаете неопределенное поведение, если достигается закрывающая фигурная скобка функции, но это риск, только если выполнение достигает этой точки.

В вашем случае выполнение не может достичь такой точки, поэтому UB невозможен.

В чем причина этой ошибки?

Вы использовали -Werror, превратив предупреждение о ложном срабатывании компилятора в серьезную ошибку. Одним из обходных путей является отключение этого предупреждения вокруг этой конкретной функции. Это просто проблема качества реализации.

...