Кто что из c++0x использует. И кто на что нарвался?
От: denisko http://sdeniskos.blogspot.com/
Дата: 06.12.11 19:00
Оценка:
Предлагаю в эту тему накидать плюсы, которые вам дало использование c++0x вместо традиционного с++ и грабли, которые он разбросал. Для создания небольшого словарика примеров того, как делать надо и как не надо.
Для нас пока прижилось lambda и auto. Грабли -- пришлось вводить требование на длину лямбы не более 10 строк, ибо если больше, то практически нечитаемо; В GCC есть мелкий баг, что она плохо инстанцирует шаблоны, если параметром его является лямбда (газенбаг), причем лямбду парсит нормально, а остальные аргументы может не разобрать, если они указаны неявно.
<Подпись удалена модератором>
Re: Кто что из c++0x использует. И кто на что нарвался?
От: о_О
Дата: 06.12.11 19:39
Оценка: 7 (2)
enum class
+ удобно — не захламляется пространство имен в котором оно объявлено; ClientResponseType::None порой куда секси и понятнее чем CRT_NONE или ClientResponseType_None
— пока ещё непривычно и порой возникают wtf при чтении; VC++ 2010 не поддерживает, IntelliSense не поддерживает

nullptr
+ приятно — по сравнению с NULL, при чтении, я сразу стал понимать что тут делается + проверка времени компиляции
— только последние ICC и GCC держат его

override
+ обалденно — то, что должно ещё быть в С++ 99 — проверка времени компиляции; читаемость++
— нет полной поддержки

&&
+ оргазм — теперь у меня по одной паре аллокация/освобождение, AddRef()/Release() вместо нескольких; производительность++
— надо уметь готовить, больше писать

auto + decltype
классно (без комментариев)
Re: Кто что из c++0x использует. И кто на что нарвался?
От: Banned by IT  
Дата: 06.12.11 23:27
Оценка:
Здравствуйте, denisko, Вы писали:

D>Предлагаю в эту тему накидать плюсы, которые вам дало использование c++0x вместо традиционного с++ и грабли, которые он разбросал.


Прижились и сильно облегчили жизнь:
auto
decltype
variadic templates
defaulted and deleted functions
rvalue references
concatenation of mixed-width string literals
static_assert

ну и мелочи там всякие типа >>, trailing comma и др.

лямбды так и не нашёл куда приткнуть чтоб с ними было лучше чем без них.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: Кто что из c++0x использует. И кто на что нарвался?
От: ArtDenis Россия  
Дата: 07.12.11 04:36
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>&&

о_О>+ оргазм — теперь у меня по одной паре аллокация/освобождение, AddRef()/Release() вместо нескольких; производительность++
о_О>- надо уметь готовить, больше писать
А можно по-подробнее, а то я уже много чего из нового стандарта использую, но профита от && никак не могу понять.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Кто что из c++0x использует. И кто на что нарвался?
От: jazzer Россия Skype: enerjazzer
Дата: 07.12.11 04:57
Оценка: +1
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, о_О, Вы писали:


о_О>>&&

о_О>>+ оргазм — теперь у меня по одной паре аллокация/освобождение, AddRef()/Release() вместо нескольких; производительность++
о_О>>- надо уметь готовить, больше писать
AD>А можно по-подробнее, а то я уже много чего из нового стандарта использую, но профита от && никак не могу понять.

код становится гораздо проще.
Можно все возвращать по значению, не опасаясь за производительность.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Кто что из c++0x использует. И кто на что нарвался?
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 07.12.11 05:24
Оценка:
Здравствуйте, ArtDenis, Вы писали:

о_О>>&&

о_О>>+ оргазм — теперь у меня по одной паре аллокация/освобождение, AddRef()/Release() вместо нескольких; производительность++
о_О>>- надо уметь готовить, больше писать
AD>А можно по-подробнее, а то я уже много чего из нового стандарта использую, но профита от && никак не могу понять.

Эту штуку используют для перемещения состояний между объектами. Надеюсь я правильно выразился.

Например, через push_back(value_type&& x) можно засунуть данные объекта в контейнер без лишнего копирования. Фактически вместо копирования работают swap-алгоритмы.

Или, например, в коде
string build_string()
{
 string result;

 //... build code

 return result;
}


Можно вместо "return result;" написать "return std::move(result);" и ты будешь "перемещать" result в результат функции, а не копировать его.

----
Лично я (в основном коде) использую только эту "&&" фичу из новых возможностей C++. Да и то — только через макросы вида
//VS2010
#define __STL_MOVE_VALUE(x)      std::move(x)
#define __STL_FORWARD_VALUE(T,x) std::forward<T>(x)

//old compilers
#define __STL_MOVE_VALUE(x) (x)
#define __STL_FORWARD_VALUE(T,x) (x)

Поскольку пока все еще хочу сохранять совместимость исходного кода со "старыми" компиляторами. Типа VS2005/VS2008. Хотя сейчас 99% провожу в VS2010

