Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.223.33] |
|
Страницы: (11) « Первая ... 3 4 [5] 6 7 ... 10 11 все ( Перейти к последнему сообщению ) |
Сообщ.
#61
,
|
|
|
После этого попробуй замутить move-семантику без привлечения rv-ссылок.
Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#62
,
|
|
|
Я конечно подзабыл плюсы, но разве вот это не кака?
Цитата std::string* hw0 = &HelloWorld(); const std::string& hw = HelloWorld(); Ты же пытаешься получить указатель и ссылку на временный объект, возвращенный из функции? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#63
,
|
|
|
Цитата applegame @ Ты же пытаешься получить указатель и ссылку на временный объект, возвращенный из функции? Да. Но тут есть нюанс, завязанный на то, что ссылки - это не указатели. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#64
,
|
|
|
Цитата Flex Ferrum @ Я не знаю, что будет выведено на экран, так как у тебя тут сплошной UB. Подозреваю, что если повезет, то выведет четыре раза "Hello World!". Ну или крашнется. Можно запускать компилятор? Да. Но тут есть нюанс, завязанный на то, что ссылки - это не указатели. Добавлено насколько я понял только в этой строке все норм: auto hw2 = TakingRef(std::string("Hello World!")); потому что будет создана копия с временного объекта переданного в TakingRef по константной ссылке, и эта копия будет сохранена в hw2; Добавлено Цитата Flex Ferrum @ Дык жили же столько лет без rv-ссылок. не это ли подтверждение, что без них можно обойтись?После этого попробуй замутить move-семантику без привлечения rv-ссылок. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#65
,
|
|
|
Система типов, видимо, интересна только мне. Хнык-хнык.
Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#66
,
|
|
|
блин, наверное, невнятно выразился, поправляю: Цитата _lcf_ @ ну если про использование, то дальше что-то типа: for (auto t : enum_range (some_class_enum_mode::COUNT)) { some_class *&sc = get_class_for_mode (some_class_enum_mode(t)); if (sc) { sc = new some_class; } } Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#67
,
|
|
|
Цитата applegame @ Ты же пытаешься получить указатель и ссылку на временный объект, возвращенный из функции? Константная ссылка продлевает жизнь объекта до времени жизни самой ссылки. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#68
,
|
|
|
да, как альтернатива той портянке, что я привел - передача указателя на указатель в параметрах функции. да вот беда, если для some_class есть шаблонный врапер с чейнами...
Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#69
,
|
|
|
Цитата Flex Ferrum @ Но тут есть нюанс, завязанный на то, что ссылки - это не указатели. А зачем вообще этот нюанс ввели? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#70
,
|
|
|
Цитата applegame @ Я не знаю, что будет выведено на экран, так как у тебя тут сплошной UB. Подозреваю, что если повезет, то выведет четыре раза "Hello World!". В этом коде нет UB. Но есть две ошибки компиляции, вызванные тем, что нельзя брать адрес временного объекта - ни при возврате значения из функции, ни при передаче значения в функцию. А вот константные ссылки брать можно. И такой пример - не единственный. Как правильно было замечено выше, константная ссылка на возвращённый объект продлевает его время жизни до выхода из скоупа. То есть интерпретируется компилятором не как указатель, а как объект целиком. Весело, правда? Но так то конечно - можно продолжать думать, что ссылки - это те же указатели, вид в профиль. Цитата applegame @ Дык жили же столько лет без rv-ссылок. Угу. Жили, кололись, плакали и кушали кактус. Хорошо жили. Ага. Добавлено Цитата OpenGL @ А зачем вообще этот нюанс ввели? А вот кабы я знал. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#71
,
|
|
|
Цитата Flex Ferrum @ Но так то конечно - можно продолжать думать, что ссылки - это те же указатели, вид в профиль. А то, что это костыль в системе типов можно думать? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#72
,
|
|
|
Цитата D_KEY @ А то, что это костыль в системе типов можно думать? Тебе в который раз повторить, что ссылка типом не является? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#73
,
|
|
|
Цитата Flex Ferrum @ Цитата D_KEY @ А то, что это костыль в системе типов можно думать? Тебе в который раз повторить, что ссылка типом не является? Ты лучше пруф приведи Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#74
,
|
|
|
Цитата Flex Ferrum @ Тебе в который раз повторить, что ссылка типом не является? Цитата D_KEY @ Ты лучше пруф приведи Как я понимаю - ссылка является частью типа данных, но не каким то конкретным типом. Вот например, из того же Маерса, самое начало: Цитата Простейшая ситуация - когда ParamType является ссылочным типом или типом указателя, но не универсальной ссылкой. В этом случае вывод типа работает следующим образом. 1. Если типом expr является ссылка, ссылочная часть игнорируется. 2. Затем выполняется сопоставление типа expr с ParamType для определения T. Например, если у нас имеются шаблон template<typename Т> void f( T& param) ; // param представляет собой ссыпку и объявления переменных int х = 27 ; // х имеет тип int const int сх = х; // сх имеет тип const int const int& rx = х; // rx является ссыпкой на х как на const int то выводимые типы для pa ram и Тв разл ичных выводах будут следующ ими: f (х) ; // Т - int , тип param - int& f( cx) ; // Т - const int , тип param - coпst int& f( rx) ; // Т - const int , тип param - const int& Вот из стандарта: Цитата 11.3.2 References [dcl.ref] 1 In a declaration T D where D has either of the forms & attribute-specifier-seqopt D1 && attribute-specifier-seqopt D1 and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T”, then the type of the identifier of D is “derived-declarator-type-list reference to T”. The optional attribute-specifier-seq appertains to the reference type. Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name (10.1.3, 17.1) or decltype-specifier (10.1.7.2), in which case the cv-qualifiers are ignored. [ Example: typedef int& A; const A aref = 3; // ill-formed; lvalue reference to non-const initialized with rvalue The type of aref is “lvalue reference to int”, not “lvalue reference to const int”. — end example ] [ Note: A reference can be thought of as a name of an object. —end note ] A declarator that specifies the type “reference to cv void” is ill-formed. 2 A reference type that is declared using & is called an lvalue reference , and a reference type that is declared using && is called an rvalue reference. Lvalue references and rvalue references are distinct types. Except where explicitly noted, they are semantically equivalent and commonly referred to as references. 3 [ Example: Ссылка - это скорее атрибут типа, чем тип. Нет ссылочного типа данных в С++. Есть указатели, ссылки - это атрибут типа. Добавлено А как там уже их компилятор оптимизирует - это его личное дело, хоть пусть новый указатель заводит. Это конкретная реализация компилятора. Главное что бы поведение этих ссылок отвечало требованию стандарта. (ИМХО) Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#75
,
|
|
|
Цитата KILLER @ the type of the identifier of D is “derived-declarator-type-list reference to T”. ... The type of aref is “lvalue reference to int”, Это сообщение было перенесено сюда или объединено из темы "D vs C++" |