Re[4]: Зачем плюс?
От: rg45 СССР  
Дата: 22.11.18 16:56
Оценка: +4
Здравствуйте, σ, Вы писали:

σ>То чувство, когда притащил код с демонстрацией тонкостей плюсов, но не отличаешь Гоголя от Гегеля rvalue от rvalue reference


Зачем вот эта вот язвительность, недружелюбность, что это тебе дает?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Зачем плюс?
От: B0FEE664  
Дата: 22.11.18 17:08
Оценка:
Здравствуйте, σ, Вы писали:

BFE>>А разве это не rvalue ссылка которая преобразуется к обычной ссылке?

σ>То чувство, когда притащил код с демонстрацией тонкостей плюсов, но не отличаешь Гоголя от Гегеля rvalue от rvalue reference

Это точно. Пользуясь случаем спрошу: rvalue от rvalue reference отличается?
И каждый день — без права на ошибку...
Re[5]: Зачем плюс?
От: σ  
Дата: 22.11.18 17:13
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, σ, Вы писали:


BFE>>>А разве это не rvalue ссылка которая преобразуется к обычной ссылке?

σ>>То чувство, когда притащил код с демонстрацией тонкостей плюсов, но не отличаешь Гоголя от Гегеля rvalue от rvalue reference

BFE>Это точно. Пользуясь случаем спрошу: rvalue от rvalue reference отличается?


Да. rvalue это такой класс выражений, rvalue reference — это вид ссылок.
Re[5]: Зачем плюс?
От: rg45 СССР  
Дата: 22.11.18 17:17
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>Это точно. Пользуясь случаем спрошу: rvalue от rvalue reference отличается?


Следует различать три разных сущности: rvalue-выражение, временный объект и rvalue-ссылка. Которые обычно и появляются вот прямо в такой последовательности, как перечислено. Ссылка, любая, предполагает наличие объекта. Обратное не верно: объекты вполне могут существовать и без ссылок на них. rvalue-выражения могут материализовываться во временные объекты.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[6]: Зачем плюс?
От: σ  
Дата: 22.11.18 17:21
Оценка:
R>rvalue-выражения могут материализовываться
Не могут: https://github.com/cplusplus/draft/pull/2320
Re[6]: Зачем плюс?
От: B0FEE664  
Дата: 22.11.18 17:26
Оценка:
Здравствуйте, σ, Вы писали:

BFE>>Это точно. Пользуясь случаем спрошу: rvalue от rvalue reference отличается?

σ>Да. rvalue это такой класс выражений,
Точно выражений, а не их результата?

σ>rvalue reference — это вид ссылок.

Что изменится от того, если рассматривать всякое rvalue как имеющее rvalue reference, которая не присутствует в коде явно?
И каждый день — без права на ошибку...
Re[7]: Зачем плюс?
От: rg45 СССР  
Дата: 22.11.18 17:29
Оценка:
Здравствуйте, σ, Вы писали:

R>>rvalue-выражения могут материализовываться

σ>Не могут: https://github.com/cplusplus/draft/pull/2320

Ну это уже какие-то изменения. В более старой редакции было написано, что могут

15.2 Temporary objects
1 Temporary objects are created
(1.1) — when a prvalue is materialized so that it can be used as a glvalue (7.4),


Но я, честно говоря, пока не въехал, с чем связана такая коррекция. Буду благодарен, если прокомментируешь.

.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[8]: Зачем плюс?
От: σ  
Дата: 22.11.18 17:35
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, σ, Вы писали:


R>>>rvalue-выражения могут материализовываться

σ>>Не могут: https://github.com/cplusplus/draft/pull/2320

R>Ну это уже какие-то изменения. В более старой редакции было написано, что могут


R>

R>15.2 Temporary objects
R>1 Temporary objects are created
R>(1.1) — when a prvalue is materialized so that it can be used as a glvalue (7.4),


R>Но я, честно говоря, пока не въехал, с чем связана такая коррекция. Буду благодарен, если прокомментируешь.


С тем, что писать "prvalue is materialized" некорректно (даже если это в примечании), материализуются объекты, а не выражения.
Re[7]: Зачем плюс?
От: σ  
Дата: 22.11.18 17:37
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, σ, Вы писали:


BFE>>>Это точно. Пользуясь случаем спрошу: rvalue от rvalue reference отличается?

σ>>Да. rvalue это такой класс выражений,
BFE>Точно выражений, а не их результата?
Результат выражения — это другое http://eel.is/c++draft/basic.lval#def:result,prvalue http://eel.is/c++draft/basic.lval#def:result,glvalue
Re[3]: Зачем плюс?
От: Кодт Россия  
Дата: 22.11.18 19:14
Оценка:
Здравствуйте, rg45, Вы писали:

R>Как мне кажется, здесь избыточная сложность примера мешает взглянуть в корень. Упрощаем, насколько это возможно. Начинаем с работающего варианта:

R>https://wandbox.org/permlink/XSlvNSjYEOCapn2o

Тогда вопросы:
1) почему wandbox оказался параноидальнее ideone?
2) почему ideone смягчает свои нравы, если заменить обычную функцию на конструктор?
3) почему ideone смягчает свои нравы и с обычной функцией
void f(const int& v) {}  // нет использования - нет проблемы
int main() { f(A::value); }

void f(const int& v) { cout << v << endl; }  // есть использование - есть проблема
int main() { f(A::value); }

int f(const int& v) { cout << v << endl; return 0; }  // есть использование...
int main() { f(A::value); }  // ... есть проблема
int main() { return f(A::value); }  // ... нет проблемы


