Когда обещание будет разрешено / отклонено, оно вызовет его обработчик успеха / ошибки:
var promiseB = promiseA.then(function(result) {
// do something with result
});
Метод then
также возвращает обещание: promB, которое будет разрешено / отклонено в зависимости от возвращаемое значение из обработчика успеха / ошибки из обещания.
Есть три возможных значения, которые могут быть возвращены обработчикам успеха / ошибок, которые повлияют на результат результата:
1. Return nothing --> PromiseB is resolved immediately,
and undefined is passed to the success handler of promiseB
2. Return a value --> PromiseB is resolved immediately,
and the value is passed to the success handler of promiseB
3. Return a promise --> When resolved, promiseB will be resolved.
When rejected, promiseB will be rejected. The value passed to
the promiseB's then handler will be the result of the promise
Вооружено это понимание, вы можете понять следующее:
promiseB = promiseA.then(function(result) {
return result + 1;
});
Затем вызов немедленно возвращает обещаниеB. Когда обещание будет разрешено, оно передаст результат, чтобы обещать успешный обработчик. Поскольку возвращаемое значение является результатом promA + 1, обработчик успеха возвращает значение (вариант 2 выше), так что обещаниеB будет немедленно устранено, а обработчик успеха пообещания будет передан с обещанием результата + 1.
Это недостаток языка C ++. Вы не можете взять адрес ссылки, так как попытка сделать это приведет к адресу адреса, на который ссылается, и, следовательно, вы никогда не сможете получить указатель на ссылку. std::vector
работает с указателями на его элементы, поэтому для сохранения значений нужно указывать. Вместо этого вам придется использовать указатели.
По самой своей природе ссылки могут быть установлены только в момент их создания; т. е. следующие две строки имеют очень разные эффекты:
int & A = B; // makes A an alias for B
A = C; // assigns value of C to B.
Futher, это незаконно:
int & D; // must be set to a int variable.
Однако, когда вы создаете вектор, присваивать значения своим элементам при создании. Вы, по сути, просто делаете целую кучу последнего примера.
boost::ptr_vector<int>
будет работать.
Edit: было предложено использовать std::vector< boost::ref<int> >
, который не будет работать, потому что вы не можете по умолчанию построить boost::ref
.
Ион Тодирель уже упомянул ответ ДА, используя std::reference_wrapper
. Начиная с C ++ 11 у нас есть механизм для извлечения объекта из std::vector
и удаления ссылки с помощью std::remove_reference
. Ниже приведен пример, скомпилированный с использованием g++
и clang
с опцией -std=c++11
и выполнен успешно.
#include <iostream>
#include <vector>
#include<functional>
class MyClass {
public:
void func() {
std::cout << "I am func \n";
}
MyClass(int y) : x(y) {}
int getval()
{
return x;
}
private:
int x;
};
int main() {
std::vector<std::reference_wrapper<MyClass>> vec;
MyClass obj1(2);
MyClass obj2(3);
MyClass& obj_ref1 = std::ref(obj1);
MyClass& obj_ref2 = obj2;
vec.push_back(obj_ref1);
vec.push_back(obj_ref2);
for (auto obj3 : vec)
{
std::remove_reference<MyClass&>::type(obj3).func();
std::cout << std::remove_reference<MyClass&>::type(obj3).getval() << "\n";
}
}
std::remove_reference<>
здесь. Точка std::remove_reference<>
должна позволять вам писать «тип T», но без ссылки, если она одна ». Таким образом, std::remove_reference<MyClass&>::type
- это то же самое, что и запись MyClass
.
– alastair
18 February 2016 в 18:36
for (MyClass obj3 : vec) std::cout << obj3.getval() << "\n";
(или for (const MyClass& obj3: vec)
, если вы объявите getval()
const, как и должны).
– Toby Speight
24 May 2017 в 09:32
Тип компонента контейнеров, таких как векторы, должен быть присваиваемым . Ссылки не назначаются (вы можете их инициализировать только один раз, когда они объявлены, и вы не можете заставить их ссылаться на что-то еще позже). Другие не назначаемые типы также не допускаются как компоненты контейнеров, например. vector<const int>
не разрешено.
Как уже упоминалось, вы, вероятно, в конечном итоге используете вектор указателей.
Однако вы можете захотеть вместо этого использовать ptr_vector !
Как показывают другие комментарии, вы ограничены использованием указателей. Но если это помогает, вот один из способов избежать прямого обращения с указателями.
Вы можете сделать что-то вроде следующего:
vector<int*> iarray;
int default_item = 0; // for handling out-of-range exception
int& get_item_as_ref(unsigned int idx) {
// handling out-of-range exception
if(idx >= iarray.size())
return default_item;
return reinterpret_cast<int&>(*iarray[idx]);
}
да, вы можете найти std::reference_wrapper
, который имитирует ссылку, но назначается, а также может быть «повторно установлен»
get()
первым при попытке доступа к методу экземпляра класса в этой оболочке? Например. reference_wrapper<MyClass> my_ref(...); my_ref.get().doStuff();
не очень напоминает.
– timdiels
17 October 2014 в 16:40
sizeof
ссылку. – David Schwartz 17 May 2016 в 00:11