Тема: Що виведе програма?
#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); }
Хто скаже без компіляції що тут виведеться?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Що виведе програма?
Для відправлення відповіді ви повинні увійти або зареєструватися
#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); }
Хто скаже без компіляції що тут виведеться?
Найбільш вірогідний варіант як на мене такий:
"float" "int"
Це було б занадто просто
Скажу так, тут є невеличка заковика.
void g(auto&&... v) { (f(v), ...); }
Отримаєте помилку на отих трьох крапках
void g(auto&&... v) { (f(v), ...); }
Отримаєте помилку на отих трьох крапках
Чому це ви так вирішили?
Програма не містить ніяких синтаксичних помилок.
Тоді яку дію виконає код ось тут: auto&&..., або тут: ...
Arete написав:Найбільш вірогідний варіант як на мене такий:
"float" "int"
Це було б занадто просто
Скажу так, тут є невеличка заковика.
Ще одна ідея, можливо параметер пак з auto&&... розгортається тільки в один тип і інші змінні інших типів конвертуються в нього. Тоді одна з функцій f викличеться двічі, а інша ні разу.
Ще одна ідея, можливо параметер пак з auto&&... розгортається тільки в один тип і інші змінні інших типів конвертуються в нього. Тоді одна з функцій f викличеться двічі, а інша ні разу.
Ідея цікава, проте, ні. Але це вже трохи ближче, скажемо так, тепліше)
компілятор с++ обчислює аргументи зправа наліво, тому
спочатку інт потім флоат.
Це ж елементарні речі
спочатку інт потім флоат.
Що ж, справді, вивід буде
компілятор с++ обчислює аргументи зправа наліво
Але не через це. Почнімо з того, що компілятор С++ може передавати (не обчислювати, коли обчислює це зовсім інше, це вже order of evaluation) аргументи в функцію, як зправа наліво, так і зліва направо (це implementation-defined), а також, в цьому випадку це немає ніякого значення. Якщо ви про Fold Expression, то він завжди зліва направо. Це ж елементарні речі.
А нащо такий алгоритм, в різних частинах коду обирати відмінну послідовність виконання функцій?
Не зрозумів питання. Можете уточнити, що ви маєте на увазі під: "в різних частинах коду обирати відмінну послідовність виконання функцій"?
Маю на увазі:
по певній події викликали одну послідовність виконання функцій; int, float
по іншій - іншу. float, int
Але вважаючи на перевантаження функцій, то виглядає дуже складно.
І не ображайтесь.
Але більш схоже на з...б HR - менеджера при співбесіді, який сам не розуміє як застосувати алгоритм практично.
От як би Ви застосували цей алгоритм на практичному прикладі?
Маю на увазі:
по певній події викликали одну послідовність виконання функцій; int, float
по іншій - іншу. float, int
Але вважаючи на перевантаження функцій, то виглядає дуже складно.
І не ображайтесь.
Але більш схоже на з...б HR - менеджера при співбесіді, який сам не розуміє як застосувати алгоритм практично.
От як би Ви застосували цей алгоритм на практичному прикладі?
Немає ніякої одної чи іншої послідовності виклику функцій. В даному конкретному прикладі він один єдиний, завжди.
Практично, де таку послідовність доречно використовувати?
P. S.
Дякую за алгоритм. До виникнення цієї теми не знав про "..."(шаблон три крапки).
Практично, де таку послідовність доречно використовувати?
Яку таку? Ви схоже не розумієте про що йде мова.
Є послідовність передачі параметрів у функцію. Є послідовність обчислення параметрів функції. Є ще така штука як точки послідовності (sequence points). Про яку послідовність говорите ви?
В конкретно даному випадку те, що воно виводить не так, як очікується не через послідовність. І це не алгоритм.
Цей приклад коду на знання "механік" роботи С++.
Цей приклад коду на знання "механік" роботи С++
Тоді що?
Все одно дякую. Навело на певні корисні міркування...
wander написав:Цей приклад коду на знання "механік" роботи С++
Тоді що?
Все одно дякую. Навело на певні корисні міркування...
ur_naz написав:спочатку інт потім флоат.
Що ж, справді, вивід буде▼Прихований текстur_naz написав:компілятор с++ обчислює аргументи зправа наліво
Але не через це. Почнімо з того, що компілятор С++ може передавати (не обчислювати, коли обчислює це зовсім інше, це вже order of evaluation) аргументи в функцію, як зправа наліво, так і зліва направо (це implementation-defined), а також, в цьому випадку це немає ніякого значення. Якщо ви про Fold Expression, то він завжди зліва направо. Це ж елементарні речі.
Єдиний компілятор на рекстестері, який не фейлить при компіляції цього - g++, інші кажуть, що не можуть кастовать int
Для відправлення відповіді ви повинні увійти або зареєструватися