Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/69: Рейтинг темы: голосов - 69, средняя оценка - 4.91
Dragokas
Эксперт WindowsАвтор FAQ
16966 / 7051 / 856
Регистрация: 25.12.2011
Сообщений: 10,861
Записей в блоге: 16
#1

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

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

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

Надо же этот раздел немного оживить
Я, естественно, не участвую. ^_^
14
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2013, 23:51
Ответы с готовыми решениями:

Каждый второй элемент массива увеличить на десять
Каждый второй элемент массива увеличить на десять Сделать через if Помогите...

Каждый член натурального ряда от 10 до 20 уменьшить в десять раз. Подсчитать произведение
Каждый член натурального ряда от 10 до 20 уменьшить в десять раз. Подсчитать...

Какой суммарный путь пробежит спортсмен за 7 дней, увеличивая каждый день его на десять процентов?
1.Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый день он...

Какой суммарный путь пробежит спортсмен за 7 дней, увеличивая каждый день его на десять процентов? Перевести с паскаля.
Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый день он...

Создать программу, которая будет последовательно предлагать пользователю десять случайных примеров, проверяющих знание таблицы умножения (каждый из со
Создать программу, которая будет последовательно предлагать пользователю десять...

14
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.06.2013, 00:30 #2
Dragokas, А что обсуждать?) Все четко. Действительно ОК возможности нового стандарта
0
Dragokas
Эксперт WindowsАвтор FAQ
16966 / 7051 / 856
Регистрация: 25.12.2011
Сообщений: 10,861
Записей в блоге: 16
12.06.2013, 00:43  [ТС] #3
Да, собственно, хотел, чтобы многие могли ознакомится со статьей.
Более подходящего места не нашел.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.06.2013, 20:41 #4
Почитал статью. В целом толковый поверхностный обзор. Не понял почему в "copy assignment operator" автор использует:
C++
1
if(this != &copy)
а в "move assignment operator":
C++
1
assert(this != &temp);
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
13.06.2013, 09:22 #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;
}
1
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.06.2013, 12:54 #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
}
2
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
13.06.2013, 14:24 #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.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.06.2013, 14:30 #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Утечка только в случае, если мы муваем один объект в себя же.
Так ведь до обнуления rhs.pointer_ (5 строка) надо ж освободить память (деструктор ведь потом ничего не сделает, т.к. указатель сброшен).
Цитата Сообщение от ForEveR Посмотреть сообщение
что мы юзаем forward/move.
это что за зверь?
И всё-таки почему тогда assert? В релизе же проверки не будет.
1
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
13.06.2013, 14:33 #9
Tulosba, Зачем, если мы свапаем указатель и получаем новый объект? При нормальном раскладе утечки не будет (свопнули, установили прошлый в nullptr, объект который мы переместили теперь не валиден, в который переместили - валиден, при выходе из области видимости данного объекта будет вызван деструктор, который все и почистит). Вероятно, заюзан ассерт, потому что это просто пример. Ну про std::forward/std::move полагаю проще почитать, чем объяснять тут.

Вот тут: http://stackoverflow.com/questions/3106110/what-are-move-semantics можно почитать. Довольно здраво написано. В частности второй ответ.
1
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.06.2013, 14:59 #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 полагаю проще почитать, чем объяснять
окей
2
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
13.06.2013, 15:06 #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;
}
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.06.2013, 15:07 #12
ForEveR, уф. Ну ладно, хоть разобрались
0
Kastaneda
Jesus loves me
Эксперт С++
4822 / 2996 / 345
Регистрация: 12.12.2009
Сообщений: 7,558
Записей в блоге: 2
Завершенные тесты: 1
30.06.2013, 16:52 #13
Лучший ответ Сообщение было отмечено как решение

Решение

А вот сегодня появился небольшой обзор новых возможностей С++14. Дабы не плодить подобные темы, оставлю ссылку здесь.

Не по теме:

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

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

8
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.06.2013, 18:36 #14
@Kastaneda, Читал про данные возможности в разнобой (на isocpp.org/stackoverflow), а вот то, что на хабре выложили все обобщенно - это круто. Большое спасибо за ссылку!
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.07.2013, 13:34 #15
http://stackoverflow.com/questions/1...s-for-this-for

имхо - попахивает overengineering
0
15.07.2013, 13:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 13:34

Определить сколько должен заплатить каждый пассажир такси
В такси одновременно сели три пассажира. Когда вышел первый пассажир, на...

Каждый созданный экземпляр класса должен увеличивать значение счетчика на 1
Каждый созданный экземпляр класса должен увеличивать значение...

Реализовать систему плагинов (модулей), каждый из которых должен работать в отдельном потоке
Всем доброго времени суток, не могли бы вы мне помочь реализовать систему...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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