Проблема с ключевым словом constexpr с классами - PullRequest
3 голосов
/ 24 марта 2020

Итак, я недавно увидел этот фрагмент в inte rnet:

class Human
{
    int age;

public:
    constexpr Human(int humansAge) : age(humansAge) {}
    constexpr int GetAge() const { return age; }
};

int main(int argc, char const *argv[])
{
    constexpr Human somePerson(15);
    const int hisAge = somePerson.GetAge();

    return 0;
}

Теперь я сравнил этот класс с ключевым словом constexpr и без него в проводнике компилятора и увидел, что конструктор не У него нет инструкций с правой стороны, но функция GetAge имела их. Теперь у меня есть несколько вопросов:

  1. Что constexpr делает здесь с конструктором и функцией GetAge ?
  2. Какова роль ключевого слова const после прототипа GetAge (), означает ли это, что age будет возвращен как const?
  3. Что произойдет, если я объявлю int hisAge не const?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Здесь есть два отдельных вопроса: const и constexpr.

Давайте начнем с const, отбрасывая constexpr.

class Human
{
    int age;

public:
    Human(int humansAge) : age(humansAge) {}
    int GetAge() const { return age; }
};

int main(int argc, char const *argv[])
{
    Human somePerson(15);
    const int hisAge = somePerson.GetAge();

    return 0;
}

const on GetAge() объявляет, что вызов GetAge() не изменит состояние объекта. Таким образом, если бы мы попытались написать:

int GetAge() const { return ++age; }

, это вызвало бы ошибку компиляции, которой не было бы без const.

Const на hisAge:

const int hisAge = ...

просто говорит, что hisAge нельзя изменить после его инициализации, поэтому последующее

hisAge = 50;

будет недопустимым.

Однако все это константы времени выполнения. Хотя мы инициализировали человека с жестко запрограммированным 15, это в равной степени сработало бы со значением, считанным пользователем или файлом.

Если мы вновь введем все ключевые слова constexpr, это означает, что теперь у нас есть константы времени компиляции. У нас может быть несколько людей с разными возрастами, но все возрасты должны быть доступны во время компиляции, то есть жестко запрограммированы.

1 голос
/ 24 марта 2020

1. Спецификатор constexpr объявляет, что можно оценить значение функции или переменной во время компиляции. - cppreference .

Я бы сказал, что в вашем примере это ничего не даст.


2. constexpr int GetAge() const { return age; }

, что const означает что-то вроде this это const Human (const Human this <=> const int x)


3. Что произойдет, если я объявлю int hisAge как не const?

Это ничего не изменит .


const - это почти подсказка, она помогает вам (программисту) написать код правильности const, остановит вас от непреднамеренного изменения состояния. Он может измениться, где находится переменная или какая-то оптимизация компилятора, но вы, вероятно, не заметите разницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...