----
Вот что бы я очень хотел бы юзать так это auto. Бо (накатав достаточно много кода на C# с его var) явное указание типов для переменных уже напрягает.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: Кто что из c++0x использует. И кто на что нарвался?
От: uzhas Ниоткуда  
Дата: 07.12.11 06:41
Оценка: +2
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Или, например, в коде

КД>
КД>string build_string()
КД>{
КД> string result;

КД> //... build code

КД> return result;
КД>}
КД>


КД>Можно вместо "return result;" написать "return std::move(result);" и ты будешь "перемещать" result в результат функции, а не копировать его.

имхо это пример, как неправильно использовать move
return result; <-- достаточно без всяких move
компилятор сообразит, что лучше сделать
это все равно, что советовать кругом вставлять слово inline
Re[5]: Кто что из c++0x использует. И кто на что нарвался?
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 07.12.11 06:47
Оценка:
Здравствуйте, uzhas, Вы писали:

U>имхо это пример, как неправильно использовать move

U>return result; <-- достаточно без всяких move
U>компилятор сообразит, что лучше сделать
U>это все равно, что советовать кругом вставлять слово inline

Возможно, но я по-моему тестировал — компилятор VS2010 не рюхал и ему надо было подсказывать
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Кто что из c++0x использует. И кто на что нарвался?
От: uzhas Ниоткуда  
Дата: 07.12.11 07:03
Оценка:
Здравствуйте, denisko, Вы писали:

D>Предлагаю в эту тему накидать плюсы, которые вам дало использование c++0x вместо традиционного с++ и грабли, которые он разбросал. Для создания небольшого словарика примеров того, как делать надо и как не надо.

используем &&

грабли в &&
1) люди начинают их впихивать туда, где передача по значению была бы приемлемой (тут можете меня поучить)
пример:
//class B is movable
class A
{
public:
  //я чего-то не понимаю или тут реально не нужно && ? ведь это ненужное ограничение на клиента
  void SetB(B&& b)
  {
    m_b = std::move(b);
  }

  B m_b;
};


2) из-за того что std::move может превратить нормальный (lvalue) объект в rvalue&& не совсем ясно (холиворно) приходится имплементить move-operator= (тут тоже можете меня поучить)
//variant 1
class A
{
public:
  A& operator=(A&& other)
  {
    CloseResource();
    std::swap(m_Resource, other.m_Resource);
    return *this;
  }

  ~A()
  {
    CloseResource();
  }

private:
  ResourceType m_Resource;
};

//variant 2
class A
{
public:
  A& operator=(A&& other)
  {
    std::swap(m_Resource, other.m_Resource);
  }

  ~A()
  {
    //free resource
  }
private:
  ResourceType m_Resource;
};

//variant 3
class A
{
public:
  A& operator=(A&& other)
  {
    A tmp(std::move(other));
    std::swap(tmp.m_Resource, m_Resource);
    return *this;
  }

private:
  ResourceType m_Resource;
};

приходится внимательно следить за состоянием other =\
в студии 2010 достаточно бедная поддержка =\
Re[6]: Кто что из c++0x использует. И кто на что нарвался?
От: uzhas Ниоткуда  
Дата: 07.12.11 07:06
Оценка: 34 (5)
Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>Возможно, но я по-моему тестировал — компилятор VS2010 не рюхал и ему надо было подсказывать

пока еще глупый компилятор, значит
вот кстати интересная статья на тему rvalue&& http://thbecker.net/articles/rvalue_references/section_01.html
Re[2]: Кто что из c++0x использует. И кто на что нарвался?
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 07.12.11 07:09
Оценка: +2
Здравствуйте, uzhas, Вы писали:

U>грабли в &&

U>1) люди начинают их впихивать туда, где передача по значению была бы приемлемой (тут можете меня поучить)
U>пример:
//class B is movable
class A
{
 public:
  //я чего-то не понимаю или тут реально не нужно && ? ведь это ненужное ограничение на клиента
  void SetB(B&& b)
  {
    m_b = std::move(b);
  }

  B m_b;
};


Лично я определяю SetB(B&& b) только в довесок к нормальному "void SetB(const B& b)"
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Кто что из c++0x использует. И кто на что нарвался?
От: uzhas Ниоткуда  
Дата: 07.12.11 07:16
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Лично я определяю SetB(B&& b) только в довесок к нормальному "void SetB(const B& b)"

а для чего это надо? почему нельзя было обойтись одним методом, принимающим аргумент по значению?
void SetB(B b);
я могу себе еще такое представить, когда два метода определяются в шаблонных классах, ибо они могут работать как с movable, так и не с movable классами (хотя тут тоже есть о чем кумекать)
Re[4]: Кто что из c++0x использует. И кто на что нарвался?
От: Masterkent  
Дата: 07.12.11 07:27
Оценка: 4 (1)
Коваленко Дмитрий:

КД>Или, например, в коде

КД>
КД>string build_string()
КД>{
КД> string result;

КД> //... build code

КД> return result;
КД>}
КД>


КД>Можно вместо "return result;" написать "return std::move(result);" и ты будешь "перемещать" result в результат функции, а не копировать его.


Такая замена только исключит возможность применения RVO. В отношении return действуют особые правила:

12.8/32:

