1

Тема: Що виведе програма?

#include <stdio.h>
void f(float&&) { puts("float"); }
void f(int&&) { puts("int"); }
void g(auto&&... v) { (f(v), ...); }
int main() { g(1.0f, 2); }

Хто скаже без компіляції що тут виведеться? :)

Подякували: Droid 771

2

Re: Що виведе програма?

Найбільш вірогідний варіант як на мене такий:

"float"
"int"
Подякували: wander1

3

Re: Що виведе програма?

Arete написав:

Найбільш вірогідний варіант як на мене такий:

"float"
"int"

Це було б занадто просто :)
Скажу так, тут є невеличка заковика.

Подякували: Arete1

4

Re: Що виведе програма?

void g(auto&&... v) { (f(v), ...); }

Отримаєте помилку на отих трьох крапках  %)

5

Re: Що виведе програма?

Droid 77 написав:
void g(auto&&... v) { (f(v), ...); }

Отримаєте помилку на отих трьох крапках  %)

Чому це ви так вирішили?
Програма не містить ніяких синтаксичних помилок.

6 Востаннє редагувалося Droid 77 (16.03.2021 15:08:41)

Re: Що виведе програма?

Тоді яку дію виконає код ось тут: auto&&..., або тут: ...

7

Re: Що виведе програма?

Droid 77 написав:

Тоді яку дію виконає код ось тут: auto&&..., або тут: ...

Раз, два, три

Подякували: leofun011

8

Re: Що виведе програма?

wander написав:
Arete написав:

Найбільш вірогідний варіант як на мене такий:

"float"
"int"

Це було б занадто просто :)
Скажу так, тут є невеличка заковика.

Ще одна ідея, можливо параметер пак з auto&&... розгортається тільки в один тип і інші змінні інших типів конвертуються в нього. Тоді одна з функцій f викличеться двічі, а інша ні разу.

9

Re: Що виведе програма?

Arete написав:

Ще одна ідея, можливо параметер пак з auto&&... розгортається тільки в один тип і інші змінні інших типів конвертуються в нього. Тоді одна з функцій f викличеться двічі, а інша ні разу.

Ідея цікава, проте, ні. Але це вже трохи ближче, скажемо так, тепліше)

Прихований текст

Дам підказку: заковика не у подвійному виклику.

10 Востаннє редагувалося ur_naz (17.03.2021 14:04:26)

Re: Що виведе програма?

компілятор с++  обчислює аргументи зправа наліво, тому
спочатку інт потім флоат.
Це ж елементарні речі

Подякували: wander1

11 Востаннє редагувалося wander (17.03.2021 15:45:41)

Re: Що виведе програма?

ur_naz написав:

спочатку інт потім флоат.

*BRAVO*
Що ж, справді, вивід буде

Прихований текст
int
float
ur_naz написав:

компілятор с++  обчислює аргументи зправа наліво

Але не через це. Почнімо з того, що компілятор С++ може передавати (не обчислювати, коли обчислює це зовсім інше, це вже order of evaluation) аргументи в функцію, як зправа наліво, так і зліва направо (це implementation-defined), а також, в цьому випадку це немає ніякого значення. Якщо ви про Fold Expression, то він завжди зліва направо. Це ж елементарні речі.

Подякували: leofun011

12 Востаннє редагувалося Droid 77 (17.03.2021 18:02:46)

Re: Що виведе програма?

А нащо такий алгоритм, в різних частинах коду обирати відмінну послідовність виконання функцій?

13 Востаннє редагувалося wander (17.03.2021 18:36:29)

Re: Що виведе програма?

Не зрозумів питання. Можете уточнити, що ви маєте на увазі під: "в різних частинах коду обирати відмінну послідовність виконання функцій"?

14 Востаннє редагувалося Droid 77 (17.03.2021 19:15:56)

Re: Що виведе програма?

Маю на увазі:
по певній події викликали одну послідовність виконання функцій; int, float
по іншій - іншу. float, int
Але вважаючи на перевантаження функцій, то виглядає дуже складно.
І не ображайтесь.
Але більш схоже на з...б HR - менеджера при співбесіді, який сам не розуміє як застосувати алгоритм практично.
От як би Ви застосували цей алгоритм на практичному прикладі?

15

Re: Що виведе програма?

Droid 77 написав:

Маю на увазі:
по певній події викликали одну послідовність виконання функцій; int, float
по іншій - іншу. float, int
Але вважаючи на перевантаження функцій, то виглядає дуже складно.
І не ображайтесь.
Але більш схоже на з...б HR - менеджера при співбесіді, який сам не розуміє як застосувати алгоритм практично.
От як би Ви застосували цей алгоритм на практичному прикладі?

Немає ніякої одної чи іншої послідовності виклику функцій. В даному конкретному прикладі він один єдиний, завжди.

16 Востаннє редагувалося Droid 77 (17.03.2021 20:33:05)

Re: Що виведе програма?

Практично, де таку послідовність доречно використовувати?

P. S.
Дякую за алгоритм. До виникнення цієї теми не знав про "..."(шаблон три крапки).

17

Re: Що виведе програма?

Droid 77 написав:

Практично, де таку послідовність доречно використовувати?

Яку таку? Ви схоже не розумієте про що йде мова.
Є послідовність передачі параметрів у функцію. Є послідовність обчислення параметрів функції. Є ще така штука як точки послідовності (sequence points). Про яку послідовність говорите ви?
В конкретно даному випадку те, що воно виводить не так, як очікується не через послідовність. І це не алгоритм.
Цей приклад коду на знання "механік" роботи С++.

Подякували: leofun011

18 Востаннє редагувалося Droid 77 (17.03.2021 22:13:40)

Re: Що виведе програма?

wander написав:

Цей приклад коду на знання "механік" роботи С++

Тоді що?
Все одно дякую. Навело на певні корисні міркування...

19 Востаннє редагувалося wander (17.03.2021 23:17:44)

Re: Що виведе програма?

Droid 77 написав:
wander написав:

Цей приклад коду на знання "механік" роботи С++

Тоді що?
Все одно дякую. Навело на певні корисні міркування...

Прихований текст

Відповідь.

Прихований текст

Всередині ф-ї g() аргументи lvalue.
lvalue не біндиться до rvalue-посилання просто так, тому компілятор змушений отримати інше rvalue (створити найближчий відповідний для перевантаження тимчасовий об'єкт), і для int - це float, а для float - int.

20

Re: Що виведе програма?

wander написав:
ur_naz написав:

спочатку інт потім флоат.

*BRAVO*
Що ж, справді, вивід буде

Прихований текст
int
float
ur_naz написав:

компілятор с++  обчислює аргументи зправа наліво

Але не через це. Почнімо з того, що компілятор С++ може передавати (не обчислювати, коли обчислює це зовсім інше, це вже order of evaluation) аргументи в функцію, як зправа наліво, так і зліва направо (це implementation-defined), а також, в цьому випадку це немає ніякого значення. Якщо ви про Fold Expression, то він завжди зліва направо. Це ж елементарні речі.

Єдиний компілятор на рекстестері, який не фейлить при компіляції цього - g++, інші кажуть, що не можуть кастовать int