программистское, для знающих C++
Nov. 4th, 2012 03:39 pmC++ Rvalue References Explained
Отличная статья об одном из новшеств стандарта C++11 - так называемых "rvalue references". Оказывается, это совсем не страшная штука, и в этой статье всего из 11 страниц автор подробно объясняет, зачем они нужны, как их использовать, и почему, если вы собираетесь использовать rvalue references вместе с exceptions в одном и том же коде, лучше сразу застрелиться.
Процитирую прекрасную таблицу ссылок на ссылки:
Отличная статья об одном из новшеств стандарта C++11 - так называемых "rvalue references". Оказывается, это совсем не страшная штука, и в этой статье всего из 11 страниц автор подробно объясняет, зачем они нужны, как их использовать, и почему, если вы собираетесь использовать rvalue references вместе с exceptions в одном и том же коде, лучше сразу застрелиться.
Процитирую прекрасную таблицу ссылок на ссылки:
- A& & becomes A&
- A& && becomes A&
- A&& & becomes A&
- A&& && becomes A&&
no subject
Date: 2012-11-04 05:13 pm (UTC)no subject
Date: 2012-11-04 05:15 pm (UTC)no subject
Date: 2012-11-04 06:31 pm (UTC)no subject
Date: 2012-11-04 07:11 pm (UTC)rvalue-ref были введены исключительно для оптимизации.
Если рассматривать в этом разрезе, то все вышеприведенные правила выведения типов очень логичны и интуитивно понятны.
no subject
Date: 2012-11-04 10:21 pm (UTC)template<typename T> void f(std::vector&& param); // here, "&&" means rvalue reference
template<typename T> void f(T&& param); // here, "&&" does not mean rvalue reference
- интуитивно понятно? Лолшто?
no subject
Date: 2012-11-04 08:00 pm (UTC)no subject
Date: 2012-11-04 10:19 pm (UTC)В плюсах с их перегрузкой операторов уже начинались серьезные проблемы, когда один компилятор читал так, а другой иначе, и оба генерировали код, и оба формально были правы.
Но вот то, что сейчас, это уже за гранью борьбы бабла и зла.
ain't the first time
Date: 2012-11-05 04:12 am (UTC)a < b > c;
could be a declaration of variable c of type a< b > (instantiation of template a with argument b), or it could be 2 comparisons.
a b(c(d));
could be declaration of variable b of type a, initialized with value d which is cast to type c,
or it could be a declaration of function b which takes argument d of type c and returns a.
even in classic C,
(a) & (b);
could mean address of b being cast to type a, or bitwise and of values a and b; C resolves the ambiguity by checking whether a is a type. It gets worse in C++ because meaning of a can be different due to complicated lookup rules.
I could go on, but you get the point.