Некоторые уточнения по ссылкам

Первое: гдеstd::move а такжеstd::forward определены? Я знаю, что они делают, но не могу найти доказательств того, что для их включения требуется какой-либо стандартный заголовок. В gcc44 иногдаstd::move имеется, а иногда нет, поэтому будет полезна определенная директива include.

При реализации семантики перемещения источник предположительно остается в неопределенном состоянии. Должно ли это состояние быть действительным для объекта? Очевидно, что вы должны иметь возможность вызывать деструктор объекта и иметь возможность назначать ему любым способом, который предоставляет класс. Но должны ли другие операции быть действительными? Я полагаю, что я спрашиваю: если ваш класс гарантирует определенные инварианты, следует ли вам стремиться применять эти инварианты, когда пользователь сказал, что они больше не заботятся о них?

Далее: если вас не волнует семантика перемещения, существуют ли какие-либо ограничения, которые могут привести к тому, что неконстантная ссылка будет предпочтительнее ссылки на rvalue при работе с параметрами функции?void function(T&); надvoid function(T&&); С точки зрения вызывающего, возможность передавать временные значения функций иногда бывает полезна, поэтому кажется, что эту возможность следует предоставлять всякий раз, когда это возможно. И ссылки на rvalue сами по себе являются lvalues, так что вы не можете непреднамеренно вызвать конструктор перемещения вместо конструктора копирования или что-то в этом роде. Я не вижу недостатков, но уверен, что есть.

Что подводит меня к моему последнему вопросу. Вы все еще не можете привязать временные ссылки к неконстантным ссылкам. Но вы можете связать их с неконстантными ссылками. И затем вы можете передать эту ссылку как неконстантную ссылку в другой функции.

void function1(int& r) { r++; }
void function2(int&& r) { function1(r); }
int main() { 
    function1(5); //bad
    function2(5); //good
}

Помимо того, что он ничего не делает, есть что-то не так с этим кодом? Моя интуиция говорит, конечно, нет, так как изменение ссылок на значения является своего рода смыслом их существования. И если переданное значение законно константно, компилятор поймает его и закричит на вас. Но, судя по всему, это обходной механизм, который предположительно был задействован по какой-то причине, поэтому я просто хотел бы получить подтверждение, что я не делаю ничего глупого.

Ответы на вопрос(3)

Ваш ответ на вопрос