В C++ 11 всегда будет перемещена локальная переменная std::vector
?
Для локальной переменной, даже параметр по значению, компилятор должен всегда попытка, чтобы переместить его первый (если ни движение, ни копия может быть опущены по каким-либо причинам, даже если эти критерии встретил). Если это не удается, он пытается снова с копией:
§12.8 [class.copy] p32
Когда критерии элизии операции копирования будут выполнены или будут выполнены за исключением того, что исходный объект является параметром функции, и объект, который нужно скопировать, обозначается lvalue, разрешение перегрузки для выбора конструктора для копии сначала выполняется так, как если бы объект был обозначен rvalue.Если сбой разрешения перегрузки или тип первого параметра выбранного конструктора не является ссылкой rvalue на тип объекта (возможно, cv-qualified), разрешение перегрузки выполняется снова, считая объект как lvalue. [Примечание: Это двухступенчатое разрешение перегрузки должно выполняться независимо от того, произойдет ли копирование. Он определяет вызывающий конструктор, если elision не выполняется, и выбранный конструктор должен быть доступен, даже если вызов отменяется. -end note]
Что делать, если этот вектор является членом локальной переменной вместо локальной переменной?
Субобъект не будет перемещен, поскольку это не соответствует критериям для копирования. (Который является немым, ИМХО, но вот как это в настоящее время. Я не думаю, что два должны быть связаны между собой, так как подобъектом может прекрасно быть перемещен, если он местный.)
Очевидно возвращение глобальной переменной будет не перемещаться. Какие другие случаи не будут перенесены?
Ссылка, очевидно, не будет перемещена. Кроме этого, я не могу думать ни о чем другом.
См. Также [этот вопрос] (http://stackoverflow.com/q/9532608/500104). – Xeo