Перечисление может быть передано только по правильной ссылке

#c 11

#c 11

Вопрос:

Я бы попросил кого-нибудь немного объяснить мне, почему перечисление может быть передано только по правильной ссылке, а не как простая ссылка?

  namespace n1
{
    enum e1
    {
        f = 1,
        f1
    };
}
void f(n1::e1amp;amp; e)
{
    std::cout<<static_cast<int>(e);

}
int main()
{
   f(n1::e1::f1);
    return 0;
}
  

Комментарии:

1. вы должны либо использовать класс enum вместо шаблона namespace / enum, ЛИБО игнорировать приведение и обмануть lil, используя этот шаблон, чтобы вам не приходилось его приводить.

Ответ №1:

enum s являются константами, поэтому вы не можете воспринимать это как n1::e1amp; , но как const n1::e1amp; :

 void f(const n1::e1amp; e) {
    std::cout<<static_cast<int>(e);
}
  

Комментарии:

1. Согласен с ответом, но я бы рекомендовал передавать enum (или любой другой небольшой объект, например std::span , std::string_view и т.д.) по значению.

2. @Quarra, когда это const , безусловно.

Ответ №2:

Перечисления являются целыми константами :

  • параметр enum функции должен быть постоянным

Примечание: вам не нужно приводить перечисление, чтобы напечатать его значение

 
void f(const n1::e1amp; e) {
    std::cout<< e ;
}
  

Комментарии:

1. Не могли бы вы уточнить, что означает «Rem»? Это «напоминание», или «запомнить», или что-то еще?