Size: a a a

2020 October 13

CD

Constantine Drozdov in pro.cxx
Constantine Drozdov
Этой проблемы нет, это еще один хитрый инвариант, связанный с перемещением. Следующий код эквивалентен:
{
  ::z = std::move(x);
}
и
{
 auto y = std::move(x);
 ::z = std::move(y);
}
Собственно, перед нами второй кирпич, из которого нужно строить std::swap
Теперь описание его выглядит так
Предусловие: x = std::move(y) возможно; y = std::move(x) возможно; для T определен movector
Постусловие: x как будто выполнено x = std::move(y); y как будто выполнено y = std::move(x);
Пруф что в коде все как надо существенно завязано на два указанных выше свойства
источник

CD

Constantine Drozdov in pro.cxx
magras
Но для подсчета количества инстансов это будет означать что нельзя обращаться к счетчику если параллельно с этим происходит работа с подсчитываемыми объектами и они могут стать целью copy elision.
Если одно из свойств нарушено в определении перемещения, std::swap больше нельзя вызывать
источник

m

magras in pro.cxx
А, да, move же не будет изменять значение счетчика и поэтому его удаление ни на что не повлияет. Опять туплю.
источник

m

magras in pro.cxx
В теории правда можно считать все инстансы, в том числе moved from и там эта проблема сохранится.
источник

m

magras in pro.cxx
С другой стороны мне может быть интересна просто статистика: сколько мувов было выполнено.

Не знаю, возможно проще объявить это UB: вероятно это будет работать как я ожидаю, но стандарт ничего не обещает.
источник

P

PRoSToC0der in pro.cxx
Constantine Drozdov
ну доколе, доколе

#include <algorithm>

int main() {
   const auto id = [] (auto x) { return x; };
   const auto [min, max] = std::minmax(id(1), id(2));
   return min < max;
}
мне кажется проблема в целом в том, что pair/tuple/aggregates, ссылки и auto не дружат друг с другом

хочется чтобы:
auto minmax = std::minmax(5, 7);
вёл себя как:
auto min = std::min(5, 7);
в плане отсутствия ссылок, т.е. выводился std::pair<int, int>
источник

CD

Constantine Drozdov in pro.cxx
PRoSToC0der
мне кажется проблема в целом в том, что pair/tuple/aggregates, ссылки и auto не дружат друг с другом

хочется чтобы:
auto minmax = std::minmax(5, 7);
вёл себя как:
auto min = std::min(5, 7);
в плане отсутствия ссылок, т.е. выводился std::pair<int, int>
нет, я хочу, чтобы [x, y] вели себя одинаково вне зависимости от того, лямбда это или structure binding
источник

G

GoodBye in pro.cxx
Переслано от GoodBye
[С]
Привет всем, хоть убей не могу вспомнить как корректно такое делать

К примеру есть структура такого вида
struct STRUCT1
{
   char *var1;
   int var2;
   struct
   {
       char * var4;
       int var5;
   } * var3;
};

потом пишу
struct STRUCT1 var_struct = (struct PROXIES *)calloc(1, sizeof(struct PROXIES));
и после
(*var_struct).var3 = calloc(5, sizeof( *(*var_struct).var3 ));

Как я могу сделать приведение типа для calloc и могу ли?
источник

АВ

Александр Водянников... in pro.cxx
А почему (*var_struct). а не var_struct-> ?
источник

D

Danya in pro.cxx
GoodBye
Переслано от GoodBye
[С]
Привет всем, хоть убей не могу вспомнить как корректно такое делать

К примеру есть структура такого вида
struct STRUCT1
{
   char *var1;
   int var2;
   struct
   {
       char * var4;
       int var5;
   } * var3;
};

потом пишу
struct STRUCT1 var_struct = (struct PROXIES *)calloc(1, sizeof(struct PROXIES));
и после
(*var_struct).var3 = calloc(5, sizeof( *(*var_struct).var3 ));

Как я могу сделать приведение типа для calloc и могу ли?
Потому ты выделяешь память под PROXIES, а сохраняешь в STRUCT1?
источник

G

GoodBye in pro.cxx
Danya
Потому ты выделяешь память под PROXIES, а сохраняешь в STRUCT1?
Опечатка
источник

D

Danya in pro.cxx
В объявлении переменной должен быть указатель
источник

G

GoodBye in pro.cxx
Александр Водянников
А почему (*var_struct). а не var_struct-> ?
Есть мнения, что так быстрее
источник

D

Danya in pro.cxx
GoodBye
Есть мнения, что так быстрее
Бред, это одно и тоже
источник

G

GoodBye in pro.cxx
GoodBye
Переслано от GoodBye
[С]
Привет всем, хоть убей не могу вспомнить как корректно такое делать

К примеру есть структура такого вида
struct STRUCT1
{
   char *var1;
   int var2;
   struct
   {
       char * var4;
       int var5;
   } * var3;
};

потом пишу
struct STRUCT1 var_struct = (struct PROXIES *)calloc(1, sizeof(struct PROXIES));
и после
(*var_struct).var3 = calloc(5, sizeof( *(*var_struct).var3 ));

Как я могу сделать приведение типа для calloc и могу ли?
struct STRUCT1 * var_struct = (struct STRUCT1 *)calloc(1, sizeof(struct STRUCT1));
источник

D

Danya in pro.cxx
GoodBye
struct STRUCT1 * var_struct = (struct STRUCT1 *)calloc(1, sizeof(struct STRUCT1));
Ну да
источник

G

GoodBye in pro.cxx
Danya
Бред, это одно и тоже
Как скажешь, вопрос не об этом
источник

D

Danya in pro.cxx
GoodBye
struct STRUCT1 * var_struct = (struct STRUCT1 *)calloc(1, sizeof(struct STRUCT1));
Это не работает?
источник

G

GoodBye in pro.cxx
Danya
Это не работает?
Всё работает, но я явно хочу указать приведение типа для второго calloc
источник

D

Danya in pro.cxx
GoodBye
Всё работает, но я явно хочу указать приведение типа для второго calloc
Ты не сможешь, у тебя же анонимная структура
источник