Мне любопытно, есть ли какая-либо разница (для компилятора) между этими двумя. Единственная разница между ними заключается в том, что ValueClass принимает параметр в конструкторе по ссылке
#include <string>
class ValueClass
{
public:
ValueClass(std::string obj) : m_obj(std::move(obj)) {}
private:
std::string m_obj;
};
class MoveClass
{
public:
MoveClass(std::string&& obj) : m_obj(std::move(obj)) {}
private:
std::string m_obj;
};
void SomeFunc()
{
std::string a, b;
a = "a";
b = "b";
ValueClass c(std::move(a));
MoveClass d(std::move(b));
}
Я быстро проверил goldbolt , и он действительно выглядитподобно тому, как вызов конструктора MoveClass приводит к меньшему количеству строк сборки (при условии, что godbolt точен и не приписывает какие-либо строки сборки неправильно).
Таким образом, мой вопрос становится таким: почему есть разница? Настраивает ли компилятор какое-то временное хранилище, в которое строка перемещается, а затем сразу же выходит из нее?
Теоретически это должно быть оптимизировано? В таком случае, являются ли различия исключительно для программиста наполнением сигнатуры функции большим значением и информацией, чтобы ее было легче понять тем, кто захочет ее вызвать?