Archive

Posts Tagged ‘C++11’

Досконала переадресація

Загальна форма проблеми переадресації має такий вигляд:

Для заданого виразу E(a1, a2, ..., an), що залежить від (шаблонних) параметрів a1, a2, ..., an, написати функцію (об’єкт) f такий, що виклик f(a1, a2, ..., an) тотожний виклику E(a1, a2, ..., an).

Стандарт C++11 уможливив створення таких функцій (об’єктів) завдяки rvalue посиланням.

Розглянемо просту функцію-фабрику:

template<typename T, typename Arg> 
shared_ptr<T> factory(Arg arg)
{ 
  return shared_ptr<T>(new T(arg));
}

Читати далі…

Категорії:C++ Позначки:, ,

Rvalue посилання: C++0x можливості в VC10

л- та п-значення в C++98/03

Для розуміння правосторонніх посилань (rvalue reference) в C++0x, ви маєте розуміти лівосторонні й правосторонні значення в C++98/03.

Терміни ‘л-значення’ та ‘п-значення’ викликають плутанину, це пов’язано з їхньою історією. Ці поняття прийшли з С і тоді стали частиною C++. Для збереження часу, ми проминемо їхню історію, включно з причинами чому вони називаються ‘л-значення’ та ‘п-значення’ й одразу розглянемо як вони працюють в C++98/03. (Добре, це не велика таємниця, що ‘Л’ означає ‘лівий’, а ‘R’ – ‘правий’. Але самі поняття розвинулись і змінились, і тепер їхні назви не дуже точні. Замість прослуховування уроку з історії їх появи, ви можете уявити, що вони мають довільні назви, приміром, ‘верхня частка’ та ‘нижня частка’, і при цьому ви нічого не втратите.)

C++03 3.10/1 каже: ‘Кожен вираз є або л-значенням або п-значенням.’ Важливо пам’ятати, що л- або п-значеннєвість це властивість виразу, а не об’єкта.
Читати далі…

Категорії:Uncategorized Позначки:,

Лямбда-вирази, auto та static_assert: C++0x можливості в VC10

Лямбда-вирази

В C++0x, “лямбда-вирази” непрямим чином створюють функцональні об’єкти, які потім поводяться як функціональні об’єкти написані вручну. Наведемо “Hello, World” лямбда-вираз:

#include <algorithm>
#include <iostream>
#include <ostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;

    for (int i = 0; i < 10; ++i)
        v.push_back(i);

    for_each(v.begin(), v.end(), [](int n) { cout << n << " "; });
    cout << endl;
}

0 1 2 3 4 5 6 7 8 9
Читати далі…

Категорії:Перекладені Позначки:,