Гарантированная копия Elision (с формулировкой ). Лямбда здесь на самом деле красная сельдь.
В C ++ 14 это:
auto barlam = [bar]{};
по-прежнему требует, чтобы конструкция хода была действительной (даже если вы не хотите, чтобы это движение и в любом случае это движение, скорее всего, было бы отменено). Но эта лямбда не является движущейся конструкцией, потому что Bar
не является движущейся конструкцией. Foo
является конструируемым на ходу, поэтому foolam
работает нормально.
Не лямбда-версия этого будет:
auto bar = Bar{}; // error in C++14
auto foo = Foo{}; // ok
В C ++ 17 это не конструкция перемещения - мы просто напрямую инициализируем целевой объект. В каком-то смысле мы идем по этому пути. С другой стороны, по языковым правилам вообще нет никакого движения. Итак, это:
auto bar = Bar{};
в точности эквивалентно:
Bar bar{};
То же самое относится к лямбде.