C++11 - najprzydatniejsze zmiany

0

Z góry przepraszam jeśli były jakieś podobne tematy, ale nie udało mi się znaleźć.

Pytanie moje jest krótkie, co z C++11 jest warte uwagi do nauczenia się oprócz inteligentnych wskaźników? Ciężko mi było znaleźć stronę, na której ktoś fajnie opisał najważniejsze zmiany, a nie wszystkie. No i chciałbym wiedzieć na co warto w ogóle zwrócić uwagę z tego standardu. NoName mi podsunął shared_ptr, no i przyznam, że na prawdę fajnie się z niego korzysta. Pewnie jest trochę fajnych rzeczy jeszcze w tym standardzie, a sam nie wiem na co zwrócić uwagę. Widziałem dużo dyskusji o lambdzie przykładowo.

2

srsly? http://www.cplusplus.com/reference/ masz tu oznaczone co jest z c++11.
Ciekawe rzeczy? regexpy, hashmapa (unordered_map)

2

o C++11 można długo, ale do najprzydatniejszych zmian zaliczyłbym:

vector<vector<int>> bez konieczności głupiej spacji w > >.
auto
nullptr
for (int i : w) zamiast potwora z iteratorem
vector<int> w = {1,2,3,4}; zamiast litanii push_backów
override, default, delete
long long (tak jest! wcześniej nie było w standardzie..)

celowo skupiam się na drobnych rzeczach, bo choć uważam że np. lambdy to ogromna zmiana, to wcale nie są tak znowu mega-przydatne...

1

Tu jest dłuuuuga lista:
http://en.wikipedia.org/wiki/C%2B%2B11

Jakiś skrócony opis znaleziony:
http://www.codeproject.com/Articles/570638/Ten-Cplusplus11-Features-Every-Cplusplus-Developer

Do rzeczy wymienionych przez azariena (nie wiem czy są wszystkie najprzydatniejsze, ale z tych ważniejszych) dodałbym:

  • move semantics!
  • extern templates
  • override (chociaż trochę słabe)
  • wsparcie dla wielowątkowości

Jest tego więcej (jak np. zmniejszenie wymagań na unie, 'silne' enumy albo własne literały), ale o tym przeczytasz na wiki.

0

Jako ciekawostkę podam, że w Visual C++ działa coś takiego:

#include <Windows.h>

int main()
{
	WNDCLASS wc;
	wc.lpfnWndProc=[](HWND h, UINT m, WPARAM w, LPARAM l)->LRESULT
	{
		if (m==WM_CLOSE)
			PostQuitMessage(0);
		else
			return DefWindowProc(h,m,w,l);
		return 0;
	};
	...
}

a w GCC się nie kompiluje. Dlaczego? lpfnWndProc jest wskaźnikiem na funkcję, ale wymusza konwencję stdcall. Visual najwyraźniej potrafi automatycznie dopasować konwencję wywołania lambdy, GCC ma na sztywno cdecl.

0

Najprzydatniejsza zmiana to dodanie wielowątkowości do standardu. Reszta to kosmetyka ;)

0

Variadic templates to bardzo dobra rzecz. Np. w booscie wiele szablonów generowanych jest Perlem albo innym ustrojstwem i obsługuje maksymalnie X parametrów. Dzięki variadic templates można to wszystko przerobić na ładny kod C++. Kolejną przydatną rzeczą są Template aliases ułatwiające pracę z szablonami - nie trzeba kombinować dziwnych "klasotypedefów". explicit dla operatorów też jest się przydaje - dzięki temu safe bool idiom jest zupełnie zbędny. W C++11 podjęto też próbę ujednolicenia składni atrybutów funkcji ale nie wiem czy kompilatory przeszły ze swoich rozwiązań na to.

Jeżeli chodzi o bibliotekę to chyba wszystko jest bardzo przydatne: wyrażenia regularne, wątki, hashmapy, smart pointery, obsługa czasu, liczby pseudolosowe, type traits, std::function...

0

Z tego co napisaliście dla mnie najlepsze:

  • std::thread - aż dziw że dopiero teraz
  • nullptr
  • std::initializer_list - http://en.cppreference.com/w/cpp/utility/initializer_list
  • std::to_string - chociaż można to zrobić samemu, ale fajnie że w standardzie (wreszcie, Java od kiedy to ma?)
  • move semantics - chociaż dla mnie to dziwna decyzja, coś podobnego mam stosując własny "sprytny" wskaźnik, nie wiem co specjalnego mi daje &&
  • override - to powinno być od zawsze (pomysł pewnie z Pascala)
  • "long long"
  • Variadic templates

Ta lista wygląda trochę jak "must have" a nie "fajne dodatki". Coś co powinno być od dawna, ale pewnie ciężko było przekonać komitet standaryzacyjny.

1

No ale dyskusja na temat nowego standardu prowadzona juz byla na forum i to dosyc dlugo. http://4programmers.net/Forum/C_i_C++/201193-c++11_-_przedluzanie_agonii_czy_zbawienie_dla_c++
Po co nowy temat? Mi sie udalo znalezc.

1

@offtop

• vector<int> w = {1,2,3,4}; zamiast litanii push_backów

Też przyjąłem to z ulgą i cichym "nareszcie". Zamiast litanii push_back'ów czasami i pod pewnymi warunkami można zrobić coś takiego:

int tmp[4] = {1,2,3,4};
vector<int> buff;
std::copy(tmp,tmp+4,std::back_inserter(buff));
0
several napisał(a):

@offtop

• vector<int> w = {1,2,3,4}; zamiast litanii push_backów

Też przyjąłem to z ulgą i cichym "nareszcie". Zamiast litanii push_back'ów czasami i pod pewnymi warunkami można zrobić coś takiego:

int tmp[4] = {1,2,3,4};
vector<int> buff;
std::copy(tmp,tmp+4,std::back_inserter(buff));

Można prościej:

int tmp[4] = {1,2,3,4};
vector<int> v(tmp, tmp+4);

http://ideone.com/Cvsa3G

0

najbardziej zabawne jest, że to się teraz kompiluje:

[](){}();

;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1