Как указано в конструкторе std::future
:
Будущие объекты, построенные по умолчанию, недействительны
Это просто означает вызов конструктора по умолчанию для объекта, например:
std::future<int> f;
Это вызовет конструктор №1, в котором указано:
Конструктор по умолчанию. Создает std::future без общего состояния. После строительства, valid() == false
.
Что касается другой части:
(если перемещение не назначено действительным будущим)
Здесь имеется в виду, что будет вызван конструктор перемещения (future( future&& other )
#2), в котором указано:
Переместить конструктор. Создает std::future с общим состоянием other, используя семантику перемещения. После строительства other.valid() == false
.
По сути, состояние other
в этом конструкторе перемещено в this
. Это означает, что если other.valid() == true
, то после возврата конструктора перемещения other.valid()
будет false
, а this.valid()
будет true
. Если other.valid()
было false
в начале, то в итоге оба получат false
.
std::future<int> fut; // fut.valid() == false, default constructor
std::future<int> valid_fut = std::async(std::launch::async, [](){ return 42; }); // obtain a valid std::future..
// valid_fut.valid() == true here
//now move valid_fut into new_fut
std::future<int> new_fut(std::move(valid_fut));
// new_fut.valid() == true
// valid_fut.valid() == false
Обобщить:
Вызов конструктора по умолчанию для std::future
приведет к valid() == false
. Всегда.
Вызов конструктора перемещения для std::future
приведет к valid() == true
только, если other.valid()
было true
перед перемещением из него. Ложь в противном случае.
person
Hatted Rooster
schedule
31.10.2016
std::future
заключается в том, что ни один из его конструкторов или методы могут сделать будущий объект действительным. - person Raedwald   schedule 25.04.2018