Я пытаюсь запустить симуляцию на нашем высокопроизводительном сервере. К сожалению, он использует CentOS Linux версии 7.7.1908 (Core) вместо Win10, под которой я разрабатываю программу. Это привело к большому количеству ошибок, одну из которых я не смог исправить на:
#include <future>
#include <iostream>
int main(int argument_count, char** arguments) {
int i = 1234;
std::cout << "Initialized i" << std::endl;
std::promise<int> promise;
std::cout << "Constructed promise" << std::endl;
promise.set_value(std::move(i));
std::cout << "Set value" << std::endl;
std::future<int> future = std::move(promise.get_future());
std::cout << "Retrieved future" << std::endl;
int j = std::move(future.get());
std::cout << "Got value: " << j << std::endl;
return 0;
}
При компиляции в Win10 с помощью "cl test.cpp" вывод выглядит так, как будто я 'ожидаемое ожидание:
Рабочий стол> test.exe
Инициализированный i
Построенное обещание
Заданное значение
Полученное будущее
Полученное значение: 1234
С другой стороны, при компиляции на сервере с помощью "g ++ -std = c ++ 11 test.cpp" вывод будет другим:
~ / test_dir $ ./a.out
Инициализированный i
Построенное обещание
завершить вызов после выброса экземпляра 'std :: system_error'
what (): Неизвестная ошибка -1
Прервано
Я получаю ту же ошибку при попытке выполнить это на компьютере с Ubuntu 16.04.6 LTS. Я не понимаю, почему это происходит. Очевидно, что в этой строке что-то подозрительно: promise.set_value(std::move(i))
, поскольку вывод до выводится, а строка после этого оператора больше не выполняется. Кроме того, компилятор / компоновщик находит одну из двух версий "void set_value (const T & val);"или "void set_value (T && val);"это было бы уместно для спецификации шаблона "int", я сильно подозреваю, что позже.
Но почему программа прерывается при установке целого числа в качестве значения обещания? Даже когда встраивание значения и пропуск переменной вместе приводит к ошибке.
Может кто-нибудь указать мне, где ошибка?