3. 2002
Започва работата
по C++0x
2003
“Бъг фикс” на ISO C++
Няма промяна в езика от
гледна точка на програмиста
2011
Публикуван е
стандарта C++11
Множество промени в
езика
2014
Публикуван е
стандарта C++14
2015
Работа по C++17
Приблизително 4,4 млн
потребителя на езика
4. auto
int func();
auto f = func(); // f е int
std::vector<int> v;
auto e = v.end(); // std::
vector<int>>::iterator
Типът автоматично се извлича при
инициализацията.
auto променлива не може да остане не
инициализирана.
Type deduction (Effective Modern C++).
5. range-based
цикли
std::list<std::string> list;
for( auto &s: list ) {
s.clear();
}
int sum = 0;
for( auto n: { 1, 2, 3, 4 } ) {
sum += n;
}
int a[] = {0, 1, 2, 3, 4, 5};
for(int n: a) {
std::cout << n << ' ';
}
Изпълпълнява цикъл върху контейнер.
{
auto && __range = range_expression;
for (auto __begin = begin_expr,
__end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
6. ламбда изрази
int var;
auto lam = [&var]( int param ) ->
bool {
return var == param;
}
if( lam(5) ) {
…
}
Конструира безименен функционален
обект, който може да прихваща
променливи.
Особено удобни за употреба заедно с
функциите, предоставени от <algorithm>.
Могат да се използват като слотове в
Qt5.
C++14 добавя генерализирани ламбда
изрази и възможност за изрази при
прихващенето.
7. constexpr constexpr int v = 10;
constexpr int make_value( int k ) {
return k + v;
}
class Point {
public:
constexpr Point( int _x, int _y )
noexcept: x{_x}, y{_y} {}
private:
int x;
int y;
};
Показва, че променливата или
функцията може да се използва в
константен израз.
Константните изрази се изпълняват по
време на компилация.
8. user-defined
literals constexpr uint64_t operator"" _KB (
unsigned long long int val )
{
return val * 1024;
}
uint64_t data_size = 2_KB;
Позволява целочислени, с плаваща
запетая или текстови литерали да
създават потребителки дефинирани
типове.
В С++14 STL предоставя готови
литерали за основни типове данни.
9. псевдоними // typedef std::ios_base::fmtflags flags;
using flags = std::ios_base::fmtflags;
// typedef void (*func)(int, int);
using func = void (*) (int,int);
// template type alias
template<class T> using ptr = T*;
// името 'ptr<T>' вече е псевдоним на
указател към типа T
ptr<int> x;
● Типови псевдоними - подобни на
typedef
● Шаблонни псевдоними
11. std::move
void use_vector( std::vector v ) { … }
std::vector big_vector;
// работа с big_vector
use_vector( big_vector));
// още работа с big_vector
void use_vector( std::vector v ) { … }
std::vector big_vector;
// работа с big_vector
use_vector( std::move(big_vector) );
// big_vector вече е празен, може
променливата да се преизползва
16. Очаквания за C++17
Concepts
Целта е да се подобри диагностиката на компилатора и програмистите да могат да
дават указания какви типове очакват.
Модули
Все още в много ранна фаза
Работа с файлова система
Базирана на boost::filesystem
Работа с мрежи
Базирана на boost::asio
17. C++ Core
Guidelines
1. C++ CG са резултат на много
човекогодини дискусии и
дизайн.
2. Целта е с насоките да се
помогне на хората ефективно
да пишат модерен С++ код
3. https://github.
com/isocpp/CppCoreGuideline
s
18. Guideline
Support Library
1. Съдържа типове,
предложени за употреба от
C++ CG
2. Цялата имплементация е във
хедъри
3. https://github.
com/Microsoft/GSL
19. Типове в GSL
span<T>
Обвивка около n-мерен масив, която не участва в управлението на живота му.
string_span<T>
Обвивка около char*, std::string и др. представяща текст. Има интерфейс много близък
до този на std::string
not_null<T>
Гарантира, че винаги държи указател от тип T, който не е nullptr
owner<T>
template <class T> using owner = T;
20. Типове в GSL
finally()
Създава обект, който в деструктора си извиква подадена функция или обект с
дефиниран operator()
...
auto clean_up = finally( [handle]() { close(handle); } );
...