Я написал функцию c ++, которая собирает некоторые данные, а затем возвращает std::shared_ptr
во вновь распределенную std::vector
, содержащую данные. Нечто аналогичное этому:
std::shared_ptr<std::vector<int>> shared_ptr_to_std_vector_of_ints()
{
auto v = std::make_shared<std::vector<int>>();
for (int i = 0; i < 3; i++) v->push_back(i);
return v;
}
Я попытался перебрать содержимое вектора, используя цикл for на основе диапазона, но он действовал так, как будто вектор был пустым. Поигравшись, я обнаружил, что могу заставить его вести себя так, как я ожидал, присваивая значение, возвращаемое функцией, локальной переменной, а затем ссылаясь на это в цикле:
// Executes loop zero times:
std::cout << "First loop:" << std::endl;
for (int i : *shared_ptr_to_std_vector_of_ints()) std::cout << i << std::endl;
// Prints three lines, as expected
std::cout << "Second loop:" << std::endl;
auto temp = shared_ptr_to_std_vector_of_ints();
for (int i : *temp) std::cout << i << std::endl;
Отрезанный печатает это:
First loop:
Second loop:
1
2
3
Почему не работает первая версия?
Я использую Xcode в macOS Sierra 10.12.6. Я считаю, что он использует LLVM 9.0 для компиляции кода C ++.