Передача константной переменной между функциями-членами в качестве индекса массива - PullRequest
0 голосов
/ 29 апреля 2018

Я пытался решить это, но не могу. У меня есть определение класса, и я хочу, чтобы функция-член (siz) возвращала постоянное значение другой функции-члену (abc). Это значение используется как максимальный индекс в объявлении массива в этой функции. Но это не похоже на работу. Вот упрощенная версия:

class bin {
    constexpr int siz();
public:
    void abc();
};

constexpr int bin::siz() {
    const int sizz = sizeof(int) * 8;
}

void bin::abc() {
    char arr[siz()];   // compiler: this expression didn't evaluate as constant (¿?)
};

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

constexpr int siz() {
    const int sizz = sizeof(int) * 8;
    return sizz;
}

int main() {
    char arr[siz()];
    return 0;
}

1 Ответ

0 голосов
/ 29 апреля 2018

Я не совсем уверен, но я думаю, что проблема в том, что в bin::abc объект может быть чем угодно во время выполнения. Следовательно, bin::siz() не может быть оценено во время компиляции.

Следующее работает отлично

int main()
{
   bin b;
   char arr[b.siz()];
}

после изменения bin на:

class bin {
public:
    constexpr int siz();
};

constexpr int bin::siz() {
    return sizeof(int) * 8;
}

Если siz не зависит от состояния объекта, как в опубликованном вами коде, я предлагаю сделать его static функцией-членом.

У меня хорошо работает следующее.

class bin {
  public:
    static constexpr int siz();
    void abc() const;
};

constexpr int bin::siz() {
  return sizeof(int) * 8;
}

void bin::abc() const {
  char arr[siz()];
}

int main()
{
  bin b;
  char arr[b.siz()];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...