Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 99, средняя оценка - 4.74
Dragokas
Эксперт WindowsАвтор FAQ
15748 / 6596 / 793
Регистрация: 25.12.2011
Сообщений: 10,185
Записей в блоге: 16
#1

Десять возможностей C++11, которые должен использовать каждый C++ разработчик - C++

11.06.2013, 23:51. Просмотров 12151. Ответов 14
Метки нет (Все метки)

Обсуждаем статью: http://habrahabr.ru/post/182920/

Надо же этот раздел немного оживить
Я, естественно, не участвую. ^_^
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2013, 23:51     Десять возможностей C++11, которые должен использовать каждый C++ разработчик
Посмотрите здесь:
C++ Каждый член натурального ряда от 10 до 20 уменьшить в десять раз. Подсчитать произведение
C++ Какой суммарный путь пробежит спортсмен за 7 дней, увеличивая каждый день его на десять процентов?
C++ Какой суммарный путь пробежит спортсмен за 7 дней, увеличивая каждый день его на десять процентов? Перевести с паскаля.
C++ Создать программу, которая будет последовательно предлагать пользователю десять случайных примеров, проверяющих знание таблицы умножения (каждый из со
Определить сколько должен заплатить каждый пассажир такси C++
Каждый созданный экземпляр класса должен увеличивать значение счетчика на 1 C++
Реализовать систему плагинов (модулей), каждый из которых должен работать в отдельном потоке C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
12.06.2013, 00:30     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #2
Dragokas, А что обсуждать?) Все четко. Действительно ОК возможности нового стандарта
Dragokas
Эксперт WindowsАвтор FAQ
15748 / 6596 / 793
Регистрация: 25.12.2011
Сообщений: 10,185
Записей в блоге: 16
12.06.2013, 00:43  [ТС]     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #3
Да, собственно, хотел, чтобы многие могли ознакомится со статьей.
Более подходящего места не нашел.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2013, 20:41     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #4
Почитал статью. В целом толковый поверхностный обзор. Не понял почему в "copy assignment operator" автор использует:
C++
1
if(this != &copy)
а в "move assignment operator":
C++
1
assert(this != &temp);
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
13.06.2013, 09:22     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #5
Tulosba, Я так понимаю, потому что move подразумевает порчу перемещаемого объекта (к примеру для указателей установка в nullptr).
Итого, если мы муваем объект в сам себя - мы просто делаем объект не валидным, ничего с этого не имея.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
 
template<typename T>
class Pointer
{
public:
   Pointer() : pointer_(nullptr)
   {
   }
   Pointer(T* ptr) : pointer_(ptr)
   {
   }
   ~Pointer()
   {
      delete pointer_;
   }
   Pointer(Pointer&& rhs) : pointer_(rhs.pointer_)
   {
      rhs.pointer_ = nullptr;
   }
   Pointer& operator = (Pointer&& rhs)
   {
      std::swap(rhs.pointer_, pointer_);
      rhs.pointer_ = nullptr;
      return *this;
   }
   explicit operator bool() { return pointer_; }
private:
   Pointer(const Pointer&) = delete;
   Pointer& operator = (const Pointer&) = delete;
 
   T* pointer_;
};
 
int main()
{
   Pointer<int> ptr(new int(1));
   std::cout << "Is valid: " << static_cast<bool>(ptr) << std::endl;
   ptr = std::move(ptr);
   std::cout << "Is valid: " << static_cast<bool>(ptr) << std::endl;
}
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.06.2013, 12:54     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #6
ForEveR, по-моему, мы немного о разных вещах говорим. Мне не очень понятно, в каком случае
this == &temp. Если temp это rvalue, то он должен быть уникальным.

И, кстати, тут же будет утечка памяти:
C++
1
2
3
4
5
Pointer& operator = (Pointer&& rhs)
{
   std::swap(rhs.pointer_, pointer_);
   rhs.pointer_ = nullptr; // Потеряли память, которую держал this
}
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
13.06.2013, 14:24     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #7
Tulosba, Утечка только в случае, если мы муваем один объект в себя же.
rhs это lvalue. И его адрес будет равен this. rvalue станет только при раскладе, что мы юзаем forward/move.

C++
1
2
3
4
5
6
7
8
   Pointer& operator = (Pointer&& rhs)
   {
      assert((this != &rhs) && "Invalid move operation");
      std::swap(rhs.pointer_, pointer_);
      rhs.pointer_ = nullptr;
   }
 
   ptr = std::move(ptr);
ассерт сработает.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
 
class C
{
public:
   C() {}
   C(C&& rhs)
   {
      std::cout << "Move" << std::endl;
   }
   C(const C& rhs)
   {
      std::cout << "Copy" << std::endl;
   }
};
 
class D
{
public:
   D(C&& c_) : c(c_) {}
private:
   C c;
};
 
