Const Kills The Move

#include <iostream>
#include <string>
#include <utility>
#include <vector>

struct Loud {
    std::string s;
    Loud(std::string v) : s(std::move(v)) {}
    Loud(const Loud& o) : s(o.s) { std::cout << "copy\n"; }
    Loud(Loud&& o) noexcept : s(std::move(o.s)) { std::cout << "move\n"; }
};

int main() {
    const Loud a{"alpha"};
    Loud b{std::move(a)};        // (1)

    std::vector<Loud> v;
    v.reserve(2);
    Loud c{"gamma"};
    v.push_back(std::move(c));   // (2)
}

What does this print?

A

Nothing: both initializations are elided.

B
copy
move
C
move
move
D
copy
copy