C++ 11 предоставил нам списки инициализации. Я узнал, что они не выполняют сужающие преобразования, которые иногда разбивают компиляцию существующего кода, например, при работе на значениях перечислений с неявно Интом-уширенных значениями:Различия в сужении в C++ 11 между списками назначения и инициализации
enum COMMAND
{
COMMAND_WRITE_MISC_CONFIG = 0x70
};
struct CommandSettings
{
quint8 buddy;
};
void NarrowingTest::testNarrowing()
{
quint8 i = 100;
CommandSettings test{static_cast<quint8>(COMMAND_WRITE_MISC_CONFIG | i)};
quint8 x = COMMAND_WRITE_MISC_CONFIG | i;
QVERIFY(true);
}
Инициализация из test
не будет компилироваться без актеры.
То, что я ищу, является обоснованием инициализации назначения x
, все еще работающей.
Вы уверены, что это действительно C++ 03? Я уверен, что там тоже нужен актерский состав. – StoryTeller
@StoryTeller Версия с литой - это синтаксическая ошибка в C++ 03. Если это было 'CommandSettings test = {COMMAND_RITE_MISC_CONFIG | i}; ', хотя это допустимо C++ 03, но сделал ошибку с C++ 11, и можно сделать допустимым C++ 11, добавив приведение. – hvd
@StoryTeller nope, это часть компиляционного тестового приложения. Просто скопировал соответствующую часть (это тестовый файл Qt5.7, с включенным C++ 11) – deets