c++ openfest 2015
TRANSCRIPT
2002
Започва работата по C++0x
2003
“Бъг фикс” на ISO C++Няма промяна в езика от
гледна точка на програмиста
2011
Публикуван е стандарта C++11
Множество промени в езика
2014
Публикуван е стандарта C++14
2015
Работа по C++17Приблизително 4,4 млн потребителя на езика
autoint func();auto f = func(); // f е int
std::vector<int> v;auto e = v.end(); // std::vector<int>>::iterator
Типът автоматично се извлича при инициализацията.
auto променлива не може да остане не инициализирана.
Type deduction (Effective Modern C++).
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
} }
ламбда изразиint var;
auto lam = [&var]( int param ) -> bool {
return var == param;}
if( lam(5) ) {…
}
Конструира безименен функционален обект, който може да прихваща променливи.
Особено удобни за употреба заедно с функциите, предоставени от <algorithm>.
Могат да се използват като слотове в Qt5.
C++14 добавя генерализирани ламбда изрази и възможност за изрази при прихващенето.
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;};
Показва, че променливата или функцията може да се използва в константен израз.
Константните изрази се изпълняват по време на компилация.
user-defined literals
constexpr uint64_t operator"" _KB ( unsigned long long int val ){ return val * 1024;}
uint64_t data_size = 2_KB;
Позволява целочислени, с плаваща запетая или текстови литерали да създават потребителки дефинирани типове.
В С++14 STL предоставя готови литерали за основни типове данни.
псевдоними// typedef std::ios_base::fmtflags flags;using flags = std::ios_base::fmtflags;
// typedef void (*func)(int, int);using func = void (*) (int,int);
// template type aliastemplate<class T> using ptr = T*;
// името 'ptr<T>' вече е псевдоним на указател към типа Tptr<int> x;
● Типови псевдоними - подобни на typedef
● Шаблонни псевдоними
move семантика
class_name ( class_name && ) {...
}
class_name & class_name::operator= ( class_name && ) {
...}
● move конструктор● move оператор за присвояване● std::move● Return value optimization (RVO)
std::movevoid 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 вече е празен, може променливата да се преизползва
Return value optimization (RVO)class Thing {public:
Thing(); ~Thing(); Thing(const Thing&);};
Thing f() { Thing t; return t;}
Примерunique_ptr<T> do_stuff( unique_ptr<T> u ){ // just use T return u; // move или RVO}
int main(){ unique_ptr<T> p; // *p... p = do_stuff( move(p) ); // move // *p... return 0;}
void do_stuff( shared_ptr<MyClass> u ){ // just use MyClass // --ref count}
int main(){ shared_ptr<MyClass> p; // *p... do_stuff( p ); // ++ref count // *p... return 0;}
Очаквания за C++17
ConceptsЦелта е да се подобри диагностиката на компилатора и програмистите да могат да дават указания какви типове очакват.
МодулиВсе още в много ранна фаза
Работа с файлова системаБазирана на boost::filesystem
Работа с мрежиБазирана на boost::asio
C++ Core Guidelines
1. C++ CG са резултат на много човекогодини дискусии и дизайн.
2. Целта е с насоките да се помогне на хората ефективно да пишат модерен С++ код
3. https://github.com/isocpp/CppCoreGuidelines
Guideline Support Library
1. Съдържа типове, предложени за употреба от C++ CG
2. Цялата имплементация е във хедъри
3. https://github.com/Microsoft/GSL
Типове в 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;
Типове в GSL
finally()Създава обект, който в деструктора си извиква подадена функция или обект с дефиниран operator()
...auto clean_up = finally( [handle]() { close(handle); } );...