Что за механизм тут задействован, позволяющий или препятствующий инлайнить значение статической константы-члена?
Перекуём баги на фичи!
Re[4]: Зачем плюс?
От: rg45 СССР  
Дата: 22.11.18 19:34
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Тогда вопросы:

К>1) почему wandbox оказался параноидальнее ideone?
К>2) почему ideone смягчает свои нравы, если заменить обычную функцию на конструктор?
К>3) почему ideone смягчает свои нравы и с обычной функцией
К>Что за механизм тут задействован, позволяющий или препятствующий инлайнить значение статической константы-члена?

Я думаю, что все это погрешности реализации, которые неминуемо присутствуют в любых компиляторах. Вряд ли стоит искать здесь какую-то систему и более сложное объяснение.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Зачем плюс?
От: σ  
Дата: 22.11.18 19:53
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Тогда вопросы:

К>1) почему wandbox оказался параноидальнее ideone?

Потому что там выставлены разные уровни оптимизации.
Re[5]: Зачем плюс?
От: σ  
Дата: 22.11.18 19:54
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>Я думаю, что все это погрешности реализации, которые неминуемо присутствуют в любых компиляторах.


Я думаю, это нарушение правила, для которого no diagnostic required.
Re[6]: Зачем плюс?
От: rg45 СССР  
Дата: 22.11.18 19:57
Оценка:
Здравствуйте, σ, Вы писали:

R>>Я думаю, что все это погрешности реализации, которые неминуемо присутствуют в любых компиляторах.


σ>Я думаю, это нарушение правила, для которого no diagnostic required.


Ну а нарушение правила нельзя рассматривать как погрешность реализации?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: Зачем плюс?
От: σ  
Дата: 22.11.18 19:58
Оценка:
Здравствуйте, rg45, Вы писали:

R>https://wandbox.org/permlink/XSlvNSjYEOCapn2o


R>
R>struct A {
R>  static const int value = 42;
R>};

R>void foo(const int&) {}

R>int main() {
R>  foo(+A::value);
R>}
R>


R>Стоит убрать "плюсик", как начинает валиться с ошибкой: "undefined reference to `A::value'".


А если включить оптимизации, то перестаёт.

R> выражения "A::value" и "+A::value" имеют разные типы: первое — lvalue, второе — rvalue.


Первое — const int, второе — int.
Re[7]: Зачем плюс?
От: σ  
Дата: 22.11.18 20:00
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, σ, Вы писали:


R>>>Я думаю, что все это погрешности реализации, которые неминуемо присутствуют в любых компиляторах.


σ>>Я думаю, это нарушение правила, для которого no diagnostic required.


R>Ну а нарушение правила нельзя рассматривать как погрешность реализации?


Правило нарушает не реализация, а транслируемый C++-код. И реализация не обязана детектировать нарушение.
Re[8]: Зачем плюс?
От: rg45 СССР  
Дата: 22.11.18 20:08
Оценка:
Здравствуйте, σ, Вы писали:

R>>Ну а нарушение правила нельзя рассматривать как погрешность реализации?


σ>Правило нарушает не реализация, а транслируемый C++-код. И реализация не обязана детектировать нарушение.


Ну если нам больше нечем заняться, кроме как словесным онанизмом, то более правильным выражением было бы что-то вроде: "погрешности в реализации приводят к нарушению правила...". Рассуждать об обязанностях неодушевленной субстанции несколько странно
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[9]: Зачем плюс?
От: σ  
Дата: 22.11.18 20:18
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, σ, Вы писали:


R>>>Ну а нарушение правила нельзя рассматривать как погрешность реализации?


σ>>Правило нарушает не реализация, а транслируемый C++-код. И реализация не обязана детектировать нарушение.


R>Ну если нам больше нечем заняться, кроме как словесным онанизмом, то более правильным выражением было бы что-то вроде: "погрешности в реализации приводят к нарушению правила...".


Не было бы.

R> Рассуждать об обязанностях неодушевленной субстанции несколько странно


Я так не считаю. И стандарт тоже.
> No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.
> Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program outside of a discarded statement; no diagnostic required.

И т.д.
Re[10]: Зачем плюс?
От: rg45 СССР  
Дата: 22.11.18 20:25
Оценка:
Здравствуйте, σ, Вы писали:

σ>Не было бы.

Было бы.

σ>Я так не считаю.

А я считаю.

σ>>Правило нарушает не реализация, а транслируемый C++-код. И реализация не обязана детектировать нарушение.


И стандарт тоже.
>> No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.
>> Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program outside of a discarded statement; no diagnostic required.
σ>И т.д.

Отучаемся говорить за других. Берем переводчик, переводим свои слова и сравниваем с тем, что написано.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[11]: Зачем плюс?
От: σ  
Дата: 22.11.18 20:57
Оценка:
σ>>Не было бы.
R>Было бы.
σ>>Я так не считаю.
R>А я считаю.



σ>>>Правило нарушает не реализация, а транслируемый C++-код. И реализация не обязана детектировать нарушение.


R>И стандарт тоже.

>>> No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.
>>> Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program outside of a discarded statement; no diagnostic required.
σ>>И т.д.

R>Отучаемся говорить за других.


Это вообще к чему?

R> Берем переводчик, переводим свои слова и сравниваем с тем, что написано.


Какие именно слова надо сравнивать? Я привёл цитаты из стандарта просто для примера рассуждения об обязанностях неодушевлённых предметов.
Но таки да, вторая цитата — это нарушаемое правило. Только я всё равно не пойму, что ты так возбудился. Из-за того, что я написал "транслируемый C++-код", а в стандарте сказано "программа"?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.