When the criteria for elision of a copy operation are met or would be met save for the fact that the source object is a function parameter, and the object to be copied is designated by an lvalue, overload resolution to select the constructor for the copy is first performed as if the object were designated by an rvalue. If overload resolution fails, or if the type of the first parameter of the selected constructor is not an rvalue reference to the object’s type (possibly cv-qualified), overload resolution is performed again, considering the object as an lvalue. [ Note: This two-stage overload resolution must be performed regardless of whether copy elision will occur. It determines the constructor to be called if elision is not performed, and the selected constructor must be accessible even if the call is elided. —end note ]

[ Example:

class Thing {
public:
  Thing();
  ~Thing();
  Thing(Thing&&);
private:
  Thing(const Thing&);
};

Thing f(bool b) {
  Thing t;
  if (b)
    throw t;         // OK: Thing(Thing&&) used (or elided) to throw t
  return t;          // OK: Thing(Thing&&) used (or elided) to return t
}

Thing t2 = f(false); // OK: Thing(Thing&&) used (or elided) to construct t2

—end example ]

Re[4]: Кто что из c++0x использует. И кто на что нарвался?
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 07.12.11 07:29
Оценка:
Здравствуйте, uzhas, Вы писали:

КД>>Лично я определяю SetB(B&& b) только в довесок к нормальному "void SetB(const B& b)"

U>а для чего это надо? почему нельзя было обойтись одним методом, принимающим аргумент по значению?
U>void SetB(B b);
Я хотел написать, что "только с появлением && стал понятен очень древний совет — передавать аргументы по значению. типа компилятор там сам разберется". Но потом передумал

Да потому что если код будет собираться старым компилятором, то
void SetB(B b)
{
 m_std_vector_of_B.push_back(b);
}

будет хуже чем
void SetB(const B& b)
{
 m_std_vector_of_B.push_back(b);
}
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[5]: Кто что из c++0x использует. И кто на что нарвался?
От: uzhas Ниоткуда  
Дата: 07.12.11 07:34
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>Я хотел написать, что "только с появлением && стал понятен очень древний совет — передавать аргументы по значению. типа компилятор там сам разберется". Но потом передумал

это свежий совет
древний совет — передавайте все по ссылке
хочется разобраться когда применять свежий совет, а когда нет

КД>Да потому что если код будет собираться старым компилятором, то

все же меня интересуют именно новые возможности, хочется в них разобраться
Re[6]: Кто что из c++0x использует. И кто на что нарвался?
От: LaptevVV Россия  
Дата: 07.12.11 07:40
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Коваленко Дмитрий, Вы писали:



КД>>Я хотел написать, что "только с появлением && стал понятен очень древний совет — передавать аргументы по значению. типа компилятор там сам разберется". Но потом передумал

U>это свежий совет
U>древний совет — передавайте все по ссылке
U>хочется разобраться когда применять свежий совет, а когда нет
Атомарные данные — по значению. Агрегаты — по ссылке.
Типа Капитан Очевидность.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[7]: Кто что из c++0x использует. И кто на что нарвался?
От: uzhas Ниоткуда  
Дата: 07.12.11 07:49
Оценка: :))) :)
Здравствуйте, LaptevVV, Вы писали:

LVV>Атомарные данные — по значению. Агрегаты — по ссылке.

LVV>Типа Капитан Очевидность.
больше похоже на Капитан Невтеме
Re[2]: Кто что из c++0x использует. И кто на что нарвался?
От: о_О
Дата: 07.12.11 08:37
Оценка:
Здравствуйте, uzhas, Вы писали:

U>грабли в &&

U>1) люди начинают их впихивать туда, где передача по значению была бы приемлемой
U>2) из-за того что std::move может превратить нормальный (lvalue) объект в rvalue&& не совсем ясно (холиворно) приходится имплементить move-operator= (тут тоже можете меня поучить)

это потому что люди не умеют готовить &&. в частности не понимают разницы std::forward/std::move и как их использовать, и вообще "что там происходит"

что там происходит — http://rsdn.ru/forum/cpp/3731204.1.aspx
Автор: Masterkent
Дата: 11.03.10

как использовать std::forward/std::move — http://gcc.gnu.org/ml/libstdc++/2007-08/msg00037.html
Re[3]: Кто что из c++0x использует. И кто на что нарвался?
От: uzhas Ниоткуда  
Дата: 07.12.11 08:41
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>это потому что люди не умеют готовить &&. в частности не понимают разницы std::forward/std::move и как их использовать, и вообще "что там происходит"

научите готовить
более-менее конкретные примеры я описал выше, как по-вашему "правильно" их написать?
Re[3]: Кто что из c++0x использует. И кто на что нарвался?
От: uzhas Ниоткуда  
Дата: 07.12.11 08:43
Оценка:
Здравствуйте, о_О, Вы писали:


о_О>что там происходит — http://rsdn.ru/forum/cpp/3731204.1.aspx
Автор: Masterkent
Дата: 11.03.10

о_О>как использовать std::forward/std::move — http://gcc.gnu.org/ml/libstdc++/2007-08/msg00037.html
это все о шаблонах, для моих примеров неактуально
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.