Re[8]: Зачем плюс?
От: B0FEE664  
Дата: 23.11.18 08:36
Оценка:
Здравствуйте, σ, Вы писали:

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

The result of a prvalue is the value that the expression stores into its context.

И каков же тип этого value?
И каждый день — без права на ошибку...
Re[4]: Зачем плюс?
От: B0FEE664  
Дата: 23.11.18 09:12
Оценка: 9 (1)
Здравствуйте, Кодт, Вы писали:

К>Что за механизм тут задействован, позволяющий или препятствующий инлайнить значение статической константы-члена?


Я понимаю так:
— статическая переменная — она одна на всё единицы трансляции.
— пока статическая переменная рассматривается как макрос — т.е. используется только значение переменной, но не сама переменная, то это значение может подставляться в каждой единице трансляции независимо от других использований.
— если в какой-то единице трансляции компилятор обнаруживает использование статической переменной, как переменной, а не как её результата, то компилятору необходимо иметь точку привязки, чтобы согласовать использование этой переменной в различных единицах трансляции. (Вдруг где-то есть использование адреса этой переменной для задания ключа в каком-нибудь мапе, например.) Обнаружение использования статической переменной как переменной — задача не тривиальная, так как, например ссылка на переменную может рассматриваться компилятором, как указатель, а может и не рассматриваться, если её удаётся соптимизировать до прямого использования значения, а оптимизация, понятно, зависит от опций оптимизации.
— если перед переменной поставить '+', то становится очевидным, что далее будет использована ссылка на временную переменную, а не ссылка на статическую переменную и поэтому можно использовать значение переменной.
И каждый день — без права на ошибку...
Re[12]: Зачем плюс?
От: rg45 СССР  
Дата: 23.11.18 10:16
Оценка: +1
Здравствуйте, σ, Вы писали:


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


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


Да психанул я вчера.

Ни в коем случае не ставлю под сомнение твою квалификацию. Но, ИМХО, ты ничуть не потеряешь, если будешь развивать свою мысль чуть более полно. Вот я лично смотрю на большинство твоих сообщений и гадаю: "К чему он это написал... Что он имел в виду...". Порой складывается впечатление, что главная твоя цель — это завесить интригу.

Почему бы, например, просто не дать развернутый ответ на поставленные вопросы: http://rsdn.org/forum/cpp/7305504.1
Автор: Кодт
Дата: 22.11.18
? Вместо того, чтобы бросать какими-то обрывками фраз в других отвечающих?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 23.11.2018 10:38 rg45 . Предыдущая версия . Еще …
Отредактировано 23.11.2018 10:23 rg45 . Предыдущая версия .
Отредактировано 23.11.2018 10:22 rg45 . Предыдущая версия .
Re: Зачем плюс?
От: Erop Россия  
Дата: 23.11.18 12:13
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>Что это, как не живительная сила rvalue ссылок?

