Преобразование целочисленного типа в enum: функциональное приведение против инициализации

Предполагая, что есть перечисление как это:

enum foo: int {
    first,
    second
}

Тогда я использую это следующим образом:

foo f(1); // error: cannot initialize a variable of type 'foo' with an rvalue of type 'int'
foo f = foo(1); // OK !

Мне было интересно, в чем разница между двумя? Я понимаю, что вторую версию можно рассматривать как актерский стиль, но почему это имеет значение?

Например, если я сделаю это:

class Bar {};
Bar b = Bar(1); // no matching conversion for functional-style cast from 'int' to 'Bar'

Я, очевидно, получаю ошибку, которая имеет смысл. Поэтому это заставляет меня поверить, что для работы второй версии приведенного выше примера foo необходимо выполнить преобразование из int в enum определено где-то, но если есть такое преобразование, то почему я получаю ошибку в первой версии?

Я прошу прощения, если это дубликат. Я подозреваю, что это так. Это кажется актуальным: Это гипс или конструкция? ... но не выйти.

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

4 голоса | спросил Than21 27 PMpFri, 27 Apr 2018 23:51:01 +030051Friday 2018, 23:51:01

1 ответ


0
Да, эти две формы совершенно разные, тонким способом.Давайте посмотрим на первый, который приводит к ошибке.Это инициализация ---- +: = 0 =: + ---- , типа ---- +: = 1 =: + ---- , из ---- +: = 2 =: +----Здесь описано, акцент мой:[dcl.init] /17.8В противном случае начальное значение инициализируемого объекта является (возможно, преобразованным) значением выражения инициализатора.Стандартные преобразования будут использоваться, если необходимо , для преобразования выражения инициализатора в cv-неквалифицированную версию типа назначения;пользовательские преобразования не рассматриваются.Если преобразование не может быть выполнено, инициализация неверна .Соответствующие преобразования в этом случае являются интегральными преобразованиями, в основном, такими, как указано ниже:[conv.integral] /1Значение типа перечисления с незаданной областью может быть преобразовано в значение типа целого числа.Таким образом, перечисление с незаданной областью может быть неявно преобразовано в целое число, но обратное неверно.Вот почему инициализация плохо сформирована.Однако эта нотация в функциональном стиле по сути является статической.И статическое приведение может выполнить обратное (почти) любое допустимое стандартное преобразование .Таким образом, приведенное ---- +: = 3 =: + ---- затем используется для инициализации ---- +: = 4 =: + ---- , но на этом этапе мы инициализируем копию из---- +: = 5 =: + ---- prvalue, что, конечно, прекрасно.
ответил StoryTeller 28 AMpSat, 28 Apr 2018 00:04:04 +030004Saturday 2018, 00:04:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132