
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (78) « Первая ... 2 3 [4] 5 6 ... 77 78 ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
Цитата archimed7592 @ В двух словах: для того, чтобы отличать временные объекты от обычных, что может дать прирост производительности(при соответствующей поддержке со стороны реализации класса). Да я понял зачем они.. читал N раз (N > 2) ![]() имхо. Если есть ссылки на rvalue, то должны быть и указатели на rvalue. Почему? А почему бы и нет собственно? былоб полезно.. и если взятие адреса у T&& дает T*.. то вместо T& var = const_cast<T&> (rvalueRef); можно написать T& var = *&rvalueRef;//а это не круто, для типизированного языка как ЭС с плюсами. Ладно. Свое имхо сказал. Спорить не будем.. а то правда не флейм схожу уже.. |
![]() |
Сообщ.
#47
,
|
|
Цитата LuckLess @ имхо. Если есть ссылки на rvalue, то должны быть и указатели на rvalue. Почему? А почему бы и нет собственно? Ты сможешь придумать практическое применение эти "указателям на rvalue"? Мне вот в голову ничего не приходит... Цитата LuckLess @ если взятие адреса у T&& дает T*.. то вместо T& var = const_cast<T&> (rvalueRef); Понял чего ты хотел этим показать, но не уверен, что ты получишь то чего хотел... Цитата LuckLess @ можно написать T& var = *&rvalueRef;//а это не круто, для типизированного языка как ЭС с плюсами. Ты получишь точно такой же rvalue. Попробуй в студии написать ostream &s = *reinterpret_cast< ostream * >(NULL); - получишь еггог т.к. нельзя делать неконстантные ссылки на временные(читай rvalue) объекты. |
Сообщ.
#48
,
|
|
|
Цитата archimed7592 @ Ты получишь точно такой же rvalue. Попробуй в студии написать ostream &s = *reinterpret_cast< ostream * >(NULL); - получишь еггог т.к. нельзя делать неконстантные ссылки на временные(читай rvalue) объекты. непроблема, яж псевдокодом написал. ![]() ![]() ... T&& rvalueRef; T* ptr = &rvalueRef;//ok T& lvalueRef = *ptr;//ravlue превратился в lvalue Цитата archimed7592 @ Ты сможешь придумать практическое применение эти "указателям на rvalue"? Придумал уже) ![]() ![]() ... T&& rvalueRef; T* ptr = &rvalueRef;//Ошибка! ravlue превратился в lvalue! Низзя так! rvalue T* ptrRValue = &rvalueRef;//ok T& lvalueRef = *ptr;//ravlue не превратился в lvalue const T& constRef = *ptrRValue ;//ok T&& rvalueRef2 = *ptrRValue ;//ok T& lvalueRef = *ptrRValue;//ошибка низзя так. |
![]() |
Сообщ.
#49
,
|
|
LuckLess, не знаю насколько это можно считать разумным решением, но на данный момент стандарт трактует любую именнованную rvalue-ссылку как lvalue-ссылку. Т.е. на данный момент не нужно даже с указателями извращаться, чтобы "обмануть" компилятор.
![]() ![]() void f(T & a); void g(T && a) { f(a); // well-formed - несмотря на то, что "a" является как бы rvalue, мы без особых проблем передаём его по неконстантной lvalue-ссылке f(std::fwd(a)); // ill-formed - rvalue можно передавать только по константной lvalue-ссылке } T && a = ...; f(a); // well-formed Могу добавить, что возможно, мы просто ещё не привыкли. С практикой всё встанет на свои места и многие из принятых комитетом решений станут понятными и "очевидными"("как это мы раньше этого не понимали - это же очевидно" ![]() ИМХО, rvalue-ссылки примерно так же опасны, как и использование auto_ptr, но они того стоят. |
Сообщ.
#50
,
|
|
|
не.. ну с такой постоновкой я к rvalue ссылкам вообще негативно отношусь. ПОнятно что иногда, для оптимизации.. можно допустить опасные синтаксические конструкции.. но когда эти синтаксические конструкции можно сделать безопасными, а их безопасными не делают.. этого я не понимаю вовсе..
Добавлено за что боролись.. на то и напоролись блин.. ![]() ![]() void f (double& d) { d = .555; } void ff (double&& d) { f (d); } int main () { int i = 0; ff (i); } Добавлено ![]() |
![]() |
Сообщ.
#51
,
|
|
LuckLess, у всего есть rationale... Эти rvalue-ссылки 5 лет "вылизывали".
|
Сообщ.
#52
,
|
|
|
Цитата archimed7592 @ LuckLess, у всего есть rationale... Эти rvalue-ссылки 5 лет "вылизывали". Ну.. у них еще 2 года есть.. ![]() |
![]() |
Сообщ.
#53
,
|
|
Цитата LuckLess @ за что боролись.. на то и напоролись блин.. С чего ты взял, что это скомпилируется? ![]() AFAIK, неявного каста из lvalue[-reference] of T в nonconst rvalue-reference of U нету. Цитата LuckLess @ Ну.. у них еще 2 года есть.. ![]() Ну там пока до конца не вылижут, как правило в WP не включают ![]() Добавлено И не два года, а меньше, чем полгода(см. первый пост, начало) ![]() |
Сообщ.
#54
,
|
|
|
Цитата archimed7592 @ AFAIK, неявного каста из lvalue[-reference] of T в nonconst rvalue-reference of U нету. Гм... тут у нас int конвертируется в double и получается временная переменная типа double&& вродь все правильно да?? Цитата archimed7592 @ стандарт трактует любую именнованную rvalue-ссылку как lvalue-ссылку. вот и все собстно.. Или мне пойти еще раз перечитать про rvalue reference.. ?? ![]() Добавлено Цитата archimed7592 @ И не два года, а меньше, чем полгода(см. первый пост, начало) ![]() так я и смотрел.. Цитата К октябрю 2007 года комитет запланировал публикацию законченного черновика стандарта C++09(который будет доступен публике для рассмотрения и критики). В октябре 2008 комитет внесёт окончательные коррективы в стандарт(и вот тут они одумаются!! ![]() ![]() |
![]() |
Сообщ.
#55
,
|
|
Цитата LuckLess @ Гм... тут у нас int конвертируется в double и получается временная переменная типа double&& вродь все правильно да?? С чего ты взял, что у нас тут что-то конвертируется. Для того, чтобы чего-то конвертировалось, компилятор должен решить, что "надо бы сконвертировать". А решения он принимает на основе набора правил из стандарта и правила "надо бы конвертировать lvalue of T в rvalue-reference of U", AFAIK, нету. Добавлено Цитата LuckLess @ так я и смотрел.. Ну там же четко сказано, что в 2008 комитет только внесёт коррективы(ну мало ли каких там Core/Library Defect Issues найдут). Кардинально менять ничего не будут. Потом до 2009 будут слушать нотации ISO по формальности языка и исправлять некоторые места на более формальный язык(не меняя смысла сказанного). Ну и в 2009 выпустят С++09. |
Сообщ.
#56
,
|
|
|
Цитата archimed7592 @ А решения он принимает на основе набора правил из стандарта и правила "надо бы конвертировать lvalue of T в rvalue-reference of U", AFAIK, нету. тогда rvalue ссылка совсем не похожа на lvalue ссылку и использовать && для нее я теперь вижу еще меньше смысла.. |
![]() |
Сообщ.
#57
,
|
|
Цитата LuckLess @ тогда rvalue ссылка совсем не похожа на lvalue ссылку а для lvalue-ссылки такое правило есть? ![]() ![]() ![]() void f(double &); int i(0); f(i); // ill-formed |
Сообщ.
#58
,
|
|
|
Цитата archimed7592 @ а для lvalue-ссылки такое правило есть? ![]() есть Цитата A variable declared to be a T&, that is “reference to type T (8.3.2), shall be initialized by an object, or function, of type T or by an object that can be converted into a T. Цитата archimed7592 @ f(i); // ill-formed не должно работать по другой причине Цитата A reference to type “cv1 T1” is initialized by an expression of type “cv2 T2” as follows: — If the initializer expression — is an lvalue (but is not a bit-field), and “cv1 T1” is reference-compatible with “cv2 T2,” or ... An expression which holds a temporary object resulting from a cast to a nonreference type is an rvalue(this а если ссылка const срабатывает Цитата Otherwise, the reference shall be to a non-volatile const type но для T&& это — is an lvalue (but is not a bit-field), and “cv1 T1” is reference-compatible with “cv2 T2,” or должно заменится на — is an rvalue (but is not a bit-field), and “cv1 T1” is reference-compatible with “cv2 T2,” or как мне кажется.. пойду какнить прокурю весь ман по новым ссылкам на rvalue когда время появится.. Добавлено не.. если нельзя написать void f (T2&&); ... T1 t; f (t);//где есть преобразование T1 в T2. то это нововведение выглядит вообще сомнительным. Это должно быть разрешено. |
![]() |
Сообщ.
#59
,
|
|
Вот все изменения:
Цитата An expression which holds a temporary object resulting from a cast to a --- A variable declared to be a T& or T&&, that is ``reference to type T'' (dcl.ref), shall be initialized by an object, or function, of type T or by an object that can be converted into a T. ---- Otherwise, the reference shall be an lvalue-reference to a non-volatile const type (i.e., cv1 shall be const), or shall be an rvalue-reference. Только не понял при чём тут reference-compatibility... она вроде для отношений наследования... |
Сообщ.
#60
,
|
|
|
Цитата archimed7592 @ Только не понял при чём тут reference-compatibility... она вроде для отношений наследования... Цитата is an lvalue (but is not a bit-field), and “cv1 T1” is reference-compatible with “cv2 T2,” or битовые поля то уж точно не имеют отножение к наследованию ![]() Цитата archimed7592 @ Otherwise, the reference shall be an lvalue-reference to a non-volatile const type (i.e., cv1 shall be const), or shall be an rvalue-reference. Вот.. эта добавочка позволит компилироватся коду ![]() ![]() void f (T2&&); ... T1 t; f (t);//где есть преобразование T1 в T2. ну.. мужики не глупые писали.. навернякак гдето есть добавочка которая не даст сделать ![]() ![]() void f (double& d) { d = .555; } void ff (double&& d) { f (d); } int main () { int i = 0; ff (i); } и ![]() ![]() T&& rvalueRef; T* ptr = &rvalueRef;//ok T& lvalueRef = *ptr;//ravlue превратился в lvalue хотя && будет резать мой глаз всю жизнь ![]() ![]() Добавлено вот подумал еще... я бы вообще не назвал бы это ссылкой.. пусть это будет именованный временный объект. без &&, а со значком какимнибудь.. или ключевым словом. Тогда терминология бы упростилась. Имхо имхо имхо... |