Size: a a a

2020 July 07

v

vehlwn in pro.cxx
Sergey Korobov
вопрос немного глупый, но все же, есть кусочек кода
void func(uint16_t value){
...
 if(a == ~value){...}
 else{...}
 ...
}

возникает проблема при "~value" он превращается в 32-битное значение, это ошибка компилятора или в стандарте определенно что при инверсии может преобразоваться в другой тип данных?
В стандарте определены неявные интегральные промоушены для всех битовых и арифметических операций.
источник

v

vehlwn in pro.cxx
Sergey Korobov
вопрос немного глупый, но все же, есть кусочек кода
void func(uint16_t value){
...
 if(a == ~value){...}
 else{...}
 ...
}

возникает проблема при "~value" он превращается в 32-битное значение, это ошибка компилятора или в стандарте определенно что при инверсии может преобразоваться в другой тип данных?
В чем проблема? Бери промотнутое значение и кастуй обратно в уинт16.
источник

SK

Sergey Korobov in pro.cxx
vehlwn
В чем проблема? Бери промотнутое значение и кастуй обратно в уинт16.
проблемы кастануть нету, не понятно почему он решил вдруг из 16 битного 32 битное
источник

A

Alex in pro.cxx
Здесь ошибка в макросе Register_A, нет скобок для вызова функции. Но почему-то не компилит только шланг. А если исправить - не компилит никто, я так и значально уже пробовал)
источник

A

Alex in pro.cxx
а с круглыми скобками ошибка другая, этот момент я тоже не понял, буду рад, если кто-то объяснит
источник

v

vehlwn in pro.cxx
Sergey Korobov
проблемы кастануть нету, не понятно почему он решил вдруг из 16 битного 32 битное
Открой стандарт и прочитай про интегральные конверсии.
источник

A

Alex in pro.cxx
Ошибка сохраняется, даже если указать шаблонные параметры: #define Register_A(name) std::pair<const char*, A>{#name, name()}
источник

v

vehlwn in pro.cxx
Sergey Korobov
проблемы кастануть нету, не понятно почему он решил вдруг из 16 битного 32 битное
Ошибка в слове 16 и 32. А вообще Integral promotions [conv.prom].
источник

O

Ofee in pro.cxx
Alex
Ошибка сохраняется, даже если указать шаблонные параметры: #define Register_A(name) std::pair<const char*, A>{#name, name()}
Я не очень понимаю, для чего в минимальном воспроизводимом примере макросы, если они только затрудняют поиск проблемы. Если я правильно понимаю, достаточно этого для воспроизведения ошибки, если я  сам ничего лишнего не добавил или не убрал случайно:

struct Registry {
   inline constexpr static int one() { return 1; }
   static constexpr const auto m_value = one();
};

'static constexpr int Registry::one()' called in a constant expression before its definition is complete
источник

VS

Vlad Serebrennikov in pro.cxx
Sergey Korobov
проблемы кастануть нету, не понятно почему он решил вдруг из 16 битного 32 битное
The type of the result is the type of the promoted operand.
http://eel.is/c++draft/expr.unary.op#10http://eel.is/c++draft/expr.unary.op#10
источник

v

vehlwn in pro.cxx
Sergey Korobov
проблемы кастануть нету, не понятно почему он решил вдруг из 16 битного 32 битное
Сильно типизированный язык обсуждают в другом чате.
источник

A

Alex in pro.cxx
Ofee
Я не очень понимаю, для чего в минимальном воспроизводимом примере макросы, если они только затрудняют поиск проблемы. Если я правильно понимаю, достаточно этого для воспроизведения ошибки, если я  сам ничего лишнего не добавил или не убрал случайно:

struct Registry {
   inline constexpr static int one() { return 1; }
   static constexpr const auto m_value = one();
};

'static constexpr int Registry::one()' called in a constant expression before its definition is complete
Да, логично, я не зашёл так глубоко в отрезании лишнего. Но ещё интересно, откуда такая разница между pair<A, B>(a, b) и pair<A, B>{a, b}
источник

v

vehlwn in pro.cxx
Alex
Да, логично, я не зашёл так глубоко в отрезании лишнего. Но ещё интересно, откуда такая разница между pair<A, B>(a, b) и pair<A, B>{a, b}
Первое может случайно задекларировать функцию.
источник

A

Alex in pro.cxx
Хммм. А у меня как раз первое-то и работает
источник

A

Alex in pro.cxx
а второе - нет
источник

Е

Егор in pro.cxx
Ofee
Я не очень понимаю, для чего в минимальном воспроизводимом примере макросы, если они только затрудняют поиск проблемы. Если я правильно понимаю, достаточно этого для воспроизведения ошибки, если я  сам ничего лишнего не добавил или не убрал случайно:

struct Registry {
   inline constexpr static int one() { return 1; }
   static constexpr const auto m_value = one();
};

'static constexpr int Registry::one()' called in a constant expression before its definition is complete
вот так везде работает
struct Registry {
   constexpr static int one() { return 1; }
   constexpr static inline auto m_value = &Registry::one;
};

int main() {
   std::cout << Registry::m_value();
}
источник

A

Alex in pro.cxx
Работает, потому что это вообще не то, что нужно, это должен быть constexpr объект, а не указатель на функцию)
источник

O

Ofee in pro.cxx
Егор
вот так везде работает
struct Registry {
   constexpr static int one() { return 1; }
   constexpr static inline auto m_value = &Registry::one;
};

int main() {
   std::cout << Registry::m_value();
}
Но это не совсем то, что требовалось, насколько я понимаю. Здесь m_value не int
источник

A

Alex in pro.cxx
Упростил пример: https://godbolt.org/z/AMyXiwП

Повторюсь, что я уже проверил - если разделить функцию и объект на два разных класса, то работает. Просто я не пойму логику, по которой метод считается ещё не определенным. Кстати, так фигурные скобки работают, а в определении элемента std::array нет (в исходном примере), странно.
источник

PK

Pavel Kazakov in pro.cxx
ну, класс еще не complete, поэтому низя пользоваться его методами — примерно такая логика, но это какие-то совсем неявные зависимости, так не должно быть в этом примере
источник