программистское, для знающих 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 01:56 pm (UTC)А вообще, из всех новшеств Ц++11, эти новые ссылки самые неинтуитивные. Хотя, может это старость наступает...
no subject
Date: 2012-11-04 02:34 pm (UTC)Похоже что C++ стремительно деградирует к этому состоянию. Вообще, все стремительно портится, последние времена наступают.
no subject
Date: 2012-11-05 12:01 am (UTC)no subject
Date: 2012-11-04 03:01 pm (UTC)Rvalue references allow a function to branch at compile time (via overload resolution)
on the condition "Am I being called on an lvalue or an rvalue?".
"Остальное - комментарий".
no subject
Date: 2012-11-04 03:25 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-11-04 02:20 pm (UTC)no subject
Date: 2012-11-04 02:50 pm (UTC)no subject
Date: 2012-11-04 03:19 pm (UTC)Consider:
const int r = 37;
Is r an l-value or r-value? By the first definition, it is an r-value, since it cannot be on the left side of assignment. But by the second definition, it is an l-value, since it refers to a memory location, and its address can be taken.
no subject
Date: 2012-11-04 03:35 pm (UTC)In C++, this is still useful as a first, intuitive approach to lvalues and rvalues. However, C++ with its user-defined types has introduced some subtleties regarding modifiability and assignability that cause this definition to be incorrect.
(no subject)
From:no subject
Date: 2012-11-04 04:24 pm (UTC)r-value
Иначе код
const int r = 37;
char s[r];
был бы валиден (периодически встречаю утверждение, что так оно и есть, но, почему-то, компиляторы обычно ругаются).
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-11-04 07:01 pm (UTC)struct S { S(){} const S& operator=(int) const { return *this; } }; int main() { const S s; s = 1; return 0; }Еще вопросы есть?
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-11-04 03:44 pm (UTC)no subject
Date: 2012-11-04 03:52 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-11-04 06:29 pm (UTC)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)
From:(no subject)
From:(no subject)
From:(no subject)
From:ain't the first time
From:no subject
Date: 2012-11-04 05:27 pm (UTC)no subject
Date: 2012-11-04 06:28 pm (UTC)Но если хочется интуитивного понимания rvalue references, надо иди сразу к Скотту Мейерсу (http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Scott-Meyers-Universal-References-in-Cpp11).
no subject
Date: 2012-11-04 06:33 pm (UTC)no subject
Date: 2012-11-04 07:28 pm (UTC)Что-то какая-то желтизна в этом утверждении прослеживается.
Там по ссылке указано что проблема возникает только когда move-конструкторы реализованы так что могуть выкидывать исключения.
Но это надо очень большим "талантом" обладать, чтобы так реализовать перемещение.
no subject
Date: 2012-11-04 07:33 pm (UTC)no subject
Date: 2012-11-04 11:48 pm (UTC)Но legacy code не даёт умереть совсем даже коболу; C++ ещё долго протянет :(
no subject
Date: 2012-11-05 07:56 am (UTC)пока в плюсах писать простые вещи просто, а чуть более сложные чуть более сложно, он под своей тяжестью не рухнет, что бы там не творилась в темных углах.
(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-11-05 08:51 am (UTC)В C# этот момент изначально продумали и есть structs (как в C++) и classes, которые by-ref. Поэтому в C# такой костыль, как RValue-refs не понадобится.