avva: (Default)
[personal profile] avva
C++ Rvalue References Explained

Отличная статья об одном из новшеств стандарта C++11 - так называемых "rvalue references". Оказывается, это совсем не страшная штука, и в этой статье всего из 11 страниц автор подробно объясняет, зачем они нужны, как их использовать, и почему, если вы собираетесь использовать rvalue references вместе с exceptions в одном и том же коде, лучше сразу застрелиться.

Процитирую прекрасную таблицу ссылок на ссылки:
  • A& & becomes A&
  • A& && becomes A&
  • A&& & becomes A&
  • A&& && becomes A&&

Date: 2012-11-04 01:56 pm (UTC)
From: [identity profile] ak-47.livejournal.com
Таблица напомнила мне русскую пословицу: один сын - не сын, два сына - полсына, три сына - сын.

А вообще, из всех новшеств Ц++11, эти новые ссылки самые неинтуитивные. Хотя, может это старость наступает...

Date: 2012-11-04 02:34 pm (UTC)
From: [identity profile] trurle.livejournal.com
Описание языка PL-I занимало целую полку, не думаю что существовал человек, овладевший навыками программирования на PL-I в полном объеме.

Похоже что C++ стремительно деградирует к этому состоянию. Вообще, все стремительно портится, последние времена наступают.

Date: 2012-11-05 12:01 am (UTC)
From: [identity profile] ak-47.livejournal.com
Истинно так. Я, кстати, от Страуструпа не ожидал что он пойдёт на такое усложнение языка. Обычно он цербером стоял на страже и посылал всех в библиотеку. Хотя много полезного появилось и давно уже надо было это сделать (те же лямбды, например). С++11 вызывает смешанные чувства.

Date: 2012-11-04 03:01 pm (UTC)
From: [identity profile] winpooh.livejournal.com
Мне кажется, основная премудрость там состоит в двух строчках на стр.3:
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?".

"Остальное - комментарий".

Date: 2012-11-04 03:25 pm (UTC)
From: [identity profile] spamsink.livejournal.com
Да. Как только я это в свое время понял сам при чтении разнообразных operator+ для std::string, наступило просветление.

(no subject)

From: [identity profile] ak-47.livejournal.com - Date: 2012-11-05 12:06 am (UTC) - Expand

(no subject)

From: [identity profile] spamsink.livejournal.com - Date: 2012-11-05 03:58 am (UTC) - Expand

(no subject)

From: [identity profile] asox.livejournal.com - Date: 2012-11-04 04:26 pm (UTC) - Expand

(no subject)

From: [identity profile] potan.livejournal.com - Date: 2012-11-04 08:52 pm (UTC) - Expand

(no subject)

From: [identity profile] spamsink.livejournal.com - Date: 2012-11-05 03:59 am (UTC) - Expand

(no subject)

From: [identity profile] potan.livejournal.com - Date: 2012-11-05 09:48 am (UTC) - Expand

Date: 2012-11-04 02:20 pm (UTC)
From: [identity profile] blacklion.livejournal.com
Где-то мне мерещится тег <irony> :)

Date: 2012-11-04 02:50 pm (UTC)
From: [identity profile] bealex.livejournal.com
После пятого амперсанда затерялся.

Date: 2012-11-04 03:19 pm (UTC)
From: [identity profile] igorlord.livejournal.com
The first page left me totally confused about what definition of l-value he will use for the remainder of the article.

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.

Date: 2012-11-04 03:35 pm (UTC)
From: [identity profile] dimrub.livejournal.com
Первое определение - из С, второе - из С++. Там даже вот такая фраза есть:

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: [identity profile] igorlord.livejournal.com - Date: 2012-11-04 03:40 pm (UTC) - Expand

Date: 2012-11-04 04:24 pm (UTC)
From: [identity profile] asox.livejournal.com
Is r an l-value or r-value?

r-value

Иначе код

const int r = 37;
char s[r];

был бы валиден (периодически встречаю утверждение, что так оно и есть, но, почему-то, компиляторы обычно ругаются).

(no subject)

From: [identity profile] pilpilon.livejournal.com - Date: 2012-11-04 04:34 pm (UTC) - Expand

(no subject)

From: [identity profile] asox.livejournal.com - Date: 2012-11-04 07:32 pm (UTC) - Expand

(no subject)

