non-constant-expression cannot be narrowed from type int to std::byte

177
12 июля 2019, 06:40

Почему в следующем коде нет ошибок компиляции, но clang-tidy выдаёт ошибку? Компилирую с помощью gcc.

non-constant-expression cannot be narrowed from type int to std::byte

int i = 42;
std::byte byte{i};
Answer 1

Тип std::byte определяется как

enum class byte : unsigned char {};
                  ^^^^^^^^^^^^^  

Согласно стандарту C++17 (Draft №4714)

(3.8) — Otherwise, if T is an enumeration with a fixed underlying type (10.2), the initializer-list has a single element v, and the initialization is direct-list-initialization, the object is initialized with the value T(v) (8.5.1.3); if a narrowing conversion is required to convert v to the underlying type of T, the program is ill-formed. [ Example:

enum byte : unsigned char { };
byte b { 42 }; // OK
byte c = { 42 }; // error
byte d = byte{ 42 }; // OK; same value as b
byte e { -1 }; // error

Так как у вас используется не константное выражение при прямой инициализации

int i = 42;
std::byte byte{i};

то компилятор выдает сообщение об ошибке.

Также из этого же стандарта

7.4) — from an integer type or unscoped enumeration type to an integer type that cannot represent all the values of the original type, except where the source is a constant expression whose value after integral promotions will fit into the target type.

Можно было бы написать

const int i = 42;
std::byte byte{i};
READ ALSO
Один QVector для разных типов объектов

Один QVector для разных типов объектов

Возник такой вопрос: у меня есть главный класс Figures, от которого я унаследовал Circle,Square,Triangle и тд

152
c++ Запись в bin файл

c++ Запись в bin файл

Начал писать свой оптимизатор-транслятор кода for funЯ новичок в c++ и ЯВУ

130
Undefined reference to “Classname::Classname” Qt C++

Undefined reference to “Classname::Classname” Qt C++

У меня есть проект, который содержит в себе два других (использую subdirs)Вызовом нужных функций из подпроектов занимается класс MainWindow, который...

160
Не возможно выйти из цикла c++

Не возможно выйти из цикла c++

Вот такой кусок кода:

139