firerun , конкретизируй свой вопрос. Какого конкретного поведения ты хочешь добиться и что конкретно у тебя не получается сделать?
Указателей на класс в языке не существует. Выражение *this имеет тип ссылки, а не указателя.
Денис Загаевский, The C++ Programming Language
Fourth Edition
Bjarne Stroustrup 16.2.10 Self-Reference
The expression ∗this refers to the object for which a member function is invoked.
In a non-static member function, the keyword this is a pointer to the object for which the function
was invoked. In a non-const member function of class X, the type of this is X∗. However, this
is considered an rvalue, so it is not possible to take the address of this or to assign to this. In a
const member function of class X, the type of this is const X∗ to prevent modification of the object
itself
The operand of the built-in indirection operator must be pointer to object or a pointer to function, and the result is the lvalue referring to the pointer or function to which expr points.
Roman, Евгений Шатунов, Денис Загаевский, ну так в плюсах ссылка обычно (на самом деле всегда) реализуется как указатель, просто он как и *this гвоздями прибит к объекту на который указывает и по этому о нем нужно думать как об объекте, а не как указателе.
Указатель можно куда нибудь положить, например фабрика может их складировать в массив. Ссылка же прибита гвоздями к объекту, отдельно ее никуда не положишь.
На самом деле у ссылок даже адреса есть и их можно в некоторых случаях получить, правда это типа "грязный хак".
Или я чего то не понимаю?
refers to разве означает, что тип выражения - ссылка?
refersозначает "относиться" или "ссылаться".
Если для тебя это не означает, то дай свой правильный перевод. Так можно будет понять ход твоих мыслей. Возможно даже станет видно источник твоего заблуждения.
struct Foo final
{
int bar = 0;
};
// ...
Foo a;
Foo* p = &a;
(*p).bar = 5;
std::cout << a.bar;
Что будет выведено? Почему будет выведено именно то, что выведено?
Евгений Шатунов, 5. Но это не значит, что тип *p это ссылка. Ещё раз - при чём тут перевод, если мы говорим о типе выражения? Я не силён в С++, но вроде, если х имеет тип указателя на другой тип Т, то разыменование х имеет тип Т, а не Т&&
Денис Загаевский, 5 - это правильно. Почему будет выведено именно это число? Почему это не означает, что *p имеет ссылочный тип? Что означает "передача по значению"? Что означает "передача по ссылке"?
Изначально к переводу цепляться начал ты, поэтому с тебя и спрос о правильном переводе.
struct Foo final
{
int a;
Foo() { std::cout << "Foo::Foo()" << std::endl; };
~Foo() { std::cout << "Foo::~Foo()" << std::endl; };
};
// ...
Foo* a = new Foo{};
Foo& b = *a;
Foo& c = *a;
Foo& d = *a;
Foo& e = *a;
Foo& f = *a;
delete a;
Сколько раз будут выведены строки "Foo::Foo()" и "Foo::~Foo()"? Почему именно столько раз?
если х имеет тип указателя на другой тип Т, то разыменование х имеет тип Т, а не Т&&
Евгений Шатунов, ну если неверно в корне, то просто скажи, какой будет тип, да и дело с концом. Ваш С++ настолько сложный, что нельзя однозначно это сказать, или что? Я не цеплялся к переводу, я задал вопрос, только и всего.
Денис Загаевский, так в том-то и дело, что в C++ всё очень детерминировано и прозрачно. Проблемы начинаются тогда, когда люди сами документацию не читают, но мнение уже имеют. Roman тебе уже всё доходчиво сказал. Вот еще раз ссылка на документацию. Стандартная терминология lvalue reference буквально означает ссылку на значение.
В догонку тебе еще два значимых вопроса. Скомпилируется ли код, в котором делается разыменование указателя на объект незавершенного типа (forward declaration)? Можно ли хранить ссылки на объекты незавершенного типа?
> в C++ всё очень детерминировано и прозрачно
Ха-ха, посмеялся.
Ок, спасибо, я как-то пропустил ссылку в том сообщении, а жирным были выделены совсем не те места.
> В догонку тебе еще два значимых вопроса.
Понятия не имею, слишком(неоправданно) сложно. В нормальных языках никакие forward declarartion просто не нужны.
Денис Загаевский, желаю тебе удачи в создании своего убийцы плюсов, шарпов и всего ныне живущего. :)
Надеюсь, у тебя документация к языку будет многократно более исчерпывающая и полностью прозрачная.
Главное - это еще один Ruby не родить ненароком.
Денис Загаевский, disclaimer, это на случай если ты и это слово тоже неправильно понимаешь. :)
По приведенной ссылке нет дисклеймера во всем тексте.
В остальном, обязательно расскажи когда, например, Remedy выкинут "ущербный" D ради использования твоего инструмента.
Дисклеймер (англ. Disclaimer) — письменный отказ от ответственности
.
The lang project is written just for fun, author is not going to take over the world.
Именно этими словами я отказался от ответственности и прямо сказал, что делаю это просто потому что мне это нравится.
Я действительно считаю С++ неоправданно перегруженным уёбищем, в которое со всех сторон тащат какие-то странные вещи. Мне он не нравится. Кажется, я имею право на такое мнение, я же никого ни в чём не убеждаю, просто высказываюсь.
Ты придумываешь себе какие-то идиотские смыслы, думаешь, что я собираюсь убить С++ или ещё что-то - могу только посочувствовать.
Денис Загаевский, Он настолько суров, что о нем много говорят и пишут, его активно развивают, комитетов понасоздавали, всякие ежегодные cppconf проводят ну в общем и т.д. и т.п.
Roman, ребят, вы выдумали себе странное и с этим спорите. Я сказал, что лично мне этот язык не нравится,и сказал, почему. Комитеты-шмомететы, какая разница-то?
Спасибо, я понял, что *this это ссылка. Для меня это не перестало быть странностью, но ок, пусть будет.
Roman, Евгений Шатунов, вы в какой то формализм ударились. Обсуждая очевидные в общем то вещи. Кому это нужно? Ну кроме самоутверждения... Намного интереснее как эти ссылки и *this работают под капотом, а тут я ничего конструктивного не увидел. Хотелось бы для себя новые знания получить.