Почему я могу использовать функцию для присвоения значения константе?

0

Почему в C++ разрешен следующий код, когда PI является константой и определяется во время компиляции, а 4 * atan (1) определяется только во время выполнения.

int main(){
    const double PI = 4*atan(1);
    std::cout << PI << std::endl;
    return 0; 
}

Где я ошибаюсь?

  • 0
    вы можете присваивать значения переменной const только во время их объявления, и это значение можно определить также во время выполнения. Так что в том, что вы сделали, нет ничего плохого. Если вы попытаетесь изменить его снова, это вызовет ошибку.
  • 1
    const не означает, что он должен быть определен во время компиляции. Это просто означает, что он не меняется во время выполнения. Честно говоря, это просто плохие названия const и constexpr . const в каждом из них означает что-то совершенно другое. (Тем не менее, 4*atan(1) можно было бы оценить во время компиляции в любом случае).
Теги:
const

5 ответов

1

Вы можете использовать not- constexpr функцию, чтобы инициализировать эту константу, потому что это не время компиляции постоянной, но только const переменной -qualified.

Большинство math.h -functions не могут быть constexpr к сожалению, потому что они могут установить errno.
Ошибка в coliru: http://coliru.stacked-crooked.com/a/07a87519a0cdab07

0

Просто чтобы пропустить большую часть ответа.

Обратите внимание на разницу между initialization и assignment.

const int num = 3; // This is initialization

int toto = 0;
toto = num; // This is assignment
0

const не означает, что "вы должны инициализировать это литералом". Это означает, что "вы не можете изменить это значение после инициализации".

0

Компилятор может оценивать 4*atan(1) во время компиляции. Это верно для atan и всех других функций constexpr.

Вы можете обеспечить это, объявив свое значение как constexpr:

constexpr double PI = 4*atan(1);
std::cout << PI << std::endl;
0

Это инициализация, а не задание. Вы не изменяете значение константы, вы просто инициализируете ее до определенного значения. Это правильно и не нарушает константность свойство, выраженное const.

const здесь не означает "значение этой локальной переменной известно во время компиляции". Это означает, что значение этой локальной переменной не изменится.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню