У меня такой class
:
class Widget
{
public:
Widget(A const& a) { /* do something */ }
Widget(A&& a) { /* do something */ }
};
Что я могу использовать так:
A a{};
Widget widget{a};
Если бы я пришел к выводу, что a
мне больше не нужен, я мог бы позвонить:
Widget{std::move(a)};
Но что теперь, если мне нужен A
объект только для построения widget
? Я бы сделал это:
Widget widget{A{}};
or
Widget widget{std::move(A{})};
A{}
- это rvalue, поэтому разрешение перегрузки подхватит конструктор перемещения. - person juanchopanza   schedule 10.03.2016Widget widget{std::move(a)};
в случае или. - person nwp   schedule 10.03.2016A{} = A{};
является допустимым выражением? - person hgiesel   schedule 10.03.2016A{} = A{}
является допустимым, это должно означать, чтоA{}
не является rvalue? В этом случае забудьте о rvalue и lvalue в смысле слева и справа от присваивания, что просто не выполняется в C ++. - person nwp   schedule 10.03.2016int(42) = 43;
error: lvalue требуется в качестве левого операнда присваивания Независимо от того, применяется ли оно здесь, такое правило действительно существует. - person Lightness Races in Orbit   schedule 10.03.2016int{42} = 43;
ошибка: в качестве lvalue используется временное значение, хе. В любом случае, я думаю, что это работает только потому, чтоA
не является встроенным. - person Lightness Races in Orbit   schedule 10.03.2016operator=
не является исключением - person Slava   schedule 10.03.2016A
- это класс, поэтому правила значительно более мягкие. - person Lightness Races in Orbit   schedule 10.03.2016A{} = A{};
работает, см. Следующее: stackoverflow.com/questions/10897799/ - person NathanOliver   schedule 10.03.2016int{42} = 43;
должен компилироваться. Нет никаких веских причин разрешатьInt{42} = 43;
и запрещатьint{42} = 43;
, кроме того, никто не считал это достаточно важным, чтобы изменить это в стандарте. - person nwp   schedule 10.03.2016A{} = A{};
можно рассматривать какA{}.operator=( A{} );
- person Slava   schedule 10.03.2016