Odwołanie do wartości r to nowa funkcja języka w C ++ 11 reprezentująca odniesienie do wartości r. Wraz z zwijaniem referencji służą do implementacji i umożliwienia semantyki ruchu i doskonałego przekazywania.
Przyglądałem się niektórym nowym funkcjom C ++ 11 i zauważyłem, że podwójny znak & w deklaracji zmiennych, takich jak T&& var. Na początek, jak nazywa się ta bestia? Chciałbym, aby Google umożliwił nam wyszukiwanie takich znaków interpunkcyjnych. Co to dokładnie znaczy? Na pierwszy rzut oka wydaje się, że jest to …
W doskonałym przekazywaniu std::forwardsłuży do konwersji nazwanych odwołań do wartości t1i t2do nienazwanych odwołań do wartości. Jaki jest tego cel? Jak wpłynęłoby to na wywoływaną funkcję inner, gdybyśmy opuścili wartości t1& t2jako wartości? template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) { inner(std::forward<T1>(t1), std::forward<T2>(t2)); }
Próbuję zrozumieć odwołania do wartości i przenieść semantykę C ++ 11. Jaka jest różnica między tymi przykładami i który z nich nie wykona kopii wektorowej? Pierwszy przykład std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector(); Drugi przykład std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); …
Jak przechwycić przez ruch (znany również jako odwołanie do wartości r) w lambdzie C ++ 11? Próbuję napisać coś takiego: std::unique_ptr<int> myPointer(new int); std::function<void(void)> example = [std::move(myPointer)]{ *myPointer = 4; };
Właśnie pisałem generyczną fabrykę obiektów i korzystałem z meta-biblioteki preprocesora boost, aby stworzyć szablon wariadyczny (używając 2010 i nie obsługuje ich). Moja funkcja korzysta z referencji rval i std::forwardaby wykonać doskonałe przekazywanie, i pomyślałem ... kiedy pojawi się C ++ 0X i mam standardowy kompilator, zrobiłbym to z prawdziwymi szablonami …
Po prostu bawiłem się g ++ 4.7 (jedną z późniejszych migawek) z włączoną opcją -std = c ++ 11. Próbowałem skompilować część mojego istniejącego kodu i jeden przypadek, który się nie powiódł, nieco mnie zmylił. Byłbym wdzięczny, gdyby ktoś mógł wyjaśnić, co się dzieje. Oto kod: #include <utility> #include <iostream> …
Odkryłem, że lvaluezamknięcia lambda zawsze można przekazać jako rvalueparametry funkcji. Zobacz następującą prostą demonstrację. #include <iostream> #include <functional> using namespace std; void foo(std::function<void()>&& t) { } int main() { // Case 1: passing a `lvalue` closure auto fn1 = []{}; foo(fn1); // works // Case 2: passing a `lvalue` function …
Przykład: typedef enum Color { RED, GREEN, BLUE } Color; void func(unsigned int& num) { num++; } int main() { Color clr = RED; func(clr); return 0; } Podczas kompilacji pojawia się następujący błąd: <source>: In function 'int main()': <source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' …
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.