Size: a a a

2020 August 10

N

Neargye in pro.cxx
Anatoly Tomilov
Есть ли какие-то препятствия в языке разрешить enum forward declaration следующего вида: само forward declaration, например, enum E : uint16_t;, а definition enum E : uint16_t {a, b, c};? В таком случае forward declared enum можно было бы использовать в определении класса, как тип данного-члена, не раскрывая деталей реализации.
это уже можно
https://en.cppreference.com/w/cpp/language/enum

enum name : type ;  (3)  (since C++11)

enum struct|class name ;  (3)  
enum struct|class name : type ;


http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf
источник

AT

Anatoly Tomilov in pro.cxx
Neargye
это уже можно
https://en.cppreference.com/w/cpp/language/enum

enum name : type ;  (3)  (since C++11)

enum struct|class name ;  (3)  
enum struct|class name : type ;


http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf
блин. Не запомнилось, когда читал, видимо
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
#include <memory>

struct Kek {
   Kek(const Kek&) = default;

   Kek(std::shared_ptr<int> *x) {
       (void)x;
   };
};

int main() {
   int *p = 0;
   Kek(0u);
}

это компилиться тоже хотя и имеет тип unsigned
0u это литерал, unsigned(0) нет
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Casual tears
https://godbolt.org/z/b6q71a
Есть вот такой код. Он молча собирается msvc с /W4 и gcc с -Wall -Wextra, а clang падает с ошибкой компиляции. Какой компилятор тут "прав" (i.e. "по стандарту")?
Кмк бага гцц и мсвс
источник

Т8

Т-34 85 in pro.cxx
Artöm Bakri Al-Sarmini
Кмк бага гцц и мсвс
в gcc нет багов, это фичи
источник

f

fulcanelly in pro.cxx
Casual tears
https://godbolt.org/z/b6q71a
Есть вот такой код. Он молча собирается msvc с /W4 и gcc с -Wall -Wextra, а clang падает с ошибкой компиляции. Какой компилятор тут "прав" (i.e. "по стандарту")?
а зачем этот код вообще...
источник

Ct

Casual tears in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
#include <memory>

struct Kek {
   Kek(const Kek&) = default;

   Kek(std::shared_ptr<int> *x) {
       (void)x;
   };
};

int main() {
   int *p = 0;
   Kek(0u);
}

это компилиться тоже хотя и имеет тип unsigned
Вот это уже фейл какой-то. Что за магические константы.
источник

Ct

Casual tears in pro.cxx
fulcanelly
а зачем этот код вообще...
Этот код - минимальное воспроизведение бага, который появился после рефакторинга.
источник

Ct

Casual tears in pro.cxx
Условно, раньше у Kek был конструктор с интом, затем его убрали
источник

Ct

Casual tears in pro.cxx
Получили сегфолт в лицо
источник

Ct

Casual tears in pro.cxx
Artöm Bakri Al-Sarmini
0u это литерал, unsigned(0) нет
Обычно преобразования описываются на уровне типов. Т.е. тип A может неявно сконвертится в тип B, а тут такая засада.
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Casual tears
Обычно преобразования описываются на уровне типов. Т.е. тип A может неявно сконвертится в тип B, а тут такая засада.
0 исключение в этом случае
источник

AP

Alexander Potapov in pro.cxx
Такой вопрос. Приходит аргумент функтор (лямбда, объект с оператором(), не важно). Как без горождения заборов получить тип его первого входного параметра?

template<typename F>
void foo(F&& f) {
   using Arg1 = ???

Т. Е. для foo([](int, char) {})
Arg1 = int
источник

AP

Alexander Potapov in pro.cxx
на ум приходит decltype(std::function{ f }) и далее её в как std::function<R(Arg1, Args...)> передать
источник

AP

Alexander Potapov in pro.cxx
Просто я не знаю, не создаю ли я велосипед когда так пишу
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Alexander Potapov
Такой вопрос. Приходит аргумент функтор (лямбда, объект с оператором(), не важно). Как без горождения заборов получить тип его первого входного параметра?

template<typename F>
void foo(F&& f) {
   using Arg1 = ???

Т. Е. для foo([](int, char) {})
Arg1 = int
Никак, потому что () может быть шаблонным
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Alexander Potapov
на ум приходит decltype(std::function{ f }) и далее её в как std::function<R(Arg1, Args...)> передать
Вывод аргументов стдфункции работает только для указателей на функции, по той же причине
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Alexander Potapov
Просто я не знаю, не создаю ли я велосипед когда так пишу
Скажи лучше, зачем оно
источник

AP

Alexander Potapov in pro.cxx
Artöm Bakri Al-Sarmini
Никак, потому что () может быть шаблонным
Ну а можно ли отфильтовать в таком случае?
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
В чем цель?
источник