Почему в C++ разрешен следующий код, когда PI является константой и определяется во время компиляции, а 4 * atan (1) определяется только во время выполнения.
int main(){
const double PI = 4*atan(1);
std::cout << PI << std::endl;
return 0;
}
Где я ошибаюсь?
Вы можете использовать not- constexpr
функцию, чтобы инициализировать эту константу, потому что это не время компиляции постоянной, но только const
переменной -qualified.
Большинство math.h
-functions не могут быть constexpr
к сожалению, потому что они могут установить errno
.
Ошибка в coliru: http://coliru.stacked-crooked.com/a/07a87519a0cdab07
Просто чтобы пропустить большую часть ответа.
Обратите внимание на разницу между initialization
и assignment
.
const int num = 3; // This is initialization
int toto = 0;
toto = num; // This is assignment
const
не означает, что "вы должны инициализировать это литералом". Это означает, что "вы не можете изменить это значение после инициализации".
Компилятор может оценивать 4*atan(1)
во время компиляции. Это верно для atan
и всех других функций constexpr
.
Вы можете обеспечить это, объявив свое значение как constexpr
:
constexpr double PI = 4*atan(1);
std::cout << PI << std::endl;
Это инициализация, а не задание. Вы не изменяете значение константы, вы просто инициализируете ее до определенного значения. Это правильно и не нарушает константность свойство, выраженное const
.
const
здесь не означает "значение этой локальной переменной известно во время компиляции". Это означает, что значение этой локальной переменной не изменится.
const
не означает, что он должен быть определен во время компиляции. Это просто означает, что он не меняется во время выполнения. Честно говоря, это просто плохие названияconst
иconstexpr
.const
в каждом из них означает что-то совершенно другое. (Тем не менее,4*atan(1)
можно было бы оценить во время компиляции в любом случае).