struct TestConstRef {
    std::string str;
    Test(const std::string& mStr) : str{mStr} { }
};
struct TestMove {
    std::string str;
    Test(std::string mStr) : str{std::move(mStr)} { }
};
После просмотра GoingNative 2013 я понял, что аргументы приемника всегда должны передаваться по значению и перемещаться с помощью std::move. Является ли TestMove::ctor правильным способом применения этой идиомы? Есть ли случай, когда TestConstRef::ctor лучше/эффективнее?
Как насчет тривиальных сеттеров? Должен ли я использовать следующую идиому или передать const std::string&?
struct TestSetter {
    std::string str;
    void setStr(std::string mStr) { str = std::move(str); }
};