From: [identity profile] pilpilon.livejournal.com - Date: 2012-11-04 10:45 pm (UTC) - Expand

(no subject)

From: [identity profile] asox.livejournal.com - Date: 2012-11-05 08:34 am (UTC) - Expand

(no subject)

From: [identity profile] amosk.livejournal.com - Date: 2012-11-05 05:48 am (UTC) - Expand

Date: 2012-11-04 07:01 pm (UTC)
From: [identity profile] amosk.livejournal.com
struct S
{
    S(){}
    const S& operator=(int) const { return *this; }
};

int main()
{

    const S s;
    s = 1;
    return 0;
}


Еще вопросы есть?

(no subject)

From: [identity profile] igorlord.livejournal.com - Date: 2012-11-04 10:24 pm (UTC) - Expand

(no subject)

From: [identity profile] amosk.livejournal.com - Date: 2012-11-05 05:21 am (UTC) - Expand

(no subject)

From: [identity profile] igorlord.livejournal.com - Date: 2012-11-05 04:18 pm (UTC) - Expand

(no subject)

From: [identity profile] amosk.livejournal.com - Date: 2012-11-05 04:35 pm (UTC) - Expand

Date: 2012-11-04 03:44 pm (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
И эти люди запрещают мне ковыряться в монадах.

Date: 2012-11-04 03:52 pm (UTC)
From: [identity profile] dimrub.livejournal.com
Программист на С++ имеет все шансы состариться и уйти на пенсию, всю жизнь пользуясь rvalue references, и не зная этого (грубо говоря, если я не пишу performance intensive libraries, то они мне не нужны). У программиста на Хаскелле возможности не знать, что такое монады, нет.

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2012-11-04 03:58 pm (UTC) - Expand

(no subject)

From: [identity profile] smilga.livejournal.com - Date: 2012-11-04 05:51 pm (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2012-11-04 05:53 pm (UTC) - Expand

(no subject)

From: [identity profile] chainiksu.livejournal.com - Date: 2012-11-04 06:27 pm (UTC) - Expand

(no subject)

From: [identity profile] smilga.livejournal.com - Date: 2012-11-04 06:35 pm (UTC) - Expand

(no subject)

From: [identity profile] huzhepidarasa.livejournal.com - Date: 2012-11-04 08:32 pm (UTC) - Expand

(no subject)

From: [identity profile] huzhepidarasa.livejournal.com - Date: 2012-11-04 04:09 pm (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2012-11-04 04:10 pm (UTC) - Expand

(no subject)

From: [identity profile] huzhepidarasa.livejournal.com - Date: 2012-11-04 04:16 pm (UTC) - Expand

(no subject)

From: [identity profile] huzhepidarasa.livejournal.com - Date: 2012-11-04 04:25 pm (UTC) - Expand

(no subject)

From: [identity profile] francis-drake.livejournal.com - Date: 2012-11-04 06:31 pm (UTC) - Expand

(no subject)

From: [identity profile] irene221b.livejournal.com - Date: 2012-11-04 06:53 pm (UTC) - Expand

(no subject)

From: [identity profile] dimrub.livejournal.com - Date: 2012-11-04 07:12 pm (UTC) - Expand

(no subject)

From: [identity profile] irene221b.livejournal.com - Date: 2012-11-04 07:14 pm (UTC) - Expand

(no subject)

From: [identity profile] dimrub.livejournal.com - Date: 2012-11-04 07:14 pm (UTC) - Expand

(no subject)

From: [identity profile] potan.livejournal.com - Date: 2012-11-04 08:58 pm (UTC) - Expand

Date: 2012-11-04 06:29 pm (UTC)
From: [identity profile] francis-drake.livejournal.com
Этапять!

Date: 2012-11-04 05:13 pm (UTC)
From: [identity profile] helvegr.livejournal.com
Мне ещё вот это (http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Scott-Meyers-Universal-References-in-Cpp11) понравилось:

Given that rvalue references are declared using "&&", it seems reasonable to assume that the presence of "&&" in a type declaration indicates an rvalue reference. That is not the case:

Widget&& var1 = someWidget; // here, "&&" means rvalue reference
 
auto&& var2 = var1; // here, "&&" does not mean rvalue reference
 
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

In this article, I describe the two meanings of "&&" in type declarations, explain how to tell them apart, and introduce new terminology that makes it possible to unambiguously communicate which meaning of "&&" is intended. Distinguishing the different meanings is important, because if you think "rvalue reference" whenever you see "&&" in a type declaration, you'll misread a lot of C++11 code.
Edited Date: 2012-11-04 05:13 pm (UTC)

Date: 2012-11-04 05:15 pm (UTC)
From: [identity profile] avva.livejournal.com
Аааааа, это прекрасно, спасибо :)

Date: 2012-11-04 06:31 pm (UTC)
From: [identity profile] chainiksu.livejournal.com
О, а вот и расплата за выход С++ за пределы множества контекстно-свободных языков.

(no subject)

From: [identity profile] amosk.livejournal.com - Date: 2012-11-04 07:11 pm (UTC) - Expand

(no subject)

From: [identity profile] chainiksu.livejournal.com - Date: 2012-11-04 10:21 pm (UTC) - Expand

(no subject)

From: [identity profile] huzhepidarasa.livejournal.com - Date: 2012-11-04 08:00 pm (UTC) - Expand

(no subject)

From: [identity profile] chainiksu.livejournal.com - Date: 2012-11-04 10:19 pm (UTC) - Expand

ain't the first time

From: [identity profile] alexei lebedev - Date: 2012-11-05 04:12 am (UTC) - Expand

Date: 2012-11-04 05:27 pm (UTC)
From: [identity profile] senecarus.livejournal.com
Как хорошо, что я с этим завязал.

Date: 2012-11-04 06:28 pm (UTC)
From: [identity profile] mstone.livejournal.com
Да, очень хорошая статья. И ещё один (http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx) хороший tutorial на эту тему.

Но если хочется интуитивного понимания rvalue references, надо иди сразу к Скотту Мейерсу (http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Scott-Meyers-Universal-References-in-Cpp11).

Date: 2012-11-04 06:33 pm (UTC)
From: [identity profile] chainiksu.livejournal.com
Да в принципе и старина Страуструп неплохо всё пояснил в своём обзоре фич С++11. Правда, в традиционном для себя стиле - каждая страница по эффекту сопоставима с таблеткой снотворного.

Date: 2012-11-04 07:28 pm (UTC)
From: [identity profile] amosk.livejournal.com
если вы собираетесь использовать rvalue references вместе с exceptions в одном и том же коде, лучше сразу застрелиться

Что-то какая-то желтизна в этом утверждении прослеживается.
Там по ссылке указано что проблема возникает только когда move-конструкторы реализованы так что могуть выкидывать исключения.
Но это надо очень большим "талантом" обладать, чтобы так реализовать перемещение.

Date: 2012-11-04 07:33 pm (UTC)
From: [identity profile] avva.livejournal.com
Я сознательно преувеличил ради юмора ситуации, да - если хотите считать это желтизной, пожалуйста.

Date: 2012-11-04 11:48 pm (UTC)
nine_k: A stream of colors expanding from brain (Default)
From: [personal profile] nine_k
Интересно, какой уровень, скажем вежливо, замороченности нужен языку, чтобы рухнуть под собственной тяжестью? C++ давно превзошёл уровень Алгола-68 и PL/I, мне кажется.

Но legacy code не даёт умереть совсем даже коболу; C++ ещё долго протянет :(

Date: 2012-11-05 07:56 am (UTC)
From: [identity profile] pilpilon.livejournal.com
вопрос, как эта замороченость размазана.
пока в плюсах писать простые вещи просто, а чуть более сложные чуть более сложно, он под своей тяжестью не рухнет, что бы там не творилась в темных углах.

(no subject)

From: [personal profile] nine_k - Date: 2012-11-05 09:01 am (UTC) - Expand

(no subject)

From: [identity profile] pilpilon.livejournal.com - Date: 2012-11-05 09:20 am (UTC) - Expand

(no subject)

From: [identity profile] winpooh.livejournal.com - Date: 2012-11-05 10:23 am (UTC) - Expand

Date: 2012-11-05 08:51 am (UTC)
From: [identity profile] ircicq.livejournal.com
Необходимость введения RValue refs - это следствие того что в языке все классы работают by-value.

В C# этот момент изначально продумали и есть structs (как в C++) и classes, которые by-ref. Поэтому в C# такой костыль, как RValue-refs не понадобится.

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 28th, 2025 08:32 am
Powered by Dreamwidth Studios