Предлагаю в эту тему накидать плюсы, которые вам дало использование c++0x вместо традиционного с++ и грабли, которые он разбросал. Для создания небольшого словарика примеров того, как делать надо и как не надо.
Для нас пока прижилось lambda и auto. Грабли -- пришлось вводить требование на длину лямбы не более 10 строк, ибо если больше, то практически нечитаемо; В GCC есть мелкий баг, что она плохо инстанцирует шаблоны, если параметром его является лямбда (газенбаг), причем лямбду парсит нормально, а остальные аргументы может не разобрать, если они указаны неявно.
<Подпись удалена модератором>
Re: Кто что из c++0x использует. И кто на что нарвался?
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 использует. И кто на что нарвался?
Здравствуйте, 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 использует. И кто на что нарвался?
Здравствуйте, о_О, Вы писали:
о_О>&& о_О>+ оргазм — теперь у меня по одной паре аллокация/освобождение, AddRef()/Release() вместо нескольких; производительность++ о_О>- надо уметь готовить, больше писать
А можно по-подробнее, а то я уже много чего из нового стандарта использую, но профита от && никак не могу понять.
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, о_О, Вы писали:
о_О>>&& о_О>>+ оргазм — теперь у меня по одной паре аллокация/освобождение, AddRef()/Release() вместо нескольких; производительность++ о_О>>- надо уметь готовить, больше писать AD>А можно по-подробнее, а то я уже много чего из нового стандарта использую, но профита от && никак не могу понять.
код становится гораздо проще.
Можно все возвращать по значению, не опасаясь за производительность.
Здравствуйте, ArtDenis, Вы писали:
о_О>>&& о_О>>+ оргазм — теперь у меня по одной паре аллокация/освобождение, AddRef()/Release() вместо нескольких; производительность++ о_О>>- надо уметь готовить, больше писать AD>А можно по-подробнее, а то я уже много чего из нового стандарта использую, но профита от && никак не могу понять.
Эту штуку используют для перемещения состояний между объектами. Надеюсь я правильно выразился.
Например, через push_back(value_type&& x) можно засунуть данные объекта в контейнер без лишнего копирования. Фактически вместо копирования работают swap-алгоритмы.
Поскольку пока все еще хочу сохранять совместимость исходного кода со "старыми" компиляторами. Типа VS2005/VS2008. Хотя сейчас 99% провожу в VS2010
----
Вот что бы я очень хотел бы юзать так это auto. Бо (накатав достаточно много кода на C# с его var) явное указание типов для переменных уже напрягает.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: Кто что из c++0x использует. И кто на что нарвался?
КД>Можно вместо "return result;" написать "return std::move(result);" и ты будешь "перемещать" result в результат функции, а не копировать его.
имхо это пример, как неправильно использовать move
return result; <-- достаточно без всяких move
компилятор сообразит, что лучше сделать
это все равно, что советовать кругом вставлять слово inline
Re[5]: Кто что из c++0x использует. И кто на что нарвался?
Здравствуйте, uzhas, Вы писали:
U>имхо это пример, как неправильно использовать move U>return result; <-- достаточно без всяких move U>компилятор сообразит, что лучше сделать U>это все равно, что советовать кругом вставлять слово inline
Возможно, но я по-моему тестировал — компилятор VS2010 не рюхал и ему надо было подсказывать
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Кто что из c++0x использует. И кто на что нарвался?
Здравствуйте, denisko, Вы писали:
D>Предлагаю в эту тему накидать плюсы, которые вам дало использование c++0x вместо традиционного с++ и грабли, которые он разбросал. Для создания небольшого словарика примеров того, как делать надо и как не надо.
используем &&
грабли в &&
1) люди начинают их впихивать туда, где передача по значению была бы приемлемой (тут можете меня поучить)
пример:
//class B is movableclass A
{
public:
//я чего-то не понимаю или тут реально не нужно && ? ведь это ненужное ограничение на клиентаvoid SetB(B&& b)
{
m_b = std::move(b);
}
B m_b;
};
2) из-за того что std::move может превратить нормальный (lvalue) объект в rvalue&& не совсем ясно (холиворно) приходится имплементить move-operator= (тут тоже можете меня поучить)
Здравствуйте, uzhas, Вы писали:
U>грабли в && U>1) люди начинают их впихивать туда, где передача по значению была бы приемлемой (тут можете меня поучить) U>пример:
//class B is movableclass 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 использует. И кто на что нарвался?
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Лично я определяю SetB(B&& b) только в довесок к нормальному "void SetB(const B& b)"
а для чего это надо? почему нельзя было обойтись одним методом, принимающим аргумент по значению?
void SetB(B b);
я могу себе еще такое представить, когда два метода определяются в шаблонных классах, ибо они могут работать как с movable, так и не с movable классами (хотя тут тоже есть о чем кумекать)
Re[4]: Кто что из c++0x использует. И кто на что нарвался?
КД>Можно вместо "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 treturn 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 использует. И кто на что нарвался?
Здравствуйте, 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 использует. И кто на что нарвался?
КД>Я хотел написать, что "только с появлением && стал понятен очень древний совет — передавать аргументы по значению. типа компилятор там сам разберется". Но потом передумал
это свежий совет
древний совет — передавайте все по ссылке
хочется разобраться когда применять свежий совет, а когда нет
КД>Да потому что если код будет собираться старым компилятором, то
все же меня интересуют именно новые возможности, хочется в них разобраться
Re[6]: Кто что из c++0x использует. И кто на что нарвался?
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>Я хотел написать, что "только с появлением && стал понятен очень древний совет — передавать аргументы по значению. типа компилятор там сам разберется". Но потом передумал U>это свежий совет U>древний совет — передавайте все по ссылке U>хочется разобраться когда применять свежий совет, а когда нет
Атомарные данные — по значению. Агрегаты — по ссылке.
Типа Капитан Очевидность.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[7]: Кто что из c++0x использует. И кто на что нарвался?
Здравствуйте, LaptevVV, Вы писали:
LVV>Атомарные данные — по значению. Агрегаты — по ссылке. LVV>Типа Капитан Очевидность.
больше похоже на Капитан Невтеме
Re[2]: Кто что из c++0x использует. И кто на что нарвался?
Здравствуйте, uzhas, Вы писали:
U>грабли в && U>1) люди начинают их впихивать туда, где передача по значению была бы приемлемой U>2) из-за того что std::move может превратить нормальный (lvalue) объект в rvalue&& не совсем ясно (холиворно) приходится имплементить move-operator= (тут тоже можете меня поучить)
это потому что люди не умеют готовить &&. в частности не понимают разницы std::forward/std::move и как их использовать, и вообще "что там происходит"
Здравствуйте, о_О, Вы писали:
о_О>это потому что люди не умеют готовить &&. в частности не понимают разницы std::forward/std::move и как их использовать, и вообще "что там происходит"
научите готовить
более-менее конкретные примеры я описал выше, как по-вашему "правильно" их написать?
Re[3]: Кто что из c++0x использует. И кто на что нарвался?