int main()
{
   C c;
   D d(std::move(c)); 
}
Вывод будет Copy
C++
1
D(C&& c_) : c(std::move(c_)) {}
Вывод будет Move.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.06.2013, 14:30     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Утечка только в случае, если мы муваем один объект в себя же.
Так ведь до обнуления rhs.pointer_ (5 строка) надо ж освободить память (деструктор ведь потом ничего не сделает, т.к. указатель сброшен).
Цитата Сообщение от ForEveR Посмотреть сообщение
что мы юзаем forward/move.
это что за зверь?
И всё-таки почему тогда assert? В релизе же проверки не будет.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
13.06.2013, 14:33     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #9
Tulosba, Зачем, если мы свапаем указатель и получаем новый объект? При нормальном раскладе утечки не будет (свопнули, установили прошлый в nullptr, объект который мы переместили теперь не валиден, в который переместили - валиден, при выходе из области видимости данного объекта будет вызван деструктор, который все и почистит). Вероятно, заюзан ассерт, потому что это просто пример. Ну про std::forward/std::move полагаю проще почитать, чем объяснять тут.

Вот тут: http://stackoverflow.com/questions/3...move-semantics можно почитать. Довольно здраво написано. В частности второй ответ.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.06.2013, 14:59     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Зачем, если мы свапаем указатель и получаем новый объект?
Возможно проще будет рассмотреть std::unique_ptr, т.к. задачи схожие (взял из VS 2012):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
_Myt& operator=(_Myt&& _Right) _NOEXCEPT
    {   // assign by moving _Right
    if (this != &_Right)
        {   // different, do the move
        reset(_Right.release());
        this->get_deleter() = _STD forward<_Dx>(_Right.get_deleter());
        }
    return (*this);
    }
 
pointer release() _NOEXCEPT
    {   // yield ownership of pointer
    pointer _Ans = this->_Myptr;
    this->_Myptr = pointer();
    return (_Ans);
    }
 
void reset(pointer _Ptr = pointer()) _NOEXCEPT
    {   // establish new pointer
    if (_Ptr != this->_Myptr)
        {   // different pointer, delete old and reassign
        _Delete();
        this->_Myptr = _Ptr;
        }
    }
Я вот как раз хочу сказать о _Delete() внутри reset. Которого в классе Pointer я собственно не наблюдаю.

Добавлено через 29 секунд
Цитата Сообщение от ForEveR Посмотреть сообщение
Ну про std::forward/std::move полагаю проще почитать, чем объяснять
окей
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
13.06.2013, 15:06     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #11
Tulosba, Да, согласен, нужно там конечно удалить this->pointer_. Протормозил, не понял, о чем ты говоришь.

Добавлено через 1 минуту
Так будет ок.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
 
template<typename T>
class Pointer
{
public:
   Pointer() : pointer_(nullptr)
   {
   }
   Pointer(T* ptr) : pointer_(ptr)
   {
   }
   ~Pointer()
   {
      delete pointer_;
   }
   Pointer(Pointer&& rhs) : pointer_(rhs.pointer_)
   {
      rhs.pointer_ = nullptr;
   }
   Pointer& operator = (Pointer&& rhs)
   {
      delete pointer_;
      std::swap(rhs.pointer_, pointer_);
      rhs.pointer_ = nullptr;
      return *this;
   }
   explicit operator bool() { return pointer_; }
private:
   Pointer(const Pointer&) = delete;
   Pointer& operator = (const Pointer&) = delete;
 
   T* pointer_;
};
 
int main()
{
   Pointer<int> ptr(new int(1));
   std::cout << "Is valid: " << static_cast<bool>(ptr) << std::endl;
   ptr = std::move(ptr);
   std::cout << "Is valid: " << static_cast<bool>(ptr) << std::endl;
}
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.06.2013, 15:07     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #12
ForEveR, уф. Ну ладно, хоть разобрались
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
30.06.2013, 16:52     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
А вот сегодня появился небольшой обзор новых возможностей С++14. Дабы не плодить подобные темы, оставлю ссылку здесь.

Не по теме:

Понравился комент на хабре

С такими темпами компилятор С++ скоро осознает себя и начнёт захватывать мир.

ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
30.06.2013, 18:36     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #14
@Kastaneda, Читал про данные возможности в разнобой (на isocpp.org/stackoverflow), а вот то, что на хабре выложили все обобщенно - это круто. Большое спасибо за ссылку!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 13:34     Десять возможностей C++11, которые должен использовать каждый C++ разработчик
Еще ссылки по теме:
Вычислить количество поворотов, которые должен выполнить планетоход в процессе исследования C++
C++ Почему в setnamedisc нужно использовать char * для установки значения, а при возвращении значения тип метода должен быть char* ?
Описать абстрактный класс породить от него еще два,один должен остаться абстрактным,другой должен быть способен пораждать объекты C++
Как можно удобно использовать сеты иконок, которые в одном файле? C++ Builder
C++ Файл: Вывести на экран результаты 3 файлов, которые содержат отдельно каждый букви, цифры, и знаки препинания...

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.07.2013, 13:34     Десять возможностей C++11, которые должен использовать каждый C++ разработчик #15
http://stackoverflow.com/questions/1...s-for-this-for

имхо - попахивает overengineering
Yandex
Объявления
15.07.2013, 13:34     Десять возможностей C++11, которые должен использовать каждый C++ разработчик
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru