Size: a a a

2021 February 16

CD

Constantine Drozdov in supapro.cxx
Eduard Voronkin
foo(const some_type& ref);

между
foo({});
и
foo(some_type());

есть какая-то разница ? (предполагается, что у some_type есть все конструкторы)
ну и вопрос вдогонку, если так:
foo(some_type&& rref);
- будет разница?
нет, если нет шуток с overload resolution
источник

EV

Eduard Voronkin in supapro.cxx
Constantine Drozdov
нет, если нет шуток с overload resolution
так и думал. Просто почему-то интуитивно казалось, что {} должен как-то мув сэкономить, но по факту это же тот же вызов конструктора, который будет совершен при вычислении аргументов функции foo
источник

CD

Constantine Drozdov in supapro.cxx
Eduard Voronkin
так и думал. Просто почему-то интуитивно казалось, что {} должен как-то мув сэкономить, но по факту это же тот же вызов конструктора, который будет совершен при вычислении аргументов функции foo
а тут нет никакого move
источник

EV

Eduard Voronkin in supapro.cxx
не будет move?
источник

EV

Eduard Voronkin in supapro.cxx
а во втором варианте
источник

CD

Constantine Drozdov in supapro.cxx
а что и куда перемещать?
источник

EV

Eduard Voronkin in supapro.cxx
ладно, почему в первом не будет мув, понятно. А во втором?
источник

EV

Eduard Voronkin in supapro.cxx
там-то он точно должен быть
источник

CD

Constantine Drozdov in supapro.cxx
Eduard Voronkin
ладно, почему в первом не будет мув, понятно. А во втором?
Mandatory elision of copy/move operations
       In the initialization of an object, when the initializer expression is a prvalue of the same class type (ignoring cv-qualification) as the variable type
источник

D

Danya in supapro.cxx
Eduard Voronkin
там-то он точно должен быть
Зачем?
источник

D

Danya in supapro.cxx
Там берется константная ссылка на временный объект
источник

EV

Eduard Voronkin in supapro.cxx
та то я понял. Изначально вопрос был как раз с rvalue, но я чет пока писал сам передал на const lval
источник

EV

Eduard Voronkin in supapro.cxx
Constantine Drozdov
Mandatory elision of copy/move operations
       In the initialization of an object, when the initializer expression is a prvalue of the same class type (ignoring cv-qualification) as the variable type
Прикольно, спасибо
источник

D

Danya in supapro.cxx
Constantine Drozdov
нет, если нет шуток с overload resolution
User-defined конструктор по умолчанию же убивает агрегатную инициализацию?
источник

CD

Constantine Drozdov in supapro.cxx
Danya
User-defined конструктор по умолчанию же убивает агрегатную инициализацию?
скажем, foo(std::initializer_list<int>) точно приоритетнее для {}
источник

D

Danya in supapro.cxx
Constantine Drozdov
скажем, foo(std::initializer_list<int>) точно приоритетнее для {}
Не, я про другое
Это понятно
Я вот конкретно про свой вопрос
источник

CD

Constantine Drozdov in supapro.cxx
Danya
Не, я про другое
Это понятно
Я вот конкретно про свой вопрос
Лучше задавай такие вопросы стандарту/cppref
источник

LA

Liber Azerate in supapro.cxx
Danya
User-defined конструктор по умолчанию же убивает агрегатную инициализацию?
Да
источник

CD

Constantine Drozdov in supapro.cxx
Danya
Не, я про другое
Это понятно
Я вот конкретно про свой вопрос
а то и вот такие шуточки бывают
struct A {};
struct B {
   constexpr B(A& a) : x(1) {}
   constexpr B(B const&) : x(2) {}
   int x;
};
struct C : A, B {
  constexpr C() : A(), B(*this) {}
};

static_assert(C{}.x != 2);
источник

CD

Constantine Drozdov in supapro.cxx
совершенно очевидно, что нужно вызвать конструктор копирования B...
источник