Следующего код, составленный на VS2013, не вызывает перемещение конструктора StD :: струны (проверяется с помощью установки контрольных точек, сопзИте конструктор иой копии вызывается вместо.Почему следующий код не вызывает конструктор перемещения std :: string?
#include <iostream>
#include <string>
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
struct foo
{
foo(std::string& str1, std::string& str2) : _str1(str1), _str2(str2) {}
~foo() { std::cout << "Either \"" << _str1 << "\" or \"" << _str2 << "\" was returned." << std::endl; }
std::string& _str1;
std::string& _str2;
};
std::string foobar()
{
std::string str1("Hello, World!");
std::string str2("Goodbye, cruel World.");
foo f(str1, str2);
srand(time(NULL));
return (rand() % 2) ? str1 : str2;
}
int main()
{
std::cout << "\"" << foobar() << "\" was actually returned." << std::endl;
return EXIT_SUCCESS;
}
Я хотел бы ожидать заявление возвращения в Foobar() для вызова конструктора перемещения, так как я возвращаю локальный (rand() предназначен для предотвращения NRVO), как указано в качестве ответов на такие вопросы, как Returning std::move of a local variable
Контекст этого заключается в том, что я пытаюсь добавить еще один пример для моего другого вопроса здесь: https://softwareengineering.stackexchange.com/questions/258238/move-semantics-in-c-move-return-of-local-variables
ли использовать конструктор перемещения, если вы удалите 'Foo' определение переменной? Я бы предположил, что компилятор достаточно умен, чтобы знать, что вы сделали ссылку на строки, что делает движение недействительным (опять же, предположение). – uesp
Нет, он по-прежнему использует конструктор копирования, если я это сделаю. – Bwmat
«Пробовать rvalue first» для возвратов относится только «если критерии соответствия копии выполнены или будут выполнены, за исключением того факта, что исходный объект является параметром функции». В C++ 14 он распространяется на все случаи, когда оператор return напрямую ссылается на локальный объект. (См. [Этот ответ] (http://stackoverflow.com/questions/25875596/can-returning-a-local-variable-by-value-in-c11-14-result-in-the-return-value-b/25876175 # 25876175) для полной цитаты из стандарта.) Ваше условное выражение не является ни тем, ни другим. –