Это неизбежное следствие усложнения языка. Код превращается в ребус ;(
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Зачем плюс?
От: Erop Россия  
Дата: 23.11.18 12:15
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>Разве по стандарту 98 можно было передать временный объект по ссылке? (Помню, что MS компилятор отходил от стандарта в этом случае)


По константной всегда можно было любое r-value
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Зачем плюс?
От: B0FEE664  
Дата: 26.11.18 09:34
Оценка: +1
Здравствуйте, σ, Вы писали:

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

Ответа на вопрос
Автор: B0FEE664
Дата: 23.11.18
не будет? Я просил что-то неприличное?
И каждый день — без права на ошибку...
Re[9]: Зачем плюс?
От: σ  
Дата: 26.11.18 18:29
Оценка:
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
BFE>

BFE>The result of a prvalue is the value that the expression stores into its context.

BFE>И каков же тип этого value?
Таков же, каков тип prvalue. Устроит такой ответ?
Re[10]: Зачем плюс?
От: B0FEE664  
Дата: 27.11.18 10:41
Оценка:
Здравствуйте, σ, Вы писали:

BFE>>

BFE>>The result of a prvalue is the value that the expression stores into its context.

BFE>>И каков же тип этого value?
σ>Таков же, каков тип prvalue.
И какой тип у prvalue?

σ>Устроит такой ответ?

Пока не понятно.
И каждый день — без права на ошибку...
Re[11]: Зачем плюс?
От: N. I.  
Дата: 27.11.18 13:12
Оценка:
B0FEE664:

BFE>>>

BFE>>>The result of a prvalue is the value that the expression stores into its context.

BFE>>>И каков же тип этого value?
σ>>Таков же, каков тип prvalue.
BFE>И какой тип у prvalue?

Зависит от того, как это prvalue сформировано.

σ>>Устроит такой ответ?

BFE>Пока не понятно.

Ну, зато теперь я пришёл и всё прояснил. Можно не благодарить.
Re[12]: Зачем плюс?
От: B0FEE664  
Дата: 27.11.18 13:20
Оценка:
Здравствуйте, N. I., Вы писали:

BFE>>>>

BFE>>>>The result of a prvalue is the value that the expression stores into its context.

BFE>>>>И каков же тип этого value?
σ>>>Таков же, каков тип prvalue.
BFE>>И какой тип у prvalue?
NI>Зависит от того, как это prvalue сформировано.

Допустим, что вот так, как в исходном посте:
+A::TIMEOUT


Какой тип?
И каждый день — без права на ошибку...
Re[13]: Зачем плюс?
От: N. I.  
Дата: 27.11.18 14:26
Оценка:
B0FEE664:

BFE>Допустим, что вот так, как в исходном посте:

BFE>
BFE>+A::TIMEOUT
BFE>

BFE>Какой тип?

Такой же, как у операнда унарного плюса после применения к нему integral promotions (если такие promotions нужны). В данном случае A::TIMEOUT имеет тип unsigned int, promotions ему не нужны, выражение +A::TIMEOUT — prvalue типа unsigned int. В стандарте тип такого prvalue формально, похоже, нигде не определяется, описан лишь тип результата. Однако наличие результата у подобных выражений необязательно (если их использовать как операнд sizeof, typeid, decltype или noexcept, то результат не вычисляется), в то время как возможность определить, какой тип имеет выражение, должна быть всегда.
Re[14]: Зачем плюс?
От: B0FEE664  
Дата: 27.11.18 16:09
Оценка:
Здравствуйте, N. I., Вы писали:

BFE>>Допустим, что вот так, как в исходном посте:

BFE>>
BFE>>+A::TIMEOUT
BFE>>

BFE>>Какой тип?

NI>Такой же, как у операнда унарного плюса после применения к нему integral promotions (если такие promotions нужны). В данном случае A::TIMEOUT имеет тип unsigned int, promotions ему не нужны, выражение +A::TIMEOUT — prvalue типа unsigned int.


Предположим, что это действительно так.
Рассмотрим функцию:
void foo(unsigned int&& n){}


Попытаемся её вызвать:
  unsigned int n = 300;
  foo(n);

ожидаемо получим ошибку компиляции.

Однако вот такой вызов пройдёт:
  foo(+A::TIMEOUT);


Если n и +A::TIMEOUT имеют одинаковый тип, то почему мы имеем разницу в поведении?
И каждый день — без права на ошибку...
Re[15]: Зачем плюс?
От: σ  
Дата: 27.11.18 16:59
Оценка:
BFE>Если n и +A::TIMEOUT имеют одинаковый тип, то почему мы имеем разницу в поведении?

Для инициализации ссылок важен не только тип, но и value category.
Re[15]: Зачем плюс?
От: N. I.  
Дата: 27.11.18 18:08
Оценка:
B0FEE664:

BFE>Если n и +A::TIMEOUT имеют одинаковый тип, то почему мы имеем разницу в поведении?




В следующем примере компилятор выдаёт две ошибки:

https://wandbox.org/permlink/pG2VqW3cVgmitbZL

где подробно описано, что пытаются инициализировать и чем. Если и после медитации над этими ошибками не будет понятно, чем выражения могут отличаться друг от друга помимо типа, то дела совсем плохи...
Re[16]: Зачем плюс?
От: rg45 СССР  
Дата: 27.11.18 21:51
Оценка:
Здравствуйте, N. I., Вы писали:

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


Прошу прощения за интимный вопрос: вы с сигмой, случайно, не один и тот же человек?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[16]: Зачем плюс?
От: B0FEE664  
Дата: 28.11.18 09:03
Оценка:
Здравствуйте, σ, Вы писали:

BFE>>Если n и +A::TIMEOUT имеют одинаковый тип, то почему мы имеем разницу в поведении?


σ>Для инициализации ссылок важен не только тип, но и value category.


Т.е. вы хотите сказать, что два объекта одного и того же типа не являются взаимозаменяемыми?
Поясню.
Допустим у меня есть два объекта a1 и a2 типа int. Вы утверждаете, что нельзя один объект, скажем a1, заменить другим объектом — a2, не смотря на то, что эти два объекта одинакового типа. Вам не кажется это странным? Т.е. теперь, по вашему мнению, поведение объекта не определяется его типом?
И каждый день — без права на ошибку...
Re[16]: Зачем плюс?
От: B0FEE664  
Дата: 28.11.18 09:19
Оценка:
Здравствуйте, N. I., Вы писали:

BFE>>Если n и +A::TIMEOUT имеют одинаковый тип, то почему мы имеем разницу в поведении?

NI>
NI>В следующем примере компилятор выдаёт две ошибки:
NI>https://wandbox.org/permlink/pG2VqW3cVgmitbZL
NI>где подробно описано, что пытаются инициализировать и чем. Если и после медитации над этими ошибками не будет понятно, чем выражения могут отличаться друг от друга помимо типа, то дела совсем плохи...

Что, по вашему, принято называть типом в программировании?
Согласны ли во следующими высказываниями:
int — это тип 'int' — тип целочисленной переменной
int& — это тип 'ссылка на int'
int* — это тип 'указатель на int'
int*& — это тип 'ссылка на указатель на int'
?
В соответствии с этим принципом, что из нижепреведённого сообщения об ошибке является названием типа?:

cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'

Вот это тип:

non-const lvalue reference of type 'int&'

или нет?
А это:

rvalue of type 'int'

?
И каждый день — без права на ошибку...
Re[17]: Зачем плюс?
От: N. I.  
Дата: 28.11.18 11:21
Оценка: +1 -1
rg45:

R>Прошу прощения за интимный вопрос: вы с сигмой, случайно, не один и тот же человек?


Не, но я его прекрасно понимаю. Данный топик — это какой-то один сплошной курьёз. Задаваемые здесь вопросы касаемо выражений выглядят примерно так же, как если б тут был форум электронщиков и какой-нибудь электрик четвёртого разряда на полном серьёзе просил разъяснений, чем постоянный ток отличается от переменного. И смех и грех.

Одно дело, когда в теории плавает новичок, недавно начавший изучение языка, либо предметом разговора являются сложные для понимания или специфичные редко используемые фичи, и совсем другое — когда глупые вопросы по азам C++ задаются челом, который использует плюсы несколько лет, причём не как любитель, а как профессиональный программер, работающий на некую реальную контору (судя по его словам в других топиках). С таким стажем базовую терминологию и базовые концепции языка уже надобно знать, как таблицу умножения. А ежели обнаружились пробелы, хорошо бы уметь самостоятельно найти соответствующую инфу в стандарте — благо его текст легко найти в открытом доступе, правила в нём структурированы по соответствующим главам и параграфам и многое там можно быстро отыскать, просто используя поиск по ключевым словам. За один вечер вполне реально разобраться во всех этих value categories и далее полученные знания пригодятся для чёткого понимания, как компилятор интерпретирует то или иное выражение. Если что не понятно в стандарте — можно зайти на форум и спросить.

По данному же топику видно, что товарищ пытается делать какие-то умозаключения, не вникая в смысл основных терминов и жонглируя ими как попало. До тех пор, пока он не изменит свой подход, объяснять ему что-либо, скорее всего, бесполезно.
Re[17]: Зачем плюс?
От: N. I.  
Дата: 28.11.18 11:22
Оценка: 74 (1) +1
B0FEE664:

σ>>Для инициализации ссылок важен не только тип, но и value category.


BFE>Т.е. вы хотите сказать, что два объекта одного и того же типа не являются взаимозаменяемыми?


Сказанное выше относилось к выражениям, а не объектам.

BFE>Поясню.

BFE>Допустим у меня есть два объекта a1 и a2 типа int. Вы утверждаете, что нельзя один объект, скажем a1, заменить другим объектом — a2, не смотря на то, что эти два объекта одинакового типа. Вам не кажется это странным? Т.е. теперь, по вашему мнению, поведение объекта не определяется его типом?

Для начала тебе надо уяснить, что такое "объект", что такое "выражение", и чем одно отличается от другого. Без понимания этих терминов дальше ты не продвинешься.

В общем случае возможность инициализации ссылки неким инициализатором зависит от трёх характеристик выражения, используемого в качестве данного инициализатора: тип, value category и принадлежность к bit-field. Ни value category, ни принадлежность к bit-field не являются частью типа — это отдельные характеристики.

Например, lvalue reference to int можно инициализировать посредством non-bit-field lvalue of type int, но нельзя инициализировать посредством rvalue of type int или bit-field of type int:

struct X
{
    int bitfield_lvalue : 4;
};

int main(int argc, char **argv)
{
    int regular_lvalue;
    X x;

    regular_lvalue = 1;                                                  // OK: assignment to an lvalue
    0 = 1;                                                               // error: assignment to an rvalue
    x.bitfield_lvalue = 1;                                               // OK: assignment to a bit-field lvalue
    (argc < 2 ? x.bitfield_lvalue : regular_lvalue) = 2;                 // OK: assignment to a bit-field lvalue

    int &lvalue_ref_1 = regular_lvalue;                                  // OK: initialization with a non-bit-field lvalue
    int &lvalue_ref_2 = 0;                                               // error: initialization with an rvalue
    int &lvalue_ref_3 = x.bitfield_lvalue;                               // error: initialization with a bit-field
    int &lvalue_ref_4 = (argc < 2 ? x.bitfield_lvalue : regular_lvalue); // error: initialization with a bit-field
}
Re[17]: Зачем плюс?
От: N. I.  
Дата: 28.11.18 11:23
Оценка:
B0FEE664:

BFE>В соответствии с этим принципом, что из нижепреведённого сообщения об ошибке является названием типа?:

BFE>

cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'

BFE>Вот это тип:
BFE>

non-const lvalue reference of type 'int&'

BFE>или нет?
BFE>А это:
BFE>

rvalue of type 'int'

BFE>?

Разве в самом сообщении об ошибке недостаточно ясно указано, что там относится к типам?

prog.cc: In function 'int main()':
prog.cc:6:29: error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
    6 |     int &lvalue_ref = rvalue();
      |                       ~~~~~~^~
prog.cc:7:30: error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'
    7 |     int &&rvalue_ref = lvalue();
      |                        ~~~~~~^~

По-моему, яснее уже некуда...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.