From 2c805578784797006135ea48def56c3ae38c3364 Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Fri, 30 Jun 2023 14:21:07 +0300 Subject: [PATCH 01/12] Merge important things from v1 --- CNAME | 1 + backup/all_comments.json | 44618 +++++++++++++++++++++++++++++++++++++ backup/all_issues.json | 37948 +++++++++++++++++++++++++++++++ backup/make_backup.sh | 20 + backup/mapping.txt | 433 + backup/old-site.html | 2 + 6 files changed, 83022 insertions(+) create mode 100644 CNAME create mode 100644 backup/all_comments.json create mode 100644 backup/all_issues.json create mode 100755 backup/make_backup.sh create mode 100644 backup/mapping.txt create mode 100644 backup/old-site.html diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..c2899bf --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +stdcpp.ru \ No newline at end of file diff --git a/backup/all_comments.json b/backup/all_comments.json new file mode 100644 index 0000000..a0ffc3d --- /dev/null +++ b/backup/all_comments.json @@ -0,0 +1,44618 @@ +[ + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207280793", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1207280793", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1207280793, + "node_id": "IC_kwDOFK7cns5H9aSZ", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-06T20:49:36Z", + "updated_at": "2022-08-06T20:49:36Z", + "author_association": "NONE", + "body": "\"Да как угодно, хоть так:\"\r\nА востанавливать как?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207280793/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207425599", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1207425599", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1207425599, + "node_id": "IC_kwDOFK7cns5H99o_", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-07T14:55:11Z", + "updated_at": "2022-08-07T15:06:58Z", + "author_association": "NONE", + "body": ">[kelbon] массив указателей на функции.\r\n\r\nИ как именно это должно выглядеть? В каком месте это лучше?\r\nhttps://godbolt.org/z/enx61P9ez\r\n\r\nТут подумал что вместо слова next_case можно использовать break:\r\n```\r\nswitch(it) { default: { /* if none */ }\r\nbreak: { /*case 0*/ }\r\nbreak: { /*case 1*/ }\r\nbreak: { /*case 2*/ }\r\n};\r\n```\r\nпо моему в таком виде вообще будет идеально.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207425599/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1209918022", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1209918022", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1209918022, + "node_id": "IC_kwDOFK7cns5IHeJG", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-09T21:34:24Z", + "updated_at": "2022-08-09T21:36:21Z", + "author_association": "NONE", + "body": "> В каком месте это лучше?https://godbolt.org/z/enx61P9ez\r\n\r\nЭто удовлетворяет вашему же требованию:\r\n> Так в случае вставки, удаления или перестановки последовательности шагов не надо будет вручную менять индексы. \r\n\r\n… без изменения стандарта и поломки существующего кода (т.к. `next_case` должно стать ключевым словом).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1209918022/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1210315320", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1210315320", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1210315320, + "node_id": "IC_kwDOFK7cns5II_I4", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-10T08:09:08Z", + "updated_at": "2022-08-10T08:12:13Z", + "author_association": "NONE", + "body": "В варианте 2 надо постоянно дублировать имя класса. В случае ссылки не на челен класса сломается.\r\nВ варианте 3 оверхед. Причем некоторые компиляторы могут нагенерить много мусора.\r\nНе единообразна последняя запись.\r\n\r\nМожно без \"next_case\" а с спец меткой \"break:\" - это не поломает ничего и расширит функционал. При наличии двух одинаковых меток, старый компилятор выругается, иде будут раскрашивать как и раньше. Сплошные плюсы.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1210315320/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1211872857", + "html_url": "https://github.com/cpp-ru/ideas/issues/470#issuecomment-1211872857", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/470", + "id": 1211872857, + "node_id": "IC_kwDOFK7cns5IO7ZZ", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T11:38:27Z", + "updated_at": "2022-08-11T11:38:27Z", + "author_association": "MEMBER", + "body": "Добавили std::float16_t и std::bfloat16_t", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1211872857/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1211876222", + "html_url": "https://github.com/cpp-ru/ideas/issues/470#issuecomment-1211876222", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/470", + "id": 1211876222, + "node_id": "IC_kwDOFK7cns5IO8N-", + "user": { + "login": "ilnurkh", + "id": 22670232, + "node_id": "MDQ6VXNlcjIyNjcwMjMy", + "avatar_url": "https://avatars.githubusercontent.com/u/22670232?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/ilnurkh", + "html_url": "https://github.com/ilnurkh", + "followers_url": "https://api.github.com/users/ilnurkh/followers", + "following_url": "https://api.github.com/users/ilnurkh/following{/other_user}", + "gists_url": "https://api.github.com/users/ilnurkh/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ilnurkh/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ilnurkh/subscriptions", + "organizations_url": "https://api.github.com/users/ilnurkh/orgs", + "repos_url": "https://api.github.com/users/ilnurkh/repos", + "events_url": "https://api.github.com/users/ilnurkh/events{/privacy}", + "received_events_url": "https://api.github.com/users/ilnurkh/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T11:42:13Z", + "updated_at": "2022-08-11T11:42:13Z", + "author_association": "NONE", + "body": "в каком стандарте оно появится?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1211876222/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1211892028", + "html_url": "https://github.com/cpp-ru/ideas/issues/182#issuecomment-1211892028", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/182", + "id": 1211892028, + "node_id": "IC_kwDOFK7cns5IPAE8", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T11:57:37Z", + "updated_at": "2022-08-11T11:57:37Z", + "author_association": "MEMBER", + "body": "Добавили std::float16_t, std::bfloat16_t и std::float128_t в https://wg21.link/p1467", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1211892028/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212287860", + "html_url": "https://github.com/cpp-ru/ideas/issues/419#issuecomment-1212287860", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/419", + "id": 1212287860, + "node_id": "IC_kwDOFK7cns5IQgt0", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T17:40:13Z", + "updated_at": "2022-08-11T17:40:13Z", + "author_association": "MEMBER", + "body": "Доразделили стандартную библиотеку на freestanding и hosted уровни в https://wg21.link/P1642", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212287860/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212294487", + "html_url": "https://github.com/cpp-ru/ideas/issues/516#issuecomment-1212294487", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/516", + "id": 1212294487, + "node_id": "IC_kwDOFK7cns5IQiVX", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T17:47:05Z", + "updated_at": "2022-08-11T17:47:05Z", + "author_association": "MEMBER", + "body": "Идея уже в работе вот тут https://github.com/cpp-ru/ideas/issues/26", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212294487/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212362539", + "html_url": "https://github.com/cpp-ru/ideas/issues/397#issuecomment-1212362539", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/397", + "id": 1212362539, + "node_id": "IC_kwDOFK7cns5IQy8r", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T18:45:56Z", + "updated_at": "2022-08-11T18:45:56Z", + "author_association": "MEMBER", + "body": "Закрываю, как непопулярную идею. Голосование в международном комитете не пройдёт.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212362539/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212363475", + "html_url": "https://github.com/cpp-ru/ideas/issues/240#issuecomment-1212363475", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/240", + "id": 1212363475, + "node_id": "IC_kwDOFK7cns5IQzLT", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T18:46:55Z", + "updated_at": "2022-08-11T18:46:55Z", + "author_association": "MEMBER", + "body": "Закрываю, как непопулярную идею. Голосование в международном комитете не пройдёт.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212363475/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212364130", + "html_url": "https://github.com/cpp-ru/ideas/issues/131#issuecomment-1212364130", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/131", + "id": 1212364130, + "node_id": "IC_kwDOFK7cns5IQzVi", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T18:47:39Z", + "updated_at": "2022-08-11T18:47:39Z", + "author_association": "MEMBER", + "body": "Закрываю, как непопулярную идею. Голосование в международном комитете не пройдёт (но лично мне идея приглянулась).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212364130/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212364641", + "html_url": "https://github.com/cpp-ru/ideas/issues/200#issuecomment-1212364641", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/200", + "id": 1212364641, + "node_id": "IC_kwDOFK7cns5IQzdh", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T18:48:16Z", + "updated_at": "2022-08-11T18:48:16Z", + "author_association": "MEMBER", + "body": "Закрываю, как непопулярную идею. Голосование в международном комитете не пройдёт.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212364641/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212365933", + "html_url": "https://github.com/cpp-ru/ideas/issues/214#issuecomment-1212365933", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/214", + "id": 1212365933, + "node_id": "IC_kwDOFK7cns5IQzxt", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T18:49:41Z", + "updated_at": "2022-08-11T18:49:41Z", + "author_association": "MEMBER", + "body": "Закрываю, как непопулярную идею. Голосование в международном комитете не пройдёт.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212365933/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212373734", + "html_url": "https://github.com/cpp-ru/ideas/issues/326#issuecomment-1212373734", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/326", + "id": 1212373734, + "node_id": "IC_kwDOFK7cns5IQ1rm", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T18:59:01Z", + "updated_at": "2022-08-11T18:59:01Z", + "author_association": "MEMBER", + "body": "Закрываю, как непопулярную идею. Голосование в международном комитете не пройдёт.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212373734/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212488487", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1212488487", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1212488487, + "node_id": "IC_kwDOFK7cns5IRRsn", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-11T21:01:42Z", + "updated_at": "2022-08-11T21:06:04Z", + "author_association": "NONE", + "body": "Вот еще пример использования https://godbolt.org/z/b9vaMGxxE\r\n```cpp\r\n#include \r\n\r\nstruct Loop {\r\n\tint timer, state, exit_code;\r\n\tLoop() { setup(); }\r\n\tLoop* setup() { timer=0; state=0; exit_code=-1; return this; }\r\n\tbool timeout(int limit) const { return timer>limit; }\r\n\tvoid exit(int code=0) { exit_code=code; }\r\n\tvoid next() { state++; timer=0; }\r\n\t//...\r\n};\r\n\r\nstruct Actor {\r\n\tenum { SOME_COMMAND=47, ACK=5, NACK=7, INVALID=255 } received;\r\n\tbool recv() { received=ACK; printf(\" recv\"); return true; }\r\n\tvoid send(int cmd) { printf(\" send\"); }\r\n};\r\n\r\nstruct Walker {\r\n\tLoop loop[1]; Actor *actor;\r\n\tLoop* setup(Actor *actor) {\r\n\t\tthis->actor=actor;\r\n\t\treturn loop->setup();\r\n\t}\r\n#if 0\r\n\tvoid step() {\r\n\t\tswitch(loop->state) { default: loop->exit();\r\n\t\tbreak;case 0:\r\n\t\t\tif (loop->timeout(500)) loop->next();\r\n\t\tbreak;case 1:\r\n\t\t\tactor->send(Actor::SOME_COMMAND); loop->next();\r\n\t\tbreak;case 2: \r\n\t\t\tif (loop->timeout(500)) loop->exit(1);\r\n\t\t\tif (actor->recv()) loop->next();\r\n\t\tbreak;case 3: \r\n\t\t\tif (actor->received==Actor::ACK) loop->next();\r\n\t\t\telse if (actor->received==Actor::NACK) loop->exit(2);\r\n\t\t\telse loop->exit(3);\r\n\t\tbreak;case 4:\r\n\t\t\tif (loop->timeout(500)) loop->next();\r\n\t\t}\r\n\t}\r\n#else\r\n\tvoid step() {\r\n\t\tswitch(loop->state) { default: loop->exit();\r\n\t\tbreak:\r\n\t\t\tif (loop->timeout(500)) loop->next();\r\n\t\tbreak:\r\n\t\t\tactor->send(Actor::SOME_COMMAND); loop->next();\r\n\t\tbreak:\r\n\t\t\tif (loop->timeout(500)) loop->exit(1);\r\n\t\t\tif (actor->recv()) loop->next();\r\n\t\tbreak:\r\n\t\t\tif (actor->received==Actor::ACK) loop->next();\r\n\t\t\telse if (actor->received==Actor::NACK) loop->exit(2);\r\n\t\t\telse loop->exit(3);\r\n\t\tbreak:\r\n\t\t\tif (loop->timeout(500)) loop->next();\r\n\t\t}\r\n\t}\r\n#endif\r\n};\r\n\r\nint main(int argc, char const *argv[]) {\r\n\tActor actor[1];\r\n\tWalker walker[1];\r\n\tLoop *loop=walker->setup(actor);\r\n\tfor(int i=0;i<20;i++) {\r\n\t\tprintf(\"i=%2d t=%3d state=%d\",i,loop->timer,loop->state);\r\n\t\tloop->timer+=100;\r\n\t\twalker->step();\r\n\t\tprintf(\"\\n\");\r\n\t\tif (loop->exit_code>=0) break;\r\n\t}\r\n\tprintf(\"exit_code=%d\\n\",loop->exit_code);\r\n\treturn 0;\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212488487/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212754000", + "html_url": "https://github.com/cpp-ru/ideas/issues/281#issuecomment-1212754000", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/281", + "id": 1212754000, + "node_id": "IC_kwDOFK7cns5ISShQ", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-12T05:54:37Z", + "updated_at": "2022-08-12T05:54:37Z", + "author_association": "MEMBER", + "body": "Идея не пользуется популярностью, полозреваю что и международный комитет воспримет её холодно.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212754000/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212758159", + "html_url": "https://github.com/cpp-ru/ideas/issues/279#issuecomment-1212758159", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/279", + "id": 1212758159, + "node_id": "IC_kwDOFK7cns5ISTiP", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-12T06:03:11Z", + "updated_at": "2022-08-12T06:03:11Z", + "author_association": "MEMBER", + "body": "Рекурсивный вызов лямбд теперь возможен через deducing this https://wg21.link/p0847\r\n\r\nСинтаксис следующий:\r\n```cpp\r\nauto fib = [](this auto self, int n) {\r\n if (n < 2) return n;\r\n return self(n-1) + self(n-2);\r\n};\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212758159/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212763714", + "html_url": "https://github.com/cpp-ru/ideas/issues/157#issuecomment-1212763714", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/157", + "id": 1212763714, + "node_id": "IC_kwDOFK7cns5ISU5C", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-12T06:12:26Z", + "updated_at": "2022-08-12T06:12:26Z", + "author_association": "MEMBER", + "body": "Международный комитет рассмотрел идею, идея не понравилась", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1212763714/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1227662323", + "html_url": "https://github.com/cpp-ru/ideas/issues/532#issuecomment-1227662323", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/532", + "id": 1227662323, + "node_id": "IC_kwDOFK7cns5JLKPz", + "user": { + "login": "eoan-ermine", + "id": 47888628, + "node_id": "MDQ6VXNlcjQ3ODg4NjI4", + "avatar_url": "https://avatars.githubusercontent.com/u/47888628?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/eoan-ermine", + "html_url": "https://github.com/eoan-ermine", + "followers_url": "https://api.github.com/users/eoan-ermine/followers", + "following_url": "https://api.github.com/users/eoan-ermine/following{/other_user}", + "gists_url": "https://api.github.com/users/eoan-ermine/gists{/gist_id}", + "starred_url": "https://api.github.com/users/eoan-ermine/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/eoan-ermine/subscriptions", + "organizations_url": "https://api.github.com/users/eoan-ermine/orgs", + "repos_url": "https://api.github.com/users/eoan-ermine/repos", + "events_url": "https://api.github.com/users/eoan-ermine/events{/privacy}", + "received_events_url": "https://api.github.com/users/eoan-ermine/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-25T19:16:25Z", + "updated_at": "2022-08-25T19:16:25Z", + "author_association": "NONE", + "body": "Если неявное приведение `std::pair` — то и `std::tuple` тоже? К чему ограничение на два элемента?\r\n\r\nПредполагается, что `GPS_Data gps = *all_data.begin()` семантически эквивалентно `GPS_Data gps = {std::get<0>(begin_element), std::get<1>(begin_element})`, а `GPS_Data gps = std::move(*all_data.begin()}` таким образом должно быть семантически эквивалентно `GPS_Data gps = {std::get<0>(std::move(begin_element)), std::get<1>(std::move(begin_element}))`?\r\n\r\nКак предлагается обрабатывать случаи, когда существует конструктор копирования/перемещения для кортежа? ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1227662323/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1228622885", + "html_url": "https://github.com/cpp-ru/ideas/issues/532#issuecomment-1228622885", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/532", + "id": 1228622885, + "node_id": "IC_kwDOFK7cns5JO0wl", + "user": { + "login": "IvanOrfanidi", + "id": 10355755, + "node_id": "MDQ6VXNlcjEwMzU1NzU1", + "avatar_url": "https://avatars.githubusercontent.com/u/10355755?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/IvanOrfanidi", + "html_url": "https://github.com/IvanOrfanidi", + "followers_url": "https://api.github.com/users/IvanOrfanidi/followers", + "following_url": "https://api.github.com/users/IvanOrfanidi/following{/other_user}", + "gists_url": "https://api.github.com/users/IvanOrfanidi/gists{/gist_id}", + "starred_url": "https://api.github.com/users/IvanOrfanidi/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/IvanOrfanidi/subscriptions", + "organizations_url": "https://api.github.com/users/IvanOrfanidi/orgs", + "repos_url": "https://api.github.com/users/IvanOrfanidi/repos", + "events_url": "https://api.github.com/users/IvanOrfanidi/events{/privacy}", + "received_events_url": "https://api.github.com/users/IvanOrfanidi/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-26T15:15:49Z", + "updated_at": "2022-08-26T15:15:49Z", + "author_association": "NONE", + "body": "По поводу приведения ```std::tuple``` хорошая идея. Если честно не знаю можно ли на этапе компиляции выяснить кол-во и тип ```std::tuple``` не будет ли в этом скрытых проблем.\r\n\r\nПо поводу конструктор копирования/перемещения, можно сделать как это сделано в structured binding.\r\nпо ссылке\r\n```const auto& [service, num_of_sat] = *all_data.begin();```\r\nили по значению\r\n``` auto [service, num_of_sat] = *all_data.begin(); ```\r\nТам же нет проблем с конструктором копирования/перемещения для std::pair.\r\n\r\nРечь идет просто о \"синтаксическом сахаре\", чтобы не писать отдельный конструктор копирования/перемещения для структуры. Или не пользоваться дополнительными объявлениями переменных как ниже:\r\n```\r\nconst auto& [service, num_of_sat] = *all_data.begin();\r\nGPS_Data gps = {service, num_of_sat};\r\n```\r\nили так\r\n```\r\nGPS_Data gps = {all_data.begin()->first, all_data.begin()->second};\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1228622885/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229148508", + "html_url": "https://github.com/cpp-ru/ideas/issues/533#issuecomment-1229148508", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/533", + "id": 1229148508, + "node_id": "IC_kwDOFK7cns5JQ1Fc", + "user": { + "login": "eoan-ermine", + "id": 47888628, + "node_id": "MDQ6VXNlcjQ3ODg4NjI4", + "avatar_url": "https://avatars.githubusercontent.com/u/47888628?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/eoan-ermine", + "html_url": "https://github.com/eoan-ermine", + "followers_url": "https://api.github.com/users/eoan-ermine/followers", + "following_url": "https://api.github.com/users/eoan-ermine/following{/other_user}", + "gists_url": "https://api.github.com/users/eoan-ermine/gists{/gist_id}", + "starred_url": "https://api.github.com/users/eoan-ermine/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/eoan-ermine/subscriptions", + "organizations_url": "https://api.github.com/users/eoan-ermine/orgs", + "repos_url": "https://api.github.com/users/eoan-ermine/repos", + "events_url": "https://api.github.com/users/eoan-ermine/events{/privacy}", + "received_events_url": "https://api.github.com/users/eoan-ermine/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-27T08:14:37Z", + "updated_at": "2022-08-27T08:19:25Z", + "author_association": "NONE", + "body": "1. Употребления вординга `has the same value of corresponding bits in its value representation` (или аналогичного) для обозначения сравнения на равенство битов, составляющих `value representation`: [basic.fundmanetal#3](https://eel.is/c++draft/basic.fundamental#3), [bit.cast#2](https://eel.is/c++draft/bit.cast#2)\r\n\r\n2. Употребления вординга `compares its value representation for equality` (или аналогичного) для обозначения сравнения на равенство количества битов, участвующих в value representation: [basic.fundmanetal#3](https://eel.is/c++draft/basic.fundamental#3), [basic.fundmanetal#6](https://eel.is/c++draft/basic.fundamental#6), [basic.fundmanetal#10](https://eel.is/c++draft/basic.fundamental#10), [basic.fundamental#note-11](https://eel.is/c++draft/basic.fundamental#note-11)\r\n\r\n3. Употребления вординга `compares its value representation for equality` (или аналогичного) для обозначения сравнения на равенство битов, составляющих `value representation`: [atomics.ref.ops#19](https://eel.is/c++draft/atomics.ref.ops#19), [atomics.ref.ops#23.1](https://eel.is/c++draft/atomics.ref.ops#23.1), [atomics.types.operations#23](https://eel.is/c++draft/atomics.ref.ops#23), [atomics.types.operations#30.1](https://eel.is/c++draft/atomics.ref.ops#30.1)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229148508/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229149098", + "html_url": "https://github.com/cpp-ru/ideas/issues/533#issuecomment-1229149098", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/533", + "id": 1229149098, + "node_id": "IC_kwDOFK7cns5JQ1Oq", + "user": { + "login": "eoan-ermine", + "id": 47888628, + "node_id": "MDQ6VXNlcjQ3ODg4NjI4", + "avatar_url": "https://avatars.githubusercontent.com/u/47888628?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/eoan-ermine", + "html_url": "https://github.com/eoan-ermine", + "followers_url": "https://api.github.com/users/eoan-ermine/followers", + "following_url": "https://api.github.com/users/eoan-ermine/following{/other_user}", + "gists_url": "https://api.github.com/users/eoan-ermine/gists{/gist_id}", + "starred_url": "https://api.github.com/users/eoan-ermine/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/eoan-ermine/subscriptions", + "organizations_url": "https://api.github.com/users/eoan-ermine/orgs", + "repos_url": "https://api.github.com/users/eoan-ermine/repos", + "events_url": "https://api.github.com/users/eoan-ermine/events{/privacy}", + "received_events_url": "https://api.github.com/users/eoan-ermine/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-27T08:18:48Z", + "updated_at": "2022-08-27T08:18:48Z", + "author_association": "NONE", + "body": "> Употребления вординга `has the same value of corresponding bits in its value representation` (или аналогичного) для обозначения сравнения на равенство битов, составляющих `value representation`: [basic.fundmanetal#3](https://eel.is/c++draft/basic.fundamental#3), [bit.cast#2](https://eel.is/c++draft/bit.cast#2)\r\n> \r\n> Употребления вординга `compares its value representation for equality` (или аналогичного) для обозначения сравнения на равенство количества битов, участвующих в value representation: [basic.fundmanetal#3](https://eel.is/c++draft/basic.fundamental#3), [basic.fundmanetal#6](https://eel.is/c++draft/basic.fundamental#6), [basic.fundmanetal#10](https://eel.is/c++draft/basic.fundamental#10), [basic.fundamental#note-11](https://eel.is/c++draft/basic.fundamental#note-11)\r\n> \r\n> Употребления вординга `compares its value representation for equality` (или аналогичного) для обозначения сравнения на равенство битов, составляющих `value representation`: [atomics.ref.ops#19](https://eel.is/c++draft/atomics.ref.ops#19), [atomics.ref.ops#23.1](https://eel.is/c++draft/atomics.ref.ops#23.1), [atomics.types.operations#23](https://eel.is/c++draft/atomics.ref.ops#23), [atomics.types.operations#30.1](https://eel.is/c++draft/atomics.ref.ops#30.1)\r\n\r\nЭто вносит путаницу, так как в одних случаях под `equality of value representation` понимается равенство количества бит, участвующих в нем, а в другом равенство значений бит, участвующих в нем.\r\n\r\nПричем это еще более запутывает, ибо даже в [atomics](https://eel.is/c++draft/atomics.ref.ops), где только и встречается такой вординг, используется и следующий:\r\n\r\n> For a union with bits that participate in the value representation of some members but not others, compare-and-exchange might always fail [atomics.types.operations#note-8](https://eel.is/c++draft/atomics.types.operations#note-8)\r\n\r\nТо есть, даже в [atomics] о битах то говорится, будто они лишь **participate** в value representation, то будто их значения **и есть само** value representation", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229149098/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229149309", + "html_url": "https://github.com/cpp-ru/ideas/issues/533#issuecomment-1229149309", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/533", + "id": 1229149309, + "node_id": "IC_kwDOFK7cns5JQ1R9", + "user": { + "login": "eoan-ermine", + "id": 47888628, + "node_id": "MDQ6VXNlcjQ3ODg4NjI4", + "avatar_url": "https://avatars.githubusercontent.com/u/47888628?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/eoan-ermine", + "html_url": "https://github.com/eoan-ermine", + "followers_url": "https://api.github.com/users/eoan-ermine/followers", + "following_url": "https://api.github.com/users/eoan-ermine/following{/other_user}", + "gists_url": "https://api.github.com/users/eoan-ermine/gists{/gist_id}", + "starred_url": "https://api.github.com/users/eoan-ermine/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/eoan-ermine/subscriptions", + "organizations_url": "https://api.github.com/users/eoan-ermine/orgs", + "repos_url": "https://api.github.com/users/eoan-ermine/repos", + "events_url": "https://api.github.com/users/eoan-ermine/events{/privacy}", + "received_events_url": "https://api.github.com/users/eoan-ermine/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-27T08:20:37Z", + "updated_at": "2022-08-27T08:20:37Z", + "author_association": "NONE", + "body": "> 1. Употребления вординга `has the same value of corresponding bits in its value representation` (или аналогичного) для обозначения сравнения на равенство битов, составляющих `value representation`: [basic.fundmanetal#3](https://eel.is/c++draft/basic.fundamental#3), [bit.cast#2](https://eel.is/c++draft/bit.cast#2)\r\n> 2. Употребления вординга `compares its value representation for equality` (или аналогичного) для обозначения сравнения на равенство количества битов, участвующих в value representation: [basic.fundmanetal#3](https://eel.is/c++draft/basic.fundamental#3), [basic.fundmanetal#6](https://eel.is/c++draft/basic.fundamental#6), [basic.fundmanetal#10](https://eel.is/c++draft/basic.fundamental#10), [basic.fundamental#note-11](https://eel.is/c++draft/basic.fundamental#note-11)\r\n> 3. Употребления вординга `compares its value representation for equality` (или аналогичного) для обозначения сравнения на равенство битов, составляющих `value representation`: [atomics.ref.ops#19](https://eel.is/c++draft/atomics.ref.ops#19), [atomics.ref.ops#23.1](https://eel.is/c++draft/atomics.ref.ops#23.1), [atomics.types.operations#23](https://eel.is/c++draft/atomics.ref.ops#23), [atomics.types.operations#30.1](https://eel.is/c++draft/atomics.ref.ops#30.1)\r\n\r\nПо-моему, правильно будет переписать все случаи, попадающие в пункт 3, по подобию пункта 1. Это устранит всякую неконсистентность вординга по этому поводу.\r\n\r\nНо прошу экспертного мнения, прав ли я.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229149309/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229160311", + "html_url": "https://github.com/cpp-ru/ideas/issues/532#issuecomment-1229160311", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/532", + "id": 1229160311, + "node_id": "IC_kwDOFK7cns5JQ393", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-27T09:42:38Z", + "updated_at": "2022-08-27T11:57:43Z", + "author_association": "NONE", + "body": "Можно определить небольшой конвертер:\r\n\r\n```c++\r\ntemplate\r\nT tuple_cast_impl(std::index_sequence, const std::tuple& t)\r\n{\r\n return T{std::get(t)...};\r\n}\r\n\r\ntemplate\r\nT tuple_cast_impl(std::index_sequence, const std::pair& t)\r\n{\r\n return T{std::get(t)...};\r\n}\r\n\r\ntemplate\r\nT tuple_cast(const std::tuple& t)\r\n{\r\n return tuple_cast_impl(std::make_index_sequence{}, t);\r\n}\r\n\r\ntemplate\r\nT tuple_cast(const std::pair& t)\r\n{\r\n return tuple_cast_impl(std::make_index_sequence{}, t);\r\n}\r\n```\r\n\r\nи тогда с ним будет работать, при необходимости можно перенести в конструктор.\r\n\r\n```c++\r\n auto gps = tuple_cast(*all_data.begin());\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229160311/reactions", + "total_count": 4, + "+1": 4, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229371638", + "html_url": "https://github.com/cpp-ru/ideas/issues/485#issuecomment-1229371638", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/485", + "id": 1229371638, + "node_id": "IC_kwDOFK7cns5JRrj2", + "user": { + "login": "NN---", + "id": 580536, + "node_id": "MDQ6VXNlcjU4MDUzNg==", + "avatar_url": "https://avatars.githubusercontent.com/u/580536?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/NN---", + "html_url": "https://github.com/NN---", + "followers_url": "https://api.github.com/users/NN---/followers", + "following_url": "https://api.github.com/users/NN---/following{/other_user}", + "gists_url": "https://api.github.com/users/NN---/gists{/gist_id}", + "starred_url": "https://api.github.com/users/NN---/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/NN---/subscriptions", + "organizations_url": "https://api.github.com/users/NN---/orgs", + "repos_url": "https://api.github.com/users/NN---/repos", + "events_url": "https://api.github.com/users/NN---/events{/privacy}", + "received_events_url": "https://api.github.com/users/NN---/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-28T04:12:53Z", + "updated_at": "2022-08-28T04:12:53Z", + "author_association": "NONE", + "body": "Если структуры стандартно расположены то стандарт позволяет.\r\nЕщё можно посмотреть std::is_corresponding_member\r\n\r\nhttps://www.reddit.com/r/cpp/comments/qs8ecs/is_there_a_way_to_reinterpret_cast_same_struct/", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229371638/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229563697", + "html_url": "https://github.com/cpp-ru/ideas/issues/532#issuecomment-1229563697", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/532", + "id": 1229563697, + "node_id": "IC_kwDOFK7cns5JSacx", + "user": { + "login": "XRay3D", + "id": 10693876, + "node_id": "MDQ6VXNlcjEwNjkzODc2", + "avatar_url": "https://avatars.githubusercontent.com/u/10693876?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/XRay3D", + "html_url": "https://github.com/XRay3D", + "followers_url": "https://api.github.com/users/XRay3D/followers", + "following_url": "https://api.github.com/users/XRay3D/following{/other_user}", + "gists_url": "https://api.github.com/users/XRay3D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/XRay3D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/XRay3D/subscriptions", + "organizations_url": "https://api.github.com/users/XRay3D/orgs", + "repos_url": "https://api.github.com/users/XRay3D/repos", + "events_url": "https://api.github.com/users/XRay3D/events{/privacy}", + "received_events_url": "https://api.github.com/users/XRay3D/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-28T22:06:54Z", + "updated_at": "2022-08-28T22:09:58Z", + "author_association": "NONE", + "body": "есть такой вариант. Я нечто похожее у себя писал.\r\n```cpp\r\n\r\ntemplate \r\nstruct cast {\r\n cast(const S& s)\r\n : s {s} { }\r\n template \r\n operator T() const { return impl(std::make_index_sequence> {}); }\r\n template \r\n T to() const { return impl(std::make_index_sequence> {}); }\r\n\r\nprivate:\r\n const S& s;\r\n template \r\n T impl(std::index_sequence) const { return {std::get(s)...}; }\r\n};\r\n\r\nGPS_Data gps; \r\n\r\ngps = cast(variable);\r\nauto gps2 = cast(variable).to();\r\n\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229563697/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229901212", + "html_url": "https://github.com/cpp-ru/ideas/issues/532#issuecomment-1229901212", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/532", + "id": 1229901212, + "node_id": "IC_kwDOFK7cns5JTs2c", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-29T07:41:49Z", + "updated_at": "2022-08-29T07:41:49Z", + "author_association": "NONE", + "body": "Возможно, стоит обьединить с #485, где более жёсткие требования: делать неявное приведение и для массивов, передвигаемых `std::memcpy`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1229901212/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1230569334", + "html_url": "https://github.com/cpp-ru/ideas/issues/535#issuecomment-1230569334", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/535", + "id": 1230569334, + "node_id": "IC_kwDOFK7cns5JWP92", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-29T16:49:15Z", + "updated_at": "2022-08-29T16:49:15Z", + "author_association": "NONE", + "body": "В `static_assert` имя типа ничем не поможет, ибо он принимает вторым аргументом строго литерал.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1230569334/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1230579048", + "html_url": "https://github.com/cpp-ru/ideas/issues/535#issuecomment-1230579048", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/535", + "id": 1230579048, + "node_id": "IC_kwDOFK7cns5JWSVo", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-29T16:58:29Z", + "updated_at": "2022-08-29T16:58:29Z", + "author_association": "NONE", + "body": "> В `static_assert` имя типа ничем не поможет, ибо он принимает вторым аргументом строго литерал.\r\n\r\nХорошее замечание, тогда если nameof будет возвращать строковой литерал, то компилятор сумеет склеить их.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1230579048/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1233375756", + "html_url": "https://github.com/cpp-ru/ideas/issues/535#issuecomment-1233375756", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/535", + "id": 1233375756, + "node_id": "IC_kwDOFK7cns5Jg9IM", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-31T20:13:37Z", + "updated_at": "2022-08-31T20:13:37Z", + "author_association": "NONE", + "body": "Для типов стандартной библиотеки вывод, увы, не всегда выводится в формате (а) полезном и (б) консистентном. Пункт (б) весьма нехорош для стандартизации.\r\n\r\n```c++\r\n#include \r\n#include \r\n\r\nint main()\r\n{\r\n std::cout << NAMEOF_TYPE_EXPR(std::string());\r\n return 0;\r\n}\r\n```\r\n\r\nвывод с Godbolt:\r\n```c++\r\nstd::__cxx11::basic_string, std::allocator > // GCC\r\nclass std::basic_string,class std::allocator > // MSVC\r\nstd::basic_string // LLVM, libstdc++\r\nstd::string // LLVM, libc++\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1233375756/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1235585870", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1235585870", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1235585870, + "node_id": "IC_kwDOFK7cns5JpYtO", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-02T14:40:43Z", + "updated_at": "2022-09-02T14:40:43Z", + "author_association": "NONE", + "body": "чем плохи std::string_view и std::span ?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1235585870/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1235589581", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1235589581", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1235589581, + "node_id": "IC_kwDOFK7cns5JpZnN", + "user": { + "login": "sigasigasiga", + "id": 48245894, + "node_id": "MDQ6VXNlcjQ4MjQ1ODk0", + "avatar_url": "https://avatars.githubusercontent.com/u/48245894?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sigasigasiga", + "html_url": "https://github.com/sigasigasiga", + "followers_url": "https://api.github.com/users/sigasigasiga/followers", + "following_url": "https://api.github.com/users/sigasigasiga/following{/other_user}", + "gists_url": "https://api.github.com/users/sigasigasiga/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sigasigasiga/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sigasigasiga/subscriptions", + "organizations_url": "https://api.github.com/users/sigasigasiga/orgs", + "repos_url": "https://api.github.com/users/sigasigasiga/repos", + "events_url": "https://api.github.com/users/sigasigasiga/events{/privacy}", + "received_events_url": "https://api.github.com/users/sigasigasiga/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-02T14:44:16Z", + "updated_at": "2022-09-02T14:44:16Z", + "author_association": "NONE", + "body": "@sergii-rybin-tfs они не освободят ресурс при вызове деструктора", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1235589581/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1235642493", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1235642493", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1235642493, + "node_id": "IC_kwDOFK7cns5Jpmh9", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-02T15:35:42Z", + "updated_at": "2022-09-02T15:35:42Z", + "author_association": "NONE", + "body": "ясно, я бы завернул пару string_view+unique_ptr например в tuple.\r\n\r\nМожно добавить читабельный алиас и оператор неявного преобразования типа и deduction guide. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1235642493/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236061829", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1236061829", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1236061829, + "node_id": "IC_kwDOFK7cns5JrM6F", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-03T06:47:34Z", + "updated_at": "2022-09-03T07:47:05Z", + "author_association": "NONE", + "body": "> в плюсовую библиотеку, которая принимает какой-то contiguous контейнер (например, std::vector или std::string)\r\n\r\n> ещё один вариант аллокатора, который использует malloc и free\r\n\r\nно контейнер с другим аллокатором – это другой контейнер, который нельзя будет передать в плюсовую библиотеку, если она принимает обычные `std::string` или `std::vector`.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236061829/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236111328", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1236111328", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1236111328, + "node_id": "IC_kwDOFK7cns5JrY_g", + "user": { + "login": "sigasigasiga", + "id": 48245894, + "node_id": "MDQ6VXNlcjQ4MjQ1ODk0", + "avatar_url": "https://avatars.githubusercontent.com/u/48245894?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sigasigasiga", + "html_url": "https://github.com/sigasigasiga", + "followers_url": "https://api.github.com/users/sigasigasiga/followers", + "following_url": "https://api.github.com/users/sigasigasiga/following{/other_user}", + "gists_url": "https://api.github.com/users/sigasigasiga/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sigasigasiga/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sigasigasiga/subscriptions", + "organizations_url": "https://api.github.com/users/sigasigasiga/orgs", + "repos_url": "https://api.github.com/users/sigasigasiga/repos", + "events_url": "https://api.github.com/users/sigasigasiga/events{/privacy}", + "received_events_url": "https://api.github.com/users/sigasigasiga/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-03T12:37:39Z", + "updated_at": "2022-09-03T12:37:39Z", + "author_association": "NONE", + "body": "@pavelkryukov возможно, тут моя аргументация даёт течь. попробую привести другой пример, который нередко встречается в жизни: мы пишем плюсовую обёртку вокруг C'шной бибилотеки.\r\n\r\nпочти в каждой C'шной либе есть свои велосипеды с реализацией динамического массива. чтобы сделать из этого что-то более или менее приемлемое для использования в плюсовом мире, нужно будет, по сути, написать кучу бойлерплейта.\r\n\r\nс предлагаемыми мною изменениями всё это оборачивается одним вызовом конструктора.\r\n\r\nко всему прочему, проблема необходимости привязки к конкретным аллокаторам в случаях, когда это совершенно не важно, была адресована появлением `std::pmr::vector`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236111328/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236113517", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1236113517", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1236113517, + "node_id": "IC_kwDOFK7cns5JrZht", + "user": { + "login": "sigasigasiga", + "id": 48245894, + "node_id": "MDQ6VXNlcjQ4MjQ1ODk0", + "avatar_url": "https://avatars.githubusercontent.com/u/48245894?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sigasigasiga", + "html_url": "https://github.com/sigasigasiga", + "followers_url": "https://api.github.com/users/sigasigasiga/followers", + "following_url": "https://api.github.com/users/sigasigasiga/following{/other_user}", + "gists_url": "https://api.github.com/users/sigasigasiga/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sigasigasiga/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sigasigasiga/subscriptions", + "organizations_url": "https://api.github.com/users/sigasigasiga/orgs", + "repos_url": "https://api.github.com/users/sigasigasiga/repos", + "events_url": "https://api.github.com/users/sigasigasiga/events{/privacy}", + "received_events_url": "https://api.github.com/users/sigasigasiga/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-03T12:48:40Z", + "updated_at": "2022-09-03T12:48:48Z", + "author_association": "NONE", + "body": "придумал ещё один вариант использования предлагаемой мною фичи:\r\nможно будет конвертировать `std::vector` в `std::string` совершенно бесплатно и без лишних мучений.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236113517/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236115527", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1236115527", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1236115527, + "node_id": "IC_kwDOFK7cns5JraBH", + "user": { + "login": "sigasigasiga", + "id": 48245894, + "node_id": "MDQ6VXNlcjQ4MjQ1ODk0", + "avatar_url": "https://avatars.githubusercontent.com/u/48245894?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sigasigasiga", + "html_url": "https://github.com/sigasigasiga", + "followers_url": "https://api.github.com/users/sigasigasiga/followers", + "following_url": "https://api.github.com/users/sigasigasiga/following{/other_user}", + "gists_url": "https://api.github.com/users/sigasigasiga/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sigasigasiga/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sigasigasiga/subscriptions", + "organizations_url": "https://api.github.com/users/sigasigasiga/orgs", + "repos_url": "https://api.github.com/users/sigasigasiga/repos", + "events_url": "https://api.github.com/users/sigasigasiga/events{/privacy}", + "received_events_url": "https://api.github.com/users/sigasigasiga/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-03T12:58:43Z", + "updated_at": "2022-09-03T12:58:43Z", + "author_association": "NONE", + "body": "ещё один пример, где это было бы очень полезно.\r\nпредставим, нам нужно передать владение указателем на массив в C'шную библиотеку, и перед вызовом нам надо этот массив как-то подготовить (т.е. заполнить какими-то данными).\r\nс предлагаемыми изменениями мы просто можем завести `std::vector`, заполнить его в привычной для C++ программиста манере, а затем `release`'нуть подготовленный массив, и передать его туда куда надо", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236115527/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236355084", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1236355084", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1236355084, + "node_id": "IC_kwDOFK7cns5JsUgM", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-04T14:35:09Z", + "updated_at": "2022-09-04T14:40:35Z", + "author_association": "NONE", + "body": "> нам нужно передать владение указателем на массив в C'шную библиотеку, и перед вызовом нам надо этот массив как-то подготовить (т.е. заполнить какими-то данными).\r\n\r\nЭто решается через `std::span`:\r\n\r\n```c++\r\nauto* ptr = (struct char*)malloc(sizeof(char) * size);\r\nstd::span span(ptr, size);\r\nfill_span(span.begin(), span.end()); // заполнение в привычной для C++ манере\r\npass_to_c_library(ptr);\r\n```\r\n\r\n> придумал ещё один вариант использования предлагаемой мною фичи:\r\nможно будет конвертировать std::vector в std::string совершенно бесплатно и без лишних мучений.\r\n\r\nВозможно, будут проблемы, если `std::string` имплементирован через SSO.\r\nПлюс, мне кажется, должно хватать конвертации владеющих типов в невладеющие: `std::string_view` или `std::span`.\r\nЕсли кто-то принимает объект владеющего класса, то без копии скорее всего не обойтись.\r\n\r\nP.S. что будет с нуль-терминированием строк, созданных из `std::vector`?\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236355084/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236360698", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1236360698", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1236360698, + "node_id": "IC_kwDOFK7cns5JsV36", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-04T15:06:12Z", + "updated_at": "2022-09-04T15:06:12Z", + "author_association": "NONE", + "body": "Ещё вариант — использовать `std::unique_ptr` или `std::shared_ptr` с кастомным deleter-ом", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1236360698/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1245670277", + "html_url": "https://github.com/cpp-ru/ideas/issues/538#issuecomment-1245670277", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/538", + "id": 1245670277, + "node_id": "IC_kwDOFK7cns5KP2uF", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-13T16:40:15Z", + "updated_at": "2022-09-13T16:40:15Z", + "author_association": "NONE", + "body": "Почему в определении бинарная операция а не логическая? Логическая - это `!=`.\r\nГде требуется метафункция? Кроме консистентности есть какие-то другие причины, почему бы это нужно добавить в стандарт?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1245670277/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1250124046", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1250124046", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1250124046, + "node_id": "IC_kwDOFK7cns5Kg2EO", + "user": { + "login": "sigasigasiga", + "id": 48245894, + "node_id": "MDQ6VXNlcjQ4MjQ1ODk0", + "avatar_url": "https://avatars.githubusercontent.com/u/48245894?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sigasigasiga", + "html_url": "https://github.com/sigasigasiga", + "followers_url": "https://api.github.com/users/sigasigasiga/followers", + "following_url": "https://api.github.com/users/sigasigasiga/following{/other_user}", + "gists_url": "https://api.github.com/users/sigasigasiga/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sigasigasiga/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sigasigasiga/subscriptions", + "organizations_url": "https://api.github.com/users/sigasigasiga/orgs", + "repos_url": "https://api.github.com/users/sigasigasiga/repos", + "events_url": "https://api.github.com/users/sigasigasiga/events{/privacy}", + "received_events_url": "https://api.github.com/users/sigasigasiga/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-17T18:57:30Z", + "updated_at": "2022-09-17T19:06:48Z", + "author_association": "NONE", + "body": "> Это решается через `std::span`:\r\n\r\nне решается. у вектора есть возможность удобно расширять размер буфера, у спана такого нет\r\n\r\n> Возможно, будут проблемы, если `std::string` имплементирован через SSO.\r\n\r\nв таком случае можно выделять буфер в куче, всё туда копировать и возвращать указатель на него. таким образом мы, к сожалению, теряем `noexcept`, но это, наверное, не так страшно\r\n\r\n\r\n> P.S. что будет с нуль-терминированием строк, созданных из `std::vector`?\r\n\r\nв нашем любимом языке проблемы подобного толка решаются довольно просто. в строку должны будут передаваться нуль-терминированные строки, иначе ub :)\r\n\r\n> Ещё вариант — использовать `std::unique_ptr` или `std::shared_ptr` с кастомным deleter-ом\r\n\r\nтам тоже нет всей этой логики с увеличением размера буфера при необходимости. да и вообще там ничего нет, всё приходится делать руками. такое решение получается слишком низкоуровневым", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1250124046/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1257371826", + "html_url": "https://github.com/cpp-ru/ideas/issues/523#issuecomment-1257371826", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/523", + "id": 1257371826, + "node_id": "IC_kwDOFK7cns5K8fiy", + "user": { + "login": "NN---", + "id": 580536, + "node_id": "MDQ6VXNlcjU4MDUzNg==", + "avatar_url": "https://avatars.githubusercontent.com/u/580536?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/NN---", + "html_url": "https://github.com/NN---", + "followers_url": "https://api.github.com/users/NN---/followers", + "following_url": "https://api.github.com/users/NN---/following{/other_user}", + "gists_url": "https://api.github.com/users/NN---/gists{/gist_id}", + "starred_url": "https://api.github.com/users/NN---/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/NN---/subscriptions", + "organizations_url": "https://api.github.com/users/NN---/orgs", + "repos_url": "https://api.github.com/users/NN---/repos", + "events_url": "https://api.github.com/users/NN---/events{/privacy}", + "received_events_url": "https://api.github.com/users/NN---/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-09-26T01:53:15Z", + "updated_at": "2022-09-26T01:53:15Z", + "author_association": "NONE", + "body": "https://herbsutter.com/2022/09/25/something-i-implemented-today-is-void/", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1257371826/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1286690897", + "html_url": "https://github.com/cpp-ru/ideas/issues/539#issuecomment-1286690897", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/539", + "id": 1286690897, + "node_id": "IC_kwDOFK7cns5MsVhR", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-10-21T09:19:17Z", + "updated_at": "2022-10-21T09:19:54Z", + "author_association": "NONE", + "body": "нуууу... Вообще-то мешает. Это не для всех шаблонов работает, а только для тех где типы. И зачем rebind exptected??\r\nP.S. аллокатор просто должен зависеть не от типа, а от размера и алигмента\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1286690897/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1291752816", + "html_url": "https://github.com/cpp-ru/ideas/issues/294#issuecomment-1291752816", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/294", + "id": 1291752816, + "node_id": "IC_kwDOFK7cns5M_pVw", + "user": { + "login": "Lishen1", + "id": 6782809, + "node_id": "MDQ6VXNlcjY3ODI4MDk=", + "avatar_url": "https://avatars.githubusercontent.com/u/6782809?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Lishen1", + "html_url": "https://github.com/Lishen1", + "followers_url": "https://api.github.com/users/Lishen1/followers", + "following_url": "https://api.github.com/users/Lishen1/following{/other_user}", + "gists_url": "https://api.github.com/users/Lishen1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Lishen1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Lishen1/subscriptions", + "organizations_url": "https://api.github.com/users/Lishen1/orgs", + "repos_url": "https://api.github.com/users/Lishen1/repos", + "events_url": "https://api.github.com/users/Lishen1/events{/privacy}", + "received_events_url": "https://api.github.com/users/Lishen1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-10-26T09:24:15Z", + "updated_at": "2022-10-26T09:24:15Z", + "author_association": "NONE", + "body": "реализация https://www.boost.org/doc/libs/1_79_0/libs/smart_ptr/doc/html/smart_ptr.html#allocate_unique рассматривается?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1291752816/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1302632300", + "html_url": "https://github.com/cpp-ru/ideas/issues/26#issuecomment-1302632300", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/26", + "id": 1302632300, + "node_id": "IC_kwDOFK7cns5NpJds", + "user": { + "login": "SashaBorisov", + "id": 44922026, + "node_id": "MDQ6VXNlcjQ0OTIyMDI2", + "avatar_url": "https://avatars.githubusercontent.com/u/44922026?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SashaBorisov", + "html_url": "https://github.com/SashaBorisov", + "followers_url": "https://api.github.com/users/SashaBorisov/followers", + "following_url": "https://api.github.com/users/SashaBorisov/following{/other_user}", + "gists_url": "https://api.github.com/users/SashaBorisov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SashaBorisov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SashaBorisov/subscriptions", + "organizations_url": "https://api.github.com/users/SashaBorisov/orgs", + "repos_url": "https://api.github.com/users/SashaBorisov/repos", + "events_url": "https://api.github.com/users/SashaBorisov/events{/privacy}", + "received_events_url": "https://api.github.com/users/SashaBorisov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-11-03T20:32:37Z", + "updated_at": "2022-11-03T20:32:37Z", + "author_association": "NONE", + "body": "Так а что это за возможности? Вспоминаю только доступ по индексу и всю обвязку для этого.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1302632300/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1302657471", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1302657471", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1302657471, + "node_id": "IC_kwDOFK7cns5NpPm_", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-11-03T21:00:40Z", + "updated_at": "2022-11-03T21:02:15Z", + "author_association": "NONE", + "body": "Еще пример. С функция возможностью возобновления исполнения. Т.е. возможна сереализацией состояния и продолжением исполения после десереализации. Коротинах есть всё кроме простоты и возможности возобновить исполение с сохраненной точки.\r\nВ случае последовтельных case-ов можно было бы обойтись без явных номеров точек. А так, в случае изменений, их придётся постоянно перенумеровывать.\r\n\r\n```cpp\r\n#include \r\n\r\n#define CHECK_POINTS_BEGIN() switch(check_point) { default:\r\n#define CHECK_POINT(n) case n: check_point=n;\r\n#define CHECK_POINTS_END() check_point=-1; }\r\n\r\nstruct Example {\r\n\tint check_point,i;\r\n\tExample() { check_point=0; }\r\n\tvoid loop(int it=-1) {\r\n\t\tCHECK_POINTS_BEGIN()\r\n\t\tCHECK_POINT(0) if (!it--) return;\r\n\t\tprintf(\"p1\\n\");\r\n\t\tCHECK_POINT(1) if (!it--) return;\r\n\t\tprintf(\"p2\\n\");\r\n\t\tfor(i=1;i<=4;i++) {\r\n\t\t\tCHECK_POINT(2) if (!it--) return;\r\n\t\t\tprintf(\"p3.%d\\n\",i); \r\n\t\t}\r\n\t\tCHECK_POINT(3) if (!it--) return;\r\n\t\tprintf(\"p4\\n\"); \r\n\t\tCHECK_POINT(4) if (!it--) return;\r\n\t\tprintf(\"p5\\n\"); \r\n\t\tCHECK_POINTS_END()\r\n\t}\r\n};\r\n\r\nint main(int argc, char const *argv[]) {\r\n\tExample e;\r\n\te.loop(3);\r\n\tprintf(\"--\\n\");\r\n\te.loop(2);\r\n\tprintf(\"--\\n\");\r\n\te.loop();\r\n\treturn 0;\r\n}\r\n```\r\n```\r\np1\r\np2\r\np3.1\r\n--\r\np3.2\r\np3.3\r\n--\r\np3.4\r\np4\r\np5\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1302657471/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1303186452", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1303186452", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1303186452, + "node_id": "IC_kwDOFK7cns5NrQwU", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-11-04T09:47:25Z", + "updated_at": "2022-11-04T09:47:25Z", + "author_association": "NONE", + "body": "Всё. Нафиг этот ваш С++ и попытки его улучшить. Всё решается в рамках обычного C.\r\n```cpp\r\n// track-function.c\r\n\r\n#define TRACK_START switch(st->line) { default: TRACK_POINT\r\n#define TRACK_POINT case __LINE__: st->line=__LINE__; if (!st->it--) { st->it=1; return 1; }\r\n#define TRACK_END st->line=-1; return 0; } st->it=1; return 1;\r\n\r\ntypedef struct fn_state_s {\r\n\tint line, it, i;\r\n} fn_state;\r\n\r\nvoid fn_reset(fn_state *st) {\r\n\tst->line=-1; st->it=1;\r\n}\r\nint fn(fn_state *st) {\r\n\tTRACK_START\r\n\t\tprintf(\"p1\\n\");\r\n\t\tTRACK_POINT\r\n\t\tprintf(\"p2\\n\");\r\n\t\tTRACK_POINT\r\n\t\tprintf(\"p3\\n\");\r\n\t\tfor(st->i=0;st->i<4;st->i++) {\r\n\t\t\tTRACK_POINT\r\n\t\t\tprintf(\"p4.%d\\n\",st->i);\r\n\t\t}\r\n\t\tTRACK_POINT\r\n\t\tprintf(\"p5\\n\");\r\n\t\tTRACK_POINT\r\n\t\tprintf(\"p6\\n\");\r\n\tTRACK_END\r\n}\r\n\r\nint main(int argc, char const *argv[]) {\r\n\tfn_state s[1];\r\n\tfn_reset(s);\r\n\t\r\n\ts->it=3; fn(s);\r\n\tprintf(\"--\\n\");\r\n\ts->it=2; fn(s);\r\n\tprintf(\"--\\n\");\r\n\tdo { printf(\"\\t\"); } while(fn(s));\r\n\treturn 0;\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1303186452/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1304756729", + "html_url": "https://github.com/cpp-ru/ideas/issues/26#issuecomment-1304756729", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/26", + "id": 1304756729, + "node_id": "IC_kwDOFK7cns5NxQH5", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-11-06T09:31:36Z", + "updated_at": "2022-11-06T09:34:15Z", + "author_association": "NONE", + "body": "Мне кажется многие проблемы бы решил некий оператор \"распаковки в список аргументов функции\".\r\n```\r\nstruct X { int a; double b; float c; };\r\nX x{1, 2.0, 3.0f};\r\nauto make_tuple = [](auto &&... v) {\r\n return std::make_tuple(std::forward(v)...);\r\n};\r\nauto tuple = make_tuple(@x); // @ - это предполагаемый оператор\r\nauto forward_as_tuple = [](auto &&... v) {\r\n return std::forward_as_tuple(std::forward(v)...);\r\n};\r\nauto refs = forward_as_tuple(@x);\r\nauto tie = [](auto &... v) {\r\n return std::tie(v...);\r\n};\r\nauto lrefs = tie(@x);\r\n```\r\nЕсли бы structured bindings завезли в таком виде в своё время, то было бы намного меньше вопросов, мне кажется.\r\n\r\nОператор я бы сделал постфиксным унарным `.*` или `.*...` (ну и `->*` или `->*...` для единообразия).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1304756729/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1321003762", + "html_url": "https://github.com/cpp-ru/ideas/issues/505#issuecomment-1321003762", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/505", + "id": 1321003762, + "node_id": "IC_kwDOFK7cns5OvOry", + "user": { + "login": "crackedmind", + "id": 1381503, + "node_id": "MDQ6VXNlcjEzODE1MDM=", + "avatar_url": "https://avatars.githubusercontent.com/u/1381503?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/crackedmind", + "html_url": "https://github.com/crackedmind", + "followers_url": "https://api.github.com/users/crackedmind/followers", + "following_url": "https://api.github.com/users/crackedmind/following{/other_user}", + "gists_url": "https://api.github.com/users/crackedmind/gists{/gist_id}", + "starred_url": "https://api.github.com/users/crackedmind/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/crackedmind/subscriptions", + "organizations_url": "https://api.github.com/users/crackedmind/orgs", + "repos_url": "https://api.github.com/users/crackedmind/repos", + "events_url": "https://api.github.com/users/crackedmind/events{/privacy}", + "received_events_url": "https://api.github.com/users/crackedmind/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-11-20T00:58:48Z", + "updated_at": "2022-11-20T00:58:48Z", + "author_association": "NONE", + "body": "https://isocpp.org/files/papers/P2693R0.pdf", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1321003762/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1322650798", + "html_url": "https://github.com/cpp-ru/ideas/issues/540#issuecomment-1322650798", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/540", + "id": 1322650798, + "node_id": "IC_kwDOFK7cns5O1gyu", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-11-21T21:14:04Z", + "updated_at": "2022-11-21T21:14:04Z", + "author_association": "NONE", + "body": "UPD: мне подсказали, что новый виртуальный метод сломает ABI, поэтому это не примут", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1322650798/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1339017537", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1339017537", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1339017537, + "node_id": "IC_kwDOFK7cns5Pz8lB", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-12-06T09:21:03Z", + "updated_at": "2022-12-06T09:21:03Z", + "author_association": "NONE", + "body": "Внутри std::stirng вообще может не быть указателя, изза short string optimization. https://stackoverflow.com/questions/21694302/what-are-the-mechanics-of-short-string-optimization-in-libc Поэтому хакнуть дизайн STL изначально разработанной под deep copy не выйдет. Если нужно copy on write - его надо делать самостоятельно. Для общего случая ввели универстальный класс std::string который скорее для имитации строк других языков, т..е. для функциональности на все случаи жизни.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1339017537/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1339021170", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1339021170", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1339021170, + "node_id": "IC_kwDOFK7cns5Pz9dy", + "user": { + "login": "sigasigasiga", + "id": 48245894, + "node_id": "MDQ6VXNlcjQ4MjQ1ODk0", + "avatar_url": "https://avatars.githubusercontent.com/u/48245894?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sigasigasiga", + "html_url": "https://github.com/sigasigasiga", + "followers_url": "https://api.github.com/users/sigasigasiga/followers", + "following_url": "https://api.github.com/users/sigasigasiga/following{/other_user}", + "gists_url": "https://api.github.com/users/sigasigasiga/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sigasigasiga/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sigasigasiga/subscriptions", + "organizations_url": "https://api.github.com/users/sigasigasiga/orgs", + "repos_url": "https://api.github.com/users/sigasigasiga/repos", + "events_url": "https://api.github.com/users/sigasigasiga/events{/privacy}", + "received_events_url": "https://api.github.com/users/sigasigasiga/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-12-06T09:24:01Z", + "updated_at": "2022-12-06T09:24:01Z", + "author_association": "NONE", + "body": "@incoder1 на аргумент про SSO я уже ответил [вот тут](https://github.com/cpp-ru/ideas/issues/537#issuecomment-1250124046). а при чём тут copy-on-write я, честно говоря, не понял", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1339021170/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1339062337", + "html_url": "https://github.com/cpp-ru/ideas/issues/522#issuecomment-1339062337", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/522", + "id": 1339062337, + "node_id": "IC_kwDOFK7cns5P0HhB", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-12-06T09:59:16Z", + "updated_at": "2022-12-06T10:20:38Z", + "author_association": "NONE", + "body": "Эта проблема на самом деле никак не решается таким методом. Потому что кроме доступа по null указателю, что в общем тиривиальная проблема и быстро находится, реальные неприятности как правило поджидают вот в таких случаях.\r\n\r\n```c++ \r\nint* p;\r\n...\r\n*p = 1;\r\n```\r\n\r\n```c++\r\nint *p = new int;\r\ndelete p;\r\n...\r\ndelete p;\r\n```\r\n\r\n```c++ \r\n#include \r\n\r\nint main(int argc, const char** argv) {\r\n int *p = new int;\r\n std::thread t0( [p] { *p = 1; } );\r\n std::thread t1( [p] { *p = 2; } );\r\n std::thread t2( [p] { *p = 3 ;} );\r\n delete p;\r\n}\r\n```\r\n```c++ \r\nvoid foo(int* p) \r\n{\r\n if(nullptr != p)\r\n delete p;\r\n}\r\n\r\nint main(int argc, const char** argv) \r\n{\r\n int i = 1;\r\n foo(&i);\r\n return 0;\r\n}\r\n```\r\nЭто все никак не решить без статического анализа и рантайм анализа либо дополнительной программми типа СppCheck, Valgrind и т.п. или внесением этих интсрументов в компилятор и среду, по типу Rust.\r\n\r\nУмные указатели и стратегия подсчета ссылок уже давно решает часть проблем, но далеко не все. Монады типа std::optional тоже не панация.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1339062337/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1342420711", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1342420711", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1342420711, + "node_id": "IC_kwDOFK7cns5QA7bn", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-12-08T10:05:02Z", + "updated_at": "2022-12-08T10:05:02Z", + "author_association": "NONE", + "body": "@sigasigasiga передача владения из контейнера это вариант copy-on-write с shallow copy вместо обычного deep copy. Изначальный дизайн STL - дополнить язык выско-уровневыми типами данных, аналогичными другим языкам с помощью шаблонов и ООП. В частности строками (в С и голом С++ есть только массивы символов), динамическими и ассоциативными массивами. То что вы предлагаете - это другой дизайн.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1342420711/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1342578492", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1342578492", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1342578492, + "node_id": "IC_kwDOFK7cns5QBh88", + "user": { + "login": "sigasigasiga", + "id": 48245894, + "node_id": "MDQ6VXNlcjQ4MjQ1ODk0", + "avatar_url": "https://avatars.githubusercontent.com/u/48245894?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sigasigasiga", + "html_url": "https://github.com/sigasigasiga", + "followers_url": "https://api.github.com/users/sigasigasiga/followers", + "following_url": "https://api.github.com/users/sigasigasiga/following{/other_user}", + "gists_url": "https://api.github.com/users/sigasigasiga/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sigasigasiga/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sigasigasiga/subscriptions", + "organizations_url": "https://api.github.com/users/sigasigasiga/orgs", + "repos_url": "https://api.github.com/users/sigasigasiga/repos", + "events_url": "https://api.github.com/users/sigasigasiga/events{/privacy}", + "received_events_url": "https://api.github.com/users/sigasigasiga/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-12-08T11:33:09Z", + "updated_at": "2022-12-08T11:35:17Z", + "author_association": "NONE", + "body": "@incoder1 \r\n\r\n> передача владения из контейнера это вариант copy-on-write с shallow copy вместо обычного deep copy.\r\n\r\nчестно говоря, я всё ещё не понимаю, при чём тут copy-on-write. ведь cow -- это, по своей сути, просто отложенное копирование объекта, позволяющее делать копию не сразу, а в момент, когда она действиельно потребуется. то, что предлагаю я, с копированием напрямую никак не связано.\r\n\r\n> То что вы предлагаете - это другой дизайн.\r\n\r\nтут, как мне кажется, можно удариться в жуткую и изматывающую демагогию.\r\nне сказал бы, что это другой дизайн. под другим дизайном я бы понимал глобальное переосмысление всего интерфейса векторов и строк, ровно как и переосмысление принципов их работы. я же никаких прям _глобальных_ изменений не предлагаю, лишь обобщение идеи владения ресурсами на те стандартные контейнеры, где это смотрелось бы уместно.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1342578492/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1344278804", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1344278804", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1344278804, + "node_id": "IC_kwDOFK7cns5QIBEU", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-12-09T12:57:45Z", + "updated_at": "2022-12-09T12:57:45Z", + "author_association": "NONE", + "body": "В целом про демагогию согласен. Договорится за дизайн очень сложно, противоборствующие лагеря с конфликтом интересов найдут миллион аргументов с каждой стороны не приходить к консенсусу. Примерно по этой причине 3 года не могут согласовать пулы потоков. Тут дело в следующем дизайну STL Cтепанова и Ли уже 29 лет, на нем завязано много существующего кода, трюков - гавный из который - взятие адреса нулевого элемента из контейнера для получения указателя, скажем классический трюк для преобразования в UTF-16LE \r\n```C++\r\n#include \r\n\r\n#include \r\n#include \r\n\r\nstd::wstring transcode(const char* src)\r\n{\r\n int len = ::MultiByteToWideChar(CP_UTF8, 0, src, -1, nullptr, 0);\r\n std::wstring ret(len, L'\\0');\r\n ::MultiByteToWideChar(CP_UTF8, 0, src, -1, &ret[0], len);\r\n return ret;\r\n}\r\n\r\nint main(int argc, const char** argv)\r\n{\r\n\tstd::wcout << ::transcode(\"Hello world!\") << std::endl;\r\n return 0;\r\n}\r\n``` \r\nПод эти трюки даже были дополнения в стандарт, например стандарт требует чтобы блок памяти под строку в векторе и строке был сплошным. Ваше предложение - хакнуть дизайн и возможно сломать все эти воркераунды миллионах строк кода тысячь проектов созданных за эти почти 30 лет. Что будет если мы изъяли владение указателем на блок памяти из контейнера, а потом кусок кода начинает обращаться к адресу по нулевого элемента этого контейнера ? ИМХО - проще создать вообще праралельную библиотеку контейнеров которая по другому обращается с памятью, в частности ведут себя как скажем строки Java и C# - множество интеллектуальных указателей на один массив, copy-on-write и т.д. а существующие контейнеры оставить в покое. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1344278804/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1351720991", + "html_url": "https://github.com/cpp-ru/ideas/issues/537#issuecomment-1351720991", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "id": 1351720991, + "node_id": "IC_kwDOFK7cns5QkaAf", + "user": { + "login": "sigasigasiga", + "id": 48245894, + "node_id": "MDQ6VXNlcjQ4MjQ1ODk0", + "avatar_url": "https://avatars.githubusercontent.com/u/48245894?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sigasigasiga", + "html_url": "https://github.com/sigasigasiga", + "followers_url": "https://api.github.com/users/sigasigasiga/followers", + "following_url": "https://api.github.com/users/sigasigasiga/following{/other_user}", + "gists_url": "https://api.github.com/users/sigasigasiga/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sigasigasiga/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sigasigasiga/subscriptions", + "organizations_url": "https://api.github.com/users/sigasigasiga/orgs", + "repos_url": "https://api.github.com/users/sigasigasiga/repos", + "events_url": "https://api.github.com/users/sigasigasiga/events{/privacy}", + "received_events_url": "https://api.github.com/users/sigasigasiga/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-12-14T16:21:50Z", + "updated_at": "2022-12-14T16:21:50Z", + "author_association": "NONE", + "body": "@incoder1 вы говорите чересчур абстрактно. можете, пожалуйста, привести какую-нибудь конкретную ситуацию, где предлагаемые мною изменения что-то сломают в существующем коде?\r\n\r\n> взятие адреса нулевого элемента из контейнера для получения указателя\r\n\r\nпредлагаемые мною изменения это поведение не меняют\r\n\r\n> Ваше предложение - хакнуть дизайн и возможно сломать все эти воркераунды миллионах строк кода тысячь проектов созданных за эти почти 30 лет\r\n\r\nпочему же? если в древний код не добавлять использование предлагаемого мною метода `release`, то он будет работать как прежде.\r\n\r\n> Что будет если мы изъяли владение указателем на блок памяти из контейнера, а потом кусок кода начинает обращаться к адресу по нулевого элемента этого контейнера ?\r\n\r\nUB, точно так же, как если мы будем разыменовывать `unique_ptr`, у которого забрали владение указателем.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1351720991/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1356403058", + "html_url": "https://github.com/cpp-ru/ideas/issues/541#issuecomment-1356403058", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/541", + "id": 1356403058, + "node_id": "IC_kwDOFK7cns5Q2RFy", + "user": { + "login": "vtopunov", + "id": 8456542, + "node_id": "MDQ6VXNlcjg0NTY1NDI=", + "avatar_url": "https://avatars.githubusercontent.com/u/8456542?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/vtopunov", + "html_url": "https://github.com/vtopunov", + "followers_url": "https://api.github.com/users/vtopunov/followers", + "following_url": "https://api.github.com/users/vtopunov/following{/other_user}", + "gists_url": "https://api.github.com/users/vtopunov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/vtopunov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/vtopunov/subscriptions", + "organizations_url": "https://api.github.com/users/vtopunov/orgs", + "repos_url": "https://api.github.com/users/vtopunov/repos", + "events_url": "https://api.github.com/users/vtopunov/events{/privacy}", + "received_events_url": "https://api.github.com/users/vtopunov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-12-17T19:23:55Z", + "updated_at": "2022-12-17T19:23:55Z", + "author_association": "NONE", + "body": "Можно так\r\n\r\n```\r\n\r\nclass A\r\n{\r\npublic:\r\n class AInt\r\n {\r\n friend class A;\r\n \r\n public:\r\n operator int() const\r\n {\r\n return value_;\r\n }\r\n\r\n private:\r\n AInt(int value) \r\n : value_{ value }\r\n {}\r\n\r\n AInt& operator = (int value)\r\n {\r\n value_ = value;\r\n return *this;\r\n }\r\n\r\n private:\r\n int value_;\r\n };\r\n\r\n A() : x(0)\r\n {}\r\n\r\n A(int n)\r\n : A()\r\n {\r\n x = n;\r\n }\r\n\r\n AInt x;\r\n};\r\n\r\nint main()\r\n{\r\n A a;\r\n int x = a.x;\r\n a.x = 10; // ошибка компиляции\r\n\r\n return 0;\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1356403058/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1356403341", + "html_url": "https://github.com/cpp-ru/ideas/issues/541#issuecomment-1356403341", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/541", + "id": 1356403341, + "node_id": "IC_kwDOFK7cns5Q2RKN", + "user": { + "login": "vtopunov", + "id": 8456542, + "node_id": "MDQ6VXNlcjg0NTY1NDI=", + "avatar_url": "https://avatars.githubusercontent.com/u/8456542?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/vtopunov", + "html_url": "https://github.com/vtopunov", + "followers_url": "https://api.github.com/users/vtopunov/followers", + "following_url": "https://api.github.com/users/vtopunov/following{/other_user}", + "gists_url": "https://api.github.com/users/vtopunov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/vtopunov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/vtopunov/subscriptions", + "organizations_url": "https://api.github.com/users/vtopunov/orgs", + "repos_url": "https://api.github.com/users/vtopunov/repos", + "events_url": "https://api.github.com/users/vtopunov/events{/privacy}", + "received_events_url": "https://api.github.com/users/vtopunov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-12-17T19:25:22Z", + "updated_at": "2022-12-17T19:48:41Z", + "author_association": "NONE", + "body": "Но вообще сама идея выглядит как костыль. Здесь будут уместнее [property](https://en.wikipedia.org/wiki/Property_(programming))", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1356403341/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1364482895", + "html_url": "https://github.com/cpp-ru/ideas/issues/542#issuecomment-1364482895", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/542", + "id": 1364482895, + "node_id": "IC_kwDOFK7cns5RVFtP", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-12-24T07:59:37Z", + "updated_at": "2022-12-24T07:59:37Z", + "author_association": "NONE", + "body": "It's an ABI break", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1364482895/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1369600338", + "html_url": "https://github.com/cpp-ru/ideas/issues/541#issuecomment-1369600338", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/541", + "id": 1369600338, + "node_id": "IC_kwDOFK7cns5RonFS", + "user": { + "login": "klappdev", + "id": 40568872, + "node_id": "MDQ6VXNlcjQwNTY4ODcy", + "avatar_url": "https://avatars.githubusercontent.com/u/40568872?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/klappdev", + "html_url": "https://github.com/klappdev", + "followers_url": "https://api.github.com/users/klappdev/followers", + "following_url": "https://api.github.com/users/klappdev/following{/other_user}", + "gists_url": "https://api.github.com/users/klappdev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/klappdev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/klappdev/subscriptions", + "organizations_url": "https://api.github.com/users/klappdev/orgs", + "repos_url": "https://api.github.com/users/klappdev/repos", + "events_url": "https://api.github.com/users/klappdev/events{/privacy}", + "received_events_url": "https://api.github.com/users/klappdev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-01-03T10:21:17Z", + "updated_at": "2023-01-03T10:21:17Z", + "author_association": "NONE", + "body": "Идея по добавлению property в язык ранее обсуждалась\r\nhttps://github.com/cpp-ru/ideas/issues/522", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1369600338/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1371357321", + "html_url": "https://github.com/cpp-ru/ideas/issues/543#issuecomment-1371357321", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/543", + "id": 1371357321, + "node_id": "IC_kwDOFK7cns5RvUCJ", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-01-04T19:58:08Z", + "updated_at": "2023-01-04T19:58:08Z", + "author_association": "NONE", + "body": "Немного с другой области, но уж очень хочется перегрузки этих алгоритмов для unordered_set\\map контейнеров с константной сложностью (Как в пайтоне).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1371357321/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1386655924", + "html_url": "https://github.com/cpp-ru/ideas/issues/545#issuecomment-1386655924", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/545", + "id": 1386655924, + "node_id": "IC_kwDOFK7cns5SprC0", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-01-18T08:19:12Z", + "updated_at": "2023-01-18T08:19:12Z", + "author_association": "NONE", + "body": "Свежее предложение: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2758r0.html", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1386655924/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1435653361", + "html_url": "https://github.com/cpp-ru/ideas/issues/547#issuecomment-1435653361", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/547", + "id": 1435653361, + "node_id": "IC_kwDOFK7cns5VklTx", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-18T11:59:51Z", + "updated_at": "2023-02-18T11:59:51Z", + "author_association": "NONE", + "body": "Намного важнее было бы иметь такой qualifier. Уже есть 3 предложения про чистые функции, но не в одном из них нет предложения о квалификаторах.\r\nПростой пример: половина алгоритмов имеет неопределенное поведение при мутабельных (не чистых) функторах. И эту распространенную ошибку можно было бы предупредить на этапе компиляции.\r\nОгромный класс распространенных ошибок в многопоточном программировании тоже можно было бы избежать имея такой квалификатор.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1435653361/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1438042198", + "html_url": "https://github.com/cpp-ru/ideas/issues/548#issuecomment-1438042198", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/548", + "id": 1438042198, + "node_id": "IC_kwDOFK7cns5VtshW", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-21T08:31:49Z", + "updated_at": "2023-02-21T08:31:49Z", + "author_association": "NONE", + "body": "`Использовать вместо pimpl.`\r\n\r\nИ отказаться от возможности использовать конструкторы и деструкторы ?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1438042198/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1438230106", + "html_url": "https://github.com/cpp-ru/ideas/issues/548#issuecomment-1438230106", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/548", + "id": 1438230106, + "node_id": "IC_kwDOFK7cns5VuaZa", + "user": { + "login": "osheter", + "id": 87515424, + "node_id": "MDQ6VXNlcjg3NTE1NDI0", + "avatar_url": "https://avatars.githubusercontent.com/u/87515424?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/osheter", + "html_url": "https://github.com/osheter", + "followers_url": "https://api.github.com/users/osheter/followers", + "following_url": "https://api.github.com/users/osheter/following{/other_user}", + "gists_url": "https://api.github.com/users/osheter/gists{/gist_id}", + "starred_url": "https://api.github.com/users/osheter/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/osheter/subscriptions", + "organizations_url": "https://api.github.com/users/osheter/orgs", + "repos_url": "https://api.github.com/users/osheter/repos", + "events_url": "https://api.github.com/users/osheter/events{/privacy}", + "received_events_url": "https://api.github.com/users/osheter/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-21T10:26:55Z", + "updated_at": "2023-02-21T10:26:55Z", + "author_association": "NONE", + "body": "Нет конечно. Экземпляр может быть создан функцией-фабрикой, возвращающей\r\nуказатель.\r\nЭто удобно например для тестов.\r\nМожно писать их имея только заголовок с набором методов и функцией-фабрикой.\r\nА реализацию будет писать совсем другой человек даже в другом DLL\r\n\r\nвт, 21 февр. 2023 г. в 10:32, Sergii Rybin ***@***.***>:\r\n\r\n> Использовать вместо pimpl.\r\n>\r\n> И отказаться от возможности использовать конструкторы и деструкторы ?\r\n>\r\n> —\r\n> Reply to this email directly, view it on GitHub\r\n> , or\r\n> unsubscribe\r\n> \r\n> .\r\n> You are receiving this because you authored the thread.Message ID:\r\n> ***@***.***>\r\n>\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1438230106/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1438295552", + "html_url": "https://github.com/cpp-ru/ideas/issues/548#issuecomment-1438295552", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/548", + "id": 1438295552, + "node_id": "IC_kwDOFK7cns5VuqYA", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-21T11:10:58Z", + "updated_at": "2023-02-21T11:10:58Z", + "author_association": "NONE", + "body": "Для Вашего класса компилятор, согласно стандарта, обязан сгенерировать деструктор, если оригинальный недоступен в области видимости(Что достаточно странно и абсурдно для многих, и приводит к частым ошибкам в программах в виде утечек ресурсов и дэдлоков и прочее). Подробности тут: #476. Конкретно для вашего случая pimpl будет утечка ресурсов. Если же деструктор будет видимым, то это уже совсем не Pimpl.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1438295552/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1438886738", + "html_url": "https://github.com/cpp-ru/ideas/issues/549#issuecomment-1438886738", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/549", + "id": 1438886738, + "node_id": "IC_kwDOFK7cns5Vw6tS", + "user": { + "login": "raidenluikang", + "id": 24319853, + "node_id": "MDQ6VXNlcjI0MzE5ODUz", + "avatar_url": "https://avatars.githubusercontent.com/u/24319853?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/raidenluikang", + "html_url": "https://github.com/raidenluikang", + "followers_url": "https://api.github.com/users/raidenluikang/followers", + "following_url": "https://api.github.com/users/raidenluikang/following{/other_user}", + "gists_url": "https://api.github.com/users/raidenluikang/gists{/gist_id}", + "starred_url": "https://api.github.com/users/raidenluikang/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/raidenluikang/subscriptions", + "organizations_url": "https://api.github.com/users/raidenluikang/orgs", + "repos_url": "https://api.github.com/users/raidenluikang/repos", + "events_url": "https://api.github.com/users/raidenluikang/events{/privacy}", + "received_events_url": "https://api.github.com/users/raidenluikang/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-21T17:56:18Z", + "updated_at": "2023-02-21T18:05:56Z", + "author_association": "NONE", + "body": "Например, если программу соберём без RTTI, \r\n\r\n`#include ` -- либо должен быть ошибка компиляция либо не должен импортировать ничего.\r\n\r\n`std::type_info` класс не должен существовать.\r\n\r\n`dynamic_cast` -- должен быть ошибка компиляция, либо полности удалим ключегово слово `dynamic_cast` при без RTTI \r\n`typeid` - ключевого слово не должен существовать.\r\n\r\nне сгенрировать type_info для полиморфный типах. Экономится памяти виртульный таблице.\r\n\r\nвсе методы который возвращает std::type_info - не должен существовать, их вызов будет ошибка компиляция. \r\nЭто касается std::function :: target_type , target методы.\r\n\r\n ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1438886738/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1439012084", + "html_url": "https://github.com/cpp-ru/ideas/issues/548#issuecomment-1439012084", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/548", + "id": 1439012084, + "node_id": "IC_kwDOFK7cns5VxZT0", + "user": { + "login": "osheter", + "id": 87515424, + "node_id": "MDQ6VXNlcjg3NTE1NDI0", + "avatar_url": "https://avatars.githubusercontent.com/u/87515424?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/osheter", + "html_url": "https://github.com/osheter", + "followers_url": "https://api.github.com/users/osheter/followers", + "following_url": "https://api.github.com/users/osheter/following{/other_user}", + "gists_url": "https://api.github.com/users/osheter/gists{/gist_id}", + "starred_url": "https://api.github.com/users/osheter/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/osheter/subscriptions", + "organizations_url": "https://api.github.com/users/osheter/orgs", + "repos_url": "https://api.github.com/users/osheter/repos", + "events_url": "https://api.github.com/users/osheter/events{/privacy}", + "received_events_url": "https://api.github.com/users/osheter/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-21T19:51:42Z", + "updated_at": "2023-02-21T19:51:42Z", + "author_association": "NONE", + "body": "Видимо, я недостаточно ясно объяснил свою мысль. Моя идея не в том, чтобы\r\nкардинально менять стандарт языка.\r\nЭкземпляр конечно создается и уничтожается там, где есть полное описание\r\nкласса. Это его реализация.\r\nТем не менее существуют ситуации, когда внутреннее устройство класса, его\r\nполя и т.п. не требуется для его использования.\r\nВ таких случаях для пользователя достаточно видеть только указатель/ссылку\r\nи публичные методы.\r\nКонечно, создание и уничтожение происходит там, где класс полностью описан,\r\nно например тест может получать ссылку и выполнять тестирование, \"зная\"\r\nтолько сигнатуры публичных методов.\r\nПриведу пример.\r\n\r\n//-------------- main cpp-file --------------\r\nstruct foo;\r\nvoid foo_test_implementation(foo&);\r\n\r\nstruct foo\r\n{\r\n void set(int y) { x = y; }\r\n int get() const { return x; }\r\n static void test() { foo f; foo_test_implementation(f); }\r\nprivate:\r\n int x;\r\n}\r\n\r\n//---------------- test cpp-file ------------\r\nclass foo;\r\nstatic void foo::test();\r\nint foo::set(int);\r\nint foo::get() const;\r\n\r\nvoid foo_test_implementation(foo& f)\r\n{\r\n f.set(123);\r\n assert(f.get()==123);\r\n}\r\n\r\nvoid main()\r\n{\r\n foo::test();\r\n}\r\n\r\nЗдесь реализация теста получает ссылку на экземпляр и вызывает его\r\nпубличные методы по описаниям сигнатур.\r\nКак именно устроен класс, ни для пользователя ни для компилятора не важно.\r\n\r\nOn Tue, Feb 21, 2023, 13:11 Sergii Rybin ***@***.***> wrote:\r\n\r\n> Для Вашего класса компилятор, согласно стандарта, обязан сгенерировать\r\n> деструктор, если оригинальный недоступен в области видимости(Что достаточно\r\n> странно и абсурдно для многих, и приводит к частым ошибкам в программах в\r\n> виде утечек ресурсов и дэдлоков и прочее). Подробности тут: #476\r\n> . Конкретно для вашего случая\r\n> pimpl будет утечка ресурсов. Если же деструктор будет видимым, то это уже\r\n> совсем не Pimpl.\r\n>\r\n> —\r\n> Reply to this email directly, view it on GitHub\r\n> , or\r\n> unsubscribe\r\n> \r\n> .\r\n> You are receiving this because you authored the thread.Message ID:\r\n> ***@***.***>\r\n>\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1439012084/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1439059772", + "html_url": "https://github.com/cpp-ru/ideas/issues/548#issuecomment-1439059772", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/548", + "id": 1439059772, + "node_id": "IC_kwDOFK7cns5Vxk88", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-21T20:36:09Z", + "updated_at": "2023-02-21T20:36:09Z", + "author_association": "NONE", + "body": "> Тем не менее существуют ситуации, когда внутреннее устройство класса, его поля и т.п. не требуется для его использования. В таких случаях для пользователя достаточно видеть только указатель/ссылку и публичные методы.\r\n\r\nУ линкера ( в сигнатуре метода ) нет информации о том публичный метод или не публичный.\r\nТакже поломается несколько других функций языка с++.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1439059772/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1441433723", + "html_url": "https://github.com/cpp-ru/ideas/issues/542#issuecomment-1441433723", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/542", + "id": 1441433723, + "node_id": "IC_kwDOFK7cns5V6oh7", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-23T09:25:18Z", + "updated_at": "2023-02-23T09:25:18Z", + "author_association": "MEMBER", + "body": "The bahavior of `[[no_unique_address]] ` is part of the Itanium ABI. It could be improved (see https://github.com/itanium-cxx-abi/cxx-abi/issues/77 for an example) however such improvements are ABI breaking.\r\n\r\nSo the best possible wording is already in place https://eel.is/c++draft/dcl.attr.nouniqueaddr , no way to improve it further without breaking things.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1441433723/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1441445023", + "html_url": "https://github.com/cpp-ru/ideas/issues/534#issuecomment-1441445023", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/534", + "id": 1441445023, + "node_id": "IC_kwDOFK7cns5V6rSf", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-23T09:33:06Z", + "updated_at": "2023-02-23T09:33:06Z", + "author_association": "MEMBER", + "body": "Мне идея не нравится так как:\r\n* не добавляется новых функциональных возможностей (такого же поведения можно добиться через reserve)\r\n* проще прочитать две средние строки, чем одну длиннющую\r\n* последний пример работает не так как ожидается - память прорезервирована не будет для всех элементов. Так что фича добавляет сложностей и неоднозначностей", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1441445023/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1441449370", + "html_url": "https://github.com/cpp-ru/ideas/issues/524#issuecomment-1441449370", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/524", + "id": 1441449370, + "node_id": "IC_kwDOFK7cns5V6sWa", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-23T09:36:24Z", + "updated_at": "2023-02-23T09:36:24Z", + "author_association": "MEMBER", + "body": "Все были против бекпортирования на уровне стандарта. Однако многие вендоры подтвердили, что реализуют модуль std в C++20 в качечтве расширения.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1441449370/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1441472681", + "html_url": "https://github.com/cpp-ru/ideas/issues/528#issuecomment-1441472681", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/528", + "id": 1441472681, + "node_id": "IC_kwDOFK7cns5V6yCp", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-23T09:54:37Z", + "updated_at": "2023-02-23T09:54:37Z", + "author_association": "MEMBER", + "body": "Нужные слова уже были в черновике стандарта. В https://wg21.link/p2679 расширили требования на std::start_lifetime_as_array, в том числе и требования по выравниванию и размеру памяти.\r\n\r\nДальше сложнее: проверки выравниваний и размеров в разных компиляторах реализуются по разному. Санийтайзеры уже должны ловить выходы за пределы выделенной памяти. Над более прогрессивными методами думают все разработчики компиляторов...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1441472681/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1441531518", + "html_url": "https://github.com/cpp-ru/ideas/issues/505#issuecomment-1441531518", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/505", + "id": 1441531518, + "node_id": "IC_kwDOFK7cns5V7AZ-", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-23T10:37:17Z", + "updated_at": "2023-02-23T10:37:17Z", + "author_association": "MEMBER", + "body": "Поправили в https://wg21.link/P2693", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1441531518/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1442060258", + "html_url": "https://github.com/cpp-ru/ideas/issues/490#issuecomment-1442060258", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/490", + "id": 1442060258, + "node_id": "IC_kwDOFK7cns5V9Bfi", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-23T16:20:12Z", + "updated_at": "2023-02-23T16:20:12Z", + "author_association": "MEMBER", + "body": "Идея очень хорошая, но просто удалить требование нельзя - многие методы span используют арифметику указателей.\r\n\r\n@AndreyG в proposal вставьте те же волшебные слова что у vector https://eel.is/c++draft/vector#overview-4 и можно отправлять в комитет.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1442060258/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1442084733", + "html_url": "https://github.com/cpp-ru/ideas/issues/467#issuecomment-1442084733", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/467", + "id": 1442084733, + "node_id": "IC_kwDOFK7cns5V9Hd9", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-23T16:36:24Z", + "updated_at": "2023-02-23T16:36:24Z", + "author_association": "MEMBER", + "body": "Комитет решил не чинить это в C++23, так как проблема может быть решена разными способами.\r\n\r\nПроблема обсуждается в https://wg21.link/P2497. @incoder1 @Roman-Koshelev посмотрите, устраивает ли вас подобное решение, и если нет - давайте закинем ваши идеи прямо в автора предложения.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1442084733/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1442096537", + "html_url": "https://github.com/cpp-ru/ideas/issues/490#issuecomment-1442096537", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/490", + "id": 1442096537, + "node_id": "IC_kwDOFK7cns5V9KWZ", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-23T16:44:56Z", + "updated_at": "2023-02-24T15:02:54Z", + "author_association": "NONE", + "body": "> Идея очень хорошая, но просто удалить требование нельзя - многие методы span используют арифметику указателей.\r\n\r\nДа, у меня об этом есть и в тексте issue и в черновике proposal-а.\r\n\r\n@apolukhin куда именно Вы предлагаете вставить волшебные слова? Я колеблюсь между двумя вариантами.\r\n1. Вместо [TODO](https://github.com/AndreyG/cpp-papers/blob/main/span-of-incomplete-element-type.md#todo) написать diff wording-а для каждого из методов, добавляющий \"Requirements:\" или в \"Preconditions:\"\r\n\"ElementType must be a complete object type that is not an abstract class type.\"\r\n2. Поменять [views.span#span.overview-4](https://eel.is/c++draft/views.span#span.overview-4) на\r\n\"An incomplete type ElementType may be used when instantiating span. ElementType shall be a complete object type that is not an abstract class type before any member (except default constructor, trivial copy and move constructors and trivial copy and move assignment operators) of the resulting specialization of span is referenced.\"", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1442096537/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1444075702", + "html_url": "https://github.com/cpp-ru/ideas/issues/544#issuecomment-1444075702", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/544", + "id": 1444075702, + "node_id": "IC_kwDOFK7cns5WEti2", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-24T17:22:23Z", + "updated_at": "2023-02-24T17:22:23Z", + "author_association": "MEMBER", + "body": "А чем не подходит или не удобен std::visit? ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1444075702/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1444083857", + "html_url": "https://github.com/cpp-ru/ideas/issues/543#issuecomment-1444083857", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/543", + "id": 1444083857, + "node_id": "IC_kwDOFK7cns5WEviR", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-24T17:26:27Z", + "updated_at": "2023-02-24T17:26:27Z", + "author_association": "MEMBER", + "body": "Звучит очееь интересно! А можете реализовать эти алгоритмы и сделать PR в Boost.Algorithm https://github.com/boostorg/algorithm ?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1444083857/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1444089909", + "html_url": "https://github.com/cpp-ru/ideas/issues/541#issuecomment-1444089909", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/541", + "id": 1444089909, + "node_id": "IC_kwDOFK7cns5WExA1", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-24T17:29:39Z", + "updated_at": "2023-02-24T17:29:39Z", + "author_association": "MEMBER", + "body": "Согласен, очень похоже на идею с property https://github.com/cpp-ru/ideas/issues/58, предлагаю продолжить обсуждение там", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1444089909/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1444279383", + "html_url": "https://github.com/cpp-ru/ideas/issues/543#issuecomment-1444279383", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/543", + "id": 1444279383, + "node_id": "IC_kwDOFK7cns5WFfRX", + "user": { + "login": "loskutov", + "id": 1202012, + "node_id": "MDQ6VXNlcjEyMDIwMTI=", + "avatar_url": "https://avatars.githubusercontent.com/u/1202012?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/loskutov", + "html_url": "https://github.com/loskutov", + "followers_url": "https://api.github.com/users/loskutov/followers", + "following_url": "https://api.github.com/users/loskutov/following{/other_user}", + "gists_url": "https://api.github.com/users/loskutov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/loskutov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/loskutov/subscriptions", + "organizations_url": "https://api.github.com/users/loskutov/orgs", + "repos_url": "https://api.github.com/users/loskutov/repos", + "events_url": "https://api.github.com/users/loskutov/events{/privacy}", + "received_events_url": "https://api.github.com/users/loskutov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-02-24T19:05:45Z", + "updated_at": "2023-02-24T19:05:45Z", + "author_association": "NONE", + "body": "Речь ведь о фиксации гарантий, которым уже удовлетворяют распространённые имплементации стандартной библиотеки — вероятно, можно даже в качестве defect report оформить.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1444279383/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1452174131", + "html_url": "https://github.com/cpp-ru/ideas/issues/544#issuecomment-1452174131", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/544", + "id": 1452174131, + "node_id": "IC_kwDOFK7cns5Wjmsz", + "user": { + "login": "ghost", + "id": 10137, + "node_id": "MDQ6VXNlcjEwMTM3", + "avatar_url": "https://avatars.githubusercontent.com/u/10137?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/ghost", + "html_url": "https://github.com/ghost", + "followers_url": "https://api.github.com/users/ghost/followers", + "following_url": "https://api.github.com/users/ghost/following{/other_user}", + "gists_url": "https://api.github.com/users/ghost/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ghost/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ghost/subscriptions", + "organizations_url": "https://api.github.com/users/ghost/orgs", + "repos_url": "https://api.github.com/users/ghost/repos", + "events_url": "https://api.github.com/users/ghost/events{/privacy}", + "received_events_url": "https://api.github.com/users/ghost/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-02T16:38:13Z", + "updated_at": "2023-03-02T16:39:24Z", + "author_association": "NONE", + "body": "Он тоже подходит, но так выглядело бы лаконично.\r\nК тому же хороший сахар.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1452174131/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1464875178", + "html_url": "https://github.com/cpp-ru/ideas/issues/553#issuecomment-1464875178", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553", + "id": 1464875178, + "node_id": "IC_kwDOFK7cns5XUDiq", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-11T09:57:47Z", + "updated_at": "2023-03-11T09:57:47Z", + "author_association": "NONE", + "body": "Предлагаемый анализ будет выдавать false positive в таком случае:\r\n```cpp\r\nvoid f(optional o) noexcept {\r\n if (o)\r\n o.value();\r\n}\r\n```\r\nВ данном случае из `noexcept` функции `f` безопасно звать `optional::value()` потенциально бросающую исключение `bad_optional_access`, так как этот вызов происходит после соответствующей проверки `o.has_value()`, но анализатор все равно будет выдавать предупреждение.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1464875178/reactions", + "total_count": 3, + "+1": 2, + "-1": 1, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1464966384", + "html_url": "https://github.com/cpp-ru/ideas/issues/553#issuecomment-1464966384", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553", + "id": 1464966384, + "node_id": "IC_kwDOFK7cns5XUZzw", + "user": { + "login": "vtopunov", + "id": 8456542, + "node_id": "MDQ6VXNlcjg0NTY1NDI=", + "avatar_url": "https://avatars.githubusercontent.com/u/8456542?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/vtopunov", + "html_url": "https://github.com/vtopunov", + "followers_url": "https://api.github.com/users/vtopunov/followers", + "following_url": "https://api.github.com/users/vtopunov/following{/other_user}", + "gists_url": "https://api.github.com/users/vtopunov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/vtopunov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/vtopunov/subscriptions", + "organizations_url": "https://api.github.com/users/vtopunov/orgs", + "repos_url": "https://api.github.com/users/vtopunov/repos", + "events_url": "https://api.github.com/users/vtopunov/events{/privacy}", + "received_events_url": "https://api.github.com/users/vtopunov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-11T18:00:27Z", + "updated_at": "2023-03-11T18:00:27Z", + "author_association": "NONE", + "body": "> ```c++\r\n> void f(optional o) noexcept {\r\n> if (o)\r\n> o.value();\r\n> }\r\n> ```\r\n\r\nПодобный код всегда не оптимален", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1464966384/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1464991279", + "html_url": "https://github.com/cpp-ru/ideas/issues/553#issuecomment-1464991279", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553", + "id": 1464991279, + "node_id": "IC_kwDOFK7cns5XUf4v", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-11T19:24:14Z", + "updated_at": "2023-03-11T19:24:14Z", + "author_association": "NONE", + "body": "Это не важно, оптимален ли он, так пишут, а значит warning добавлять нельзя.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1464991279/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465127777", + "html_url": "https://github.com/cpp-ru/ideas/issues/553#issuecomment-1465127777", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553", + "id": 1465127777, + "node_id": "IC_kwDOFK7cns5XVBNh", + "user": { + "login": "cezarnik", + "id": 20155967, + "node_id": "MDQ6VXNlcjIwMTU1OTY3", + "avatar_url": "https://avatars.githubusercontent.com/u/20155967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/cezarnik", + "html_url": "https://github.com/cezarnik", + "followers_url": "https://api.github.com/users/cezarnik/followers", + "following_url": "https://api.github.com/users/cezarnik/following{/other_user}", + "gists_url": "https://api.github.com/users/cezarnik/gists{/gist_id}", + "starred_url": "https://api.github.com/users/cezarnik/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/cezarnik/subscriptions", + "organizations_url": "https://api.github.com/users/cezarnik/orgs", + "repos_url": "https://api.github.com/users/cezarnik/repos", + "events_url": "https://api.github.com/users/cezarnik/events{/privacy}", + "received_events_url": "https://api.github.com/users/cezarnik/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-12T08:45:29Z", + "updated_at": "2023-03-12T08:45:29Z", + "author_association": "NONE", + "body": "Всё так, спасибо за замечание.\r\nНо никто не предлагает ломать существующий код - предлагается лишь добавить опцию компилятора как opt-in. Конкретно с такой реализацией автор получит warning, только если включит флаг. А люди, которые захотят получать помощь от компилятора, смогут поправить код (в примере выше всё очень легко чинится).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465127777/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465137142", + "html_url": "https://github.com/cpp-ru/ideas/issues/553#issuecomment-1465137142", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553", + "id": 1465137142, + "node_id": "IC_kwDOFK7cns5XVDf2", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-12T09:24:51Z", + "updated_at": "2023-03-12T10:11:07Z", + "author_association": "NONE", + "body": "Как предлагается быть с таким кодом?\r\n```cpp\r\nvoid f(std::vector v) {\r\n if (!v.empty()) {\r\n v[0];\r\n }\r\n}\r\n```\r\nОн абсолютно корректен и не может бросить исключение. При этом `std::vector::operator[]` [не помечен](https://en.cppreference.com/w/cpp/container/vector/operator_at) `noexcept`. Исходя из описанной логики анализа, здесь тоже будет ложноположительное срабатывание, которое можно исправить лишь ненужным try-catch блоком.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465137142/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465282053", + "html_url": "https://github.com/cpp-ru/ideas/issues/553#issuecomment-1465282053", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553", + "id": 1465282053, + "node_id": "IC_kwDOFK7cns5XVm4F", + "user": { + "login": "cezarnik", + "id": 20155967, + "node_id": "MDQ6VXNlcjIwMTU1OTY3", + "avatar_url": "https://avatars.githubusercontent.com/u/20155967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/cezarnik", + "html_url": "https://github.com/cezarnik", + "followers_url": "https://api.github.com/users/cezarnik/followers", + "following_url": "https://api.github.com/users/cezarnik/following{/other_user}", + "gists_url": "https://api.github.com/users/cezarnik/gists{/gist_id}", + "starred_url": "https://api.github.com/users/cezarnik/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/cezarnik/subscriptions", + "organizations_url": "https://api.github.com/users/cezarnik/orgs", + "repos_url": "https://api.github.com/users/cezarnik/repos", + "events_url": "https://api.github.com/users/cezarnik/events{/privacy}", + "received_events_url": "https://api.github.com/users/cezarnik/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-12T19:38:59Z", + "updated_at": "2023-03-12T19:40:54Z", + "author_association": "NONE", + "body": "Да, с этим примером беда. Но, честно говоря, я не понимаю, почему он не noexcept, ведь при выходе за пределы может быть что угодно. Я хочу сказать, что это камень как будто не в огород предложения. Если есть причина, по которой не стоит помечать оператор как noexcept, поправь меня, пожалуйста.\r\nМеня, правда, начало смущать, что у вектора есть методы, которые бросают bad_alloc, что сразу запрещает их использование в noexcept функциях, но, может быть, это и не плохо.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465282053/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465282820", + "html_url": "https://github.com/cpp-ru/ideas/issues/553#issuecomment-1465282820", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553", + "id": 1465282820, + "node_id": "IC_kwDOFK7cns5XVnEE", + "user": { + "login": "cezarnik", + "id": 20155967, + "node_id": "MDQ6VXNlcjIwMTU1OTY3", + "avatar_url": "https://avatars.githubusercontent.com/u/20155967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/cezarnik", + "html_url": "https://github.com/cezarnik", + "followers_url": "https://api.github.com/users/cezarnik/followers", + "following_url": "https://api.github.com/users/cezarnik/following{/other_user}", + "gists_url": "https://api.github.com/users/cezarnik/gists{/gist_id}", + "starred_url": "https://api.github.com/users/cezarnik/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/cezarnik/subscriptions", + "organizations_url": "https://api.github.com/users/cezarnik/orgs", + "repos_url": "https://api.github.com/users/cezarnik/repos", + "events_url": "https://api.github.com/users/cezarnik/events{/privacy}", + "received_events_url": "https://api.github.com/users/cezarnik/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-12T19:42:47Z", + "updated_at": "2023-03-12T19:42:47Z", + "author_association": "NONE", + "body": "Но да, предложение подразумевает следующее: чтобы включить эту опцию в компиляторе, нужно переписать код, и на ранних стадиях можно будет писать немного функций такого вида. Но есть надежды, что по мере использования множество noexcept функций расширится", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465282820/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465300408", + "html_url": "https://github.com/cpp-ru/ideas/issues/553#issuecomment-1465300408", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553", + "id": 1465300408, + "node_id": "IC_kwDOFK7cns5XVrW4", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-12T21:09:17Z", + "updated_at": "2023-03-12T21:09:17Z", + "author_association": "NONE", + "body": "> Если есть причина, по которой не стоит помечать оператор как noexcept, поправь меня, пожалуйста.\r\n\r\nПричина есть - реализации хотят иметь возможность вставлять в отладочном режиме дополнительные проверки и в том числе бросать исключения. Так делает стандартная библиотека MSVC, например. Именно поэтому многие функции, которые могут привести к UB, не помечены `noexcept`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465300408/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465583580", + "html_url": "https://github.com/cpp-ru/ideas/issues/553#issuecomment-1465583580", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553", + "id": 1465583580, + "node_id": "IC_kwDOFK7cns5XWwfc", + "user": { + "login": "adromanov", + "id": 13982171, + "node_id": "MDQ6VXNlcjEzOTgyMTcx", + "avatar_url": "https://avatars.githubusercontent.com/u/13982171?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/adromanov", + "html_url": "https://github.com/adromanov", + "followers_url": "https://api.github.com/users/adromanov/followers", + "following_url": "https://api.github.com/users/adromanov/following{/other_user}", + "gists_url": "https://api.github.com/users/adromanov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/adromanov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/adromanov/subscriptions", + "organizations_url": "https://api.github.com/users/adromanov/orgs", + "repos_url": "https://api.github.com/users/adromanov/repos", + "events_url": "https://api.github.com/users/adromanov/events{/privacy}", + "received_events_url": "https://api.github.com/users/adromanov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-13T06:29:07Z", + "updated_at": "2023-03-13T06:29:25Z", + "author_association": "NONE", + "body": "> > ```c++\r\n> > void f(optional o) noexcept {\r\n> > if (o)\r\n> > o.value();\r\n> > }\r\n> > ```\r\n> \r\n> Подобный код всегда не оптимален\r\n\r\nС нормальным уровнем оптимизации компиляторы выкинут код со второй проверкой на пустоту и бросанием исключения.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1465583580/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1466080088", + "html_url": "https://github.com/cpp-ru/ideas/issues/553#issuecomment-1466080088", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553", + "id": 1466080088, + "node_id": "IC_kwDOFK7cns5XYptY", + "user": { + "login": "asherikov", + "id": 923021, + "node_id": "MDQ6VXNlcjkyMzAyMQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/923021?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/asherikov", + "html_url": "https://github.com/asherikov", + "followers_url": "https://api.github.com/users/asherikov/followers", + "following_url": "https://api.github.com/users/asherikov/following{/other_user}", + "gists_url": "https://api.github.com/users/asherikov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/asherikov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/asherikov/subscriptions", + "organizations_url": "https://api.github.com/users/asherikov/orgs", + "repos_url": "https://api.github.com/users/asherikov/repos", + "events_url": "https://api.github.com/users/asherikov/events{/privacy}", + "received_events_url": "https://api.github.com/users/asherikov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-13T12:46:30Z", + "updated_at": "2023-03-13T12:46:30Z", + "author_association": "NONE", + "body": "clang-tidy ловит по крайней мере часть таких проблем -> https://clang.llvm.org/extra/clang-tidy/checks/bugprone/exception-escape.html", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1466080088/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1475898793", + "html_url": "https://github.com/cpp-ru/ideas/issues/552#issuecomment-1475898793", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/552", + "id": 1475898793, + "node_id": "IC_kwDOFK7cns5X-G2p", + "user": { + "login": "ssoft-hub", + "id": 21082620, + "node_id": "MDQ6VXNlcjIxMDgyNjIw", + "avatar_url": "https://avatars.githubusercontent.com/u/21082620?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/ssoft-hub", + "html_url": "https://github.com/ssoft-hub", + "followers_url": "https://api.github.com/users/ssoft-hub/followers", + "following_url": "https://api.github.com/users/ssoft-hub/following{/other_user}", + "gists_url": "https://api.github.com/users/ssoft-hub/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ssoft-hub/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ssoft-hub/subscriptions", + "organizations_url": "https://api.github.com/users/ssoft-hub/orgs", + "repos_url": "https://api.github.com/users/ssoft-hub/repos", + "events_url": "https://api.github.com/users/ssoft-hub/events{/privacy}", + "received_events_url": "https://api.github.com/users/ssoft-hub/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-20T09:35:34Z", + "updated_at": "2023-03-20T09:36:59Z", + "author_association": "NONE", + "body": "Нововведения в стандарт c++23 [p0847r6](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0847r6.html) позволяют написать обертку в виде\r\n\r\n```cpp\r\n#include \r\n\r\ntemplate < typename Self, typename Type >\r\nusing like_t = decltype( ::std::forward_like< Self >( ::std::declval< Type >() ) );\r\n\r\ntemplate < typename T >\r\nstruct Proxy\r\n{\r\n T m_v;\r\n\r\n template < typename Self >\r\n operator like_t< Self, T > ( this Self && self )\r\n {\r\n return ::std::forward_like< Self >( self.Proxy::m_v );\r\n }\r\n};\r\n\r\nstruct Data {};\r\nusing ProxyData = Proxy< Data >;\r\n\r\nvoid bar ( Data && other ) {}\r\nvoid bar ( Data const && other ) {}\r\nvoid bar ( Data & other ) {}\r\nvoid bar ( Data const & other ) {}\r\n\r\nProxyData foo () { return {}; }\r\nProxyData const cfoo () { return {}; }\r\n\r\nint main ()\r\n{\r\n // rvalue / mutable\r\n {\r\n Data data = foo();\r\n data = foo();\r\n bar( foo() );\r\n }\r\n\r\n // rvalue / const\r\n {\r\n Data data = cfoo();\r\n data = cfoo();\r\n bar( cfoo() );\r\n }\r\n\r\n // lvalue / mutable\r\n {\r\n ProxyData proxy;\r\n Data data = proxy;\r\n data = proxy;\r\n bar( proxy );\r\n }\r\n\r\n // lvalue / const\r\n {\r\n ProxyData const proxy;\r\n Data data = proxy;\r\n data = proxy;\r\n bar( proxy );\r\n }\r\n return 0;\r\n}\r\n```\r\n\r\nТакая реализация без проблем собирается и правильно работает. На мой взгляд это ещё один повод, чтобы явная реализация операторов преобразования работала подобным образом.\r\n\r\nPS: Так же хорошо бы в стандарт добавить тип ::std::like_t наравне с добавленным уже ::std::forward_like.\r\n\r\nСсылка на исходный код [godbolt](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGIM6SuADJ4DJgAcj4ARpjEElwArKQADqgKhE4MHt6%2B/ilpGQIhYZEsMXFcibaY9o4CQgRMxATZPn4BdpgOmQ1NBMUR0bHxSQqNza25HeP9oYNlw5UJAJS2qF7EyOwc5gDMocjeWADUJrtuBACeyZgA%2BgTETIQKZ9gmGgCCewdHmKfnbBYJEur3eX0%2BY2IXgcxwAIkxGmCTAB2KyfY4YuEIpjHCDLU6olGwsGYrGNXFknHmABsNOOqAICFix3xKKsyOJ6Mx8PJEEpxzQDDGpzMtNF9MZzNZhI5JO52IpPKp4oZTOILIJ7M5H1JSsVCsFwrpqqlmqJSK5GL1xpujyI6rOsP15Jpxsl6ulFmOxEwBA2DGOACpGXgXrsvebLfybbEESR/k6%2BXrDQQRWLqRK1Rq2d7ff6gyGwxHZVHrSrbXGHbtE9GVe7s6jc37iAHgwhQ2di9rdQqY3b447nTiU2nM6acz7m63C52CdrzeGLR8AG6oPDoY5RJpDtNurOeyMrtcbrfqpMGgRG0V78cy7Wr9eb7fnl11/dmktHx%2Bnncjm8ej950%2BAhMBYZIDBA/43GOK4bmYNhjiEGoqFIGDrkYVg/gAFXQ/43k%2BLx0iMY5aDwABrO5U0HLBDlgzA%2BRAEAxnQRj%2BGIAB3Jp0FuUiKLOaCkNoKg8IYpiCBYkAaNoZcxH444cJuET8WUzslxAsCIL%2BOS6Pg7C8LBSFoVTZRiFQVQQU%2BNk5QxLDjhYW5l1Uyyo3U8CES0840LgzDEOQ/So1QCt7RI8jKLkwSUPkvCKULXyhN3cU7GE5ZrLNKNSUnfNGOY1iSE44huN4zBwr811xVePkkoAOhMszLkY%2BzlxZJydUxQ9UtczSoK8jCEIi/zWoxKS6IgJgvCIfFgF9GL2wUOLhLKjMkuaqMrPSzFMpbY5svE3KOK4njQpK%2BLFpE45qtq8yGoc5rF1Wz8FzRcEPkI0JgGOS7LmtasPtM8y5O%2Bt47uez69X4VBcU9Jt8ys2VwznMFQYvIVU2QcHIc1aGtth4l4faz5QlTFgngDPEkUJe6ntJUkAHoae9GTvD%2BemWHGpgonoVLSTWwbqZ7cl0F7H7wbxKqpoIMngb5vnBZdYXUFQUXxclqnpdJU8%2BRF5Yxd9PFbtVvn8d52n6eIRmvGZgVLwILm2op43pb1WWqR%2BtGFaV3WUqltXMWdhMBS1nWJa9g2fY1gP3e15WVO9w2HvWjE6ZI83LdZxoOeKhO0odvmkfJZI/pBWOfadoWnQLuqg5V22ZbL44K/MquQ5r6nw4by4m/1lujbVpPpLEC3jnplNu/tn3MTz4drfrwuWvHq0FT9wd26buf56Xn6V%2Bjtfx7bwvO%2BbrPD25z8T9Dk2GYH1O2Yz0fz8dxe661nefY3p1n%2BLtXw61ruj/jnOh6mxTkPK2KM74t35jiN%2BEdFaHwAaSaBbtYEvy/k0PkSC9ZwLVj3aWfdgEsxvpzP%2B99c6Fz1O3FBD8BZ1woZ/aW0DaEkNbmgmedVf4AJwXzPBV8QEj2IRAieZDkbCkYQIhe1C5bl1nnQ2ukjWH/Rkcw4gfJ27sOwafO2QFeabQDBoFqRIOCrFoJwBIvA/AcC0KQVAnA3DWGsOddYmwtJmF2DwUgBBNCGNWGREACQNBVWpAkMwyJJCJCkLsakGhXH6E4JIMxnirGcF4AoEAGh3GeNWHAWASA0BgToLEcglBcnJHyXEZcyBkjJAclwAAnDxdyYxbiqGpNILAy48BbAAGp4EwOxAA8nBTgbiaC0BAsQFJEAogJKiKEJo9VuC8BmcwYglw%2BlRG0F0DxCzSC5LYIIPpDBaDzMsVgYmRhxAWN4PgH03RlyYBSZcwIqgujjW2G4wmNQEmkSiI8FZHgsAJIeHgFgQzDF8AMMABQ3TekDMYKCmQggRBiHYFIBF8glBqASboAIBgjAoDsZYfQeAogpMgKsQKdQhScBpjlUwlhrCaTGMkmomzMguAYO4TwbQ9DBDmKUcoehUjpEpZMPwXB8jCsyAMflixqi1B6DMUVehOjdHqDMaVQwKi2EVVy3I4qxh9A1QsCoqwFCOK2BIIxJj4mPOsRwY4zTJB2QUOU44y5alVUZamCAuBCADhcVwZYvAtlaGWKsJkTAsBxDxKQHxkgalVV2JIZEZgEgAA5JBpoSNSXYNTqQ1JiRwOJpBzGWLtck1J6TLlhsLWYG1ZaklVtDasO54y2WSCAA%3D%3D%3D)\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1475898793/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1476821017", + "html_url": "https://github.com/cpp-ru/ideas/issues/552#issuecomment-1476821017", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/552", + "id": 1476821017, + "node_id": "IC_kwDOFK7cns5YBoAZ", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-20T19:31:38Z", + "updated_at": "2023-03-20T19:31:38Z", + "author_association": "NONE", + "body": "Скоро C++ будет как Perl только C++. И глядя на код можно будет сразу точно сказать, что вообще не понятно что он делает и почему делает именно так, то что он делает и где прячится UB из за которого иногда происходит не совсем то что было задумано изначально.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1476821017/reactions", + "total_count": 1, + "+1": 0, + "-1": 0, + "laugh": 1, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1483789179", + "html_url": "https://github.com/cpp-ru/ideas/issues/513#issuecomment-1483789179", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/513", + "id": 1483789179, + "node_id": "IC_kwDOFK7cns5YcNN7", + "user": { + "login": "1vanK", + "id": 13021826, + "node_id": "MDQ6VXNlcjEzMDIxODI2", + "avatar_url": "https://avatars.githubusercontent.com/u/13021826?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/1vanK", + "html_url": "https://github.com/1vanK", + "followers_url": "https://api.github.com/users/1vanK/followers", + "following_url": "https://api.github.com/users/1vanK/following{/other_user}", + "gists_url": "https://api.github.com/users/1vanK/gists{/gist_id}", + "starred_url": "https://api.github.com/users/1vanK/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/1vanK/subscriptions", + "organizations_url": "https://api.github.com/users/1vanK/orgs", + "repos_url": "https://api.github.com/users/1vanK/repos", + "events_url": "https://api.github.com/users/1vanK/events{/privacy}", + "received_events_url": "https://api.github.com/users/1vanK/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-25T10:30:13Z", + "updated_at": "2023-03-25T10:30:13Z", + "author_association": "NONE", + "body": "sincos был бы очень полезен, как узнать, идёт ли какое-то обсуждание по этой теме?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1483789179/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1485497135", + "html_url": "https://github.com/cpp-ru/ideas/issues/557#issuecomment-1485497135", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/557", + "id": 1485497135, + "node_id": "IC_kwDOFK7cns5YiuMv", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-27T16:55:17Z", + "updated_at": "2023-03-27T20:40:27Z", + "author_association": "NONE", + "body": "Хотелось бы увидеть пример реализации этой функции (или, по крайней мере, её объявление)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1485497135/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1485775815", + "html_url": "https://github.com/cpp-ru/ideas/issues/557#issuecomment-1485775815", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/557", + "id": 1485775815, + "node_id": "IC_kwDOFK7cns5YjyPH", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-27T19:54:47Z", + "updated_at": "2023-03-27T19:54:47Z", + "author_association": "NONE", + "body": "Что-то подобное можно реализовать только для `std::tuple`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1485775815/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1485821341", + "html_url": "https://github.com/cpp-ru/ideas/issues/557#issuecomment-1485821341", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/557", + "id": 1485821341, + "node_id": "IC_kwDOFK7cns5Yj9Wd", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-27T20:28:41Z", + "updated_at": "2023-03-27T20:28:41Z", + "author_association": "NONE", + "body": "> Что-то подобное можно реализовать только для `std::tuple`\r\n\r\nЧисто теоретически, то можно реализовать возвращая std::variant\\ANY из оператора [], вот только код легче не станет.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1485821341/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1486212472", + "html_url": "https://github.com/cpp-ru/ideas/issues/557#issuecomment-1486212472", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/557", + "id": 1486212472, + "node_id": "IC_kwDOFK7cns5Ylc14", + "user": { + "login": "blacktea", + "id": 42189825, + "node_id": "MDQ6VXNlcjQyMTg5ODI1", + "avatar_url": "https://avatars.githubusercontent.com/u/42189825?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/blacktea", + "html_url": "https://github.com/blacktea", + "followers_url": "https://api.github.com/users/blacktea/followers", + "following_url": "https://api.github.com/users/blacktea/following{/other_user}", + "gists_url": "https://api.github.com/users/blacktea/gists{/gist_id}", + "starred_url": "https://api.github.com/users/blacktea/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/blacktea/subscriptions", + "organizations_url": "https://api.github.com/users/blacktea/orgs", + "repos_url": "https://api.github.com/users/blacktea/repos", + "events_url": "https://api.github.com/users/blacktea/events{/privacy}", + "received_events_url": "https://api.github.com/users/blacktea/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-03-28T04:51:54Z", + "updated_at": "2023-03-28T04:51:54Z", + "author_association": "NONE", + "body": "Это можно было бы элегантно решить если бы параметр функции `consteval` функции был бы `constant expression`.\r\n\r\nУже есть бумага https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1045r0.html, где предлагаю ввести `constexpr` для аргумента функции.\r\n\r\n```\r\nvoid f(constexpr int x) {\r\n static_assert(x == 5);\r\n}\r\n```\r\nКто нибудь знает, если по этому вопросу продвижение?\r\n\r\nИ ещё вопрос, почему для `consteval` функций аргументы не являются `constant expression`?\r\nТ.е. в чём сложность сделать след. код компилируемым?\r\n\r\n```\r\nconsteval void f(int x) {\r\n static_assert(x == 5);\r\n}\r\n```\r\n \r\n\r\nТаким образом предлагаемый мной `operator[]` должен быть `consteval`. Иначе, как выше заметили это не реализовать или не имеет практического смысла.\r\nЧто то похожее спрашивают на SO https://stackoverflow.com/questions/56130792/will-consteval-functions-allow-template-parameters-dependent-on-function-argumen. \r\n\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1486212472/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1535193747", + "html_url": "https://github.com/cpp-ru/ideas/issues/561#issuecomment-1535193747", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/561", + "id": 1535193747, + "node_id": "IC_kwDOFK7cns5bgTKT", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-05-04T18:03:33Z", + "updated_at": "2023-05-04T18:03:33Z", + "author_association": "NONE", + "body": "Хорошая идея, я себе понапридумывал функций equalTo, notEqualTo ... как раз, что бы решить эту проблему\r\n\r\n```\r\nstd::any_of(v.begin(), v.end(),equalTo(5));\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1535193747/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1566014186", + "html_url": "https://github.com/cpp-ru/ideas/issues/562#issuecomment-1566014186", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/562", + "id": 1566014186, + "node_id": "IC_kwDOFK7cns5dV3rq", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-05-28T08:50:36Z", + "updated_at": "2023-05-28T08:50:36Z", + "author_association": "NONE", + "body": "`typeid(T).name() `\r\nВозвращает строку которая не обязательно манглированная. Это может быть и имя типа человекочитаемое, а может быть уникальный ID.\r\n\r\n> Returns an implementation defined null-terminated character string containing the name of the type. No guarantees are given; in particular, the returned string can be identical for several types and change between invocations of the same program.\r\n\r\n\r\n\r\nТут я предлагаю nameof #535 даже пару лайков поставили.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1566014186/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1567134347", + "html_url": "https://github.com/cpp-ru/ideas/issues/548#issuecomment-1567134347", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/548", + "id": 1567134347, + "node_id": "IC_kwDOFK7cns5daJKL", + "user": { + "login": "tea", + "id": 70251, + "node_id": "MDQ6VXNlcjcwMjUx", + "avatar_url": "https://avatars.githubusercontent.com/u/70251?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tea", + "html_url": "https://github.com/tea", + "followers_url": "https://api.github.com/users/tea/followers", + "following_url": "https://api.github.com/users/tea/following{/other_user}", + "gists_url": "https://api.github.com/users/tea/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tea/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tea/subscriptions", + "organizations_url": "https://api.github.com/users/tea/orgs", + "repos_url": "https://api.github.com/users/tea/repos", + "events_url": "https://api.github.com/users/tea/events{/privacy}", + "received_events_url": "https://api.github.com/users/tea/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-05-29T13:20:44Z", + "updated_at": "2023-05-29T13:20:44Z", + "author_association": "NONE", + "body": "Возникает проблема с overloads. Например, есть внешнее определение void foo::bar(int), а в классе есть void bar(long). Вызываем m_foo->bar(1L), и выбор конкретного метода оказывается зависимым от того, видим мы класс или нет.\r\nКроме того, сама эта проблема (отвязывание использования класса от его деталей реализации), если я правильно понимаю, может/должна решаться сама собой при использовании модулей.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1567134347/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1567266274", + "html_url": "https://github.com/cpp-ru/ideas/issues/548#issuecomment-1567266274", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/548", + "id": 1567266274, + "node_id": "IC_kwDOFK7cns5dapXi", + "user": { + "login": "osheter", + "id": 87515424, + "node_id": "MDQ6VXNlcjg3NTE1NDI0", + "avatar_url": "https://avatars.githubusercontent.com/u/87515424?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/osheter", + "html_url": "https://github.com/osheter", + "followers_url": "https://api.github.com/users/osheter/followers", + "following_url": "https://api.github.com/users/osheter/following{/other_user}", + "gists_url": "https://api.github.com/users/osheter/gists{/gist_id}", + "starred_url": "https://api.github.com/users/osheter/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/osheter/subscriptions", + "organizations_url": "https://api.github.com/users/osheter/orgs", + "repos_url": "https://api.github.com/users/osheter/repos", + "events_url": "https://api.github.com/users/osheter/events{/privacy}", + "received_events_url": "https://api.github.com/users/osheter/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-05-29T15:16:56Z", + "updated_at": "2023-05-29T15:16:56Z", + "author_association": "NONE", + "body": "Если в классе нет описанного метода, то программа не соберется.\r\n\r\nМодули, видимо, должны распространяться в предкомпилированном виде, я не\r\nочень с этим знаком. Но если это так, то начинать разработку зависимого\r\nмодуля (теста) невозможно, пока исходный модуль не готов и не прошел\r\nкомпиляцию.\r\n\r\nOn Mon, May 29, 2023, 16:20 Andrey Turkin ***@***.***> wrote:\r\n\r\n> Возникает проблема с overloads. Например, есть внешнее определение void\r\n> foo::bar(int), а в классе есть void bar(long). Вызываем m_foo->bar(1L), и\r\n> выбор конкретного метода оказывается зависимым от того, видим мы класс или\r\n> нет.\r\n> Кроме того, сама эта проблема (отвязывание использования класса от его\r\n> деталей реализации), если я правильно понимаю, может/должна решаться сама\r\n> собой при использовании модулей.\r\n>\r\n> —\r\n> Reply to this email directly, view it on GitHub\r\n> , or\r\n> unsubscribe\r\n> \r\n> .\r\n> You are receiving this because you authored the thread.Message ID:\r\n> ***@***.***>\r\n>\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1567266274/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1595629645", + "html_url": "https://github.com/cpp-ru/ideas/issues/563#issuecomment-1595629645", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/563", + "id": 1595629645, + "node_id": "IC_kwDOFK7cns5fG2BN", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-06-17T05:28:50Z", + "updated_at": "2023-06-17T05:28:50Z", + "author_association": "MEMBER", + "body": "Приняли в C++23 https://github.com/cplusplus/papers/issues/1251", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1595629645/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1595630268", + "html_url": "https://github.com/cpp-ru/ideas/issues/522#issuecomment-1595630268", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/522", + "id": 1595630268, + "node_id": "IC_kwDOFK7cns5fG2K8", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-06-17T05:32:29Z", + "updated_at": "2023-06-17T05:32:29Z", + "author_association": "MEMBER", + "body": "Есть у меня идейка, займусь статическим анализом и жёстким и гарантиями на владение", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1595630268/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1597200412", + "html_url": "https://github.com/cpp-ru/ideas/issues/561#issuecomment-1597200412", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/561", + "id": 1597200412, + "node_id": "IC_kwDOFK7cns5fM1gc", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-06-19T13:30:59Z", + "updated_at": "2023-06-19T13:30:59Z", + "author_association": "NONE", + "body": "Это называется contains", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1597200412/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1597218235", + "html_url": "https://github.com/cpp-ru/ideas/issues/561#issuecomment-1597218235", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/561", + "id": 1597218235, + "node_id": "IC_kwDOFK7cns5fM527", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-06-19T13:42:51Z", + "updated_at": "2023-06-19T13:42:51Z", + "author_association": "NONE", + "body": "> Это называется contains\r\n\r\nВместо перегрузки предлагаете алгоритм с другим именем ?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1597218235/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1598392461", + "html_url": "https://github.com/cpp-ru/ideas/issues/564#issuecomment-1598392461", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/564", + "id": 1598392461, + "node_id": "IC_kwDOFK7cns5fRYiN", + "user": { + "login": "KindDragon", + "id": 224272, + "node_id": "MDQ6VXNlcjIyNDI3Mg==", + "avatar_url": "https://avatars.githubusercontent.com/u/224272?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/KindDragon", + "html_url": "https://github.com/KindDragon", + "followers_url": "https://api.github.com/users/KindDragon/followers", + "following_url": "https://api.github.com/users/KindDragon/following{/other_user}", + "gists_url": "https://api.github.com/users/KindDragon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/KindDragon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/KindDragon/subscriptions", + "organizations_url": "https://api.github.com/users/KindDragon/orgs", + "repos_url": "https://api.github.com/users/KindDragon/repos", + "events_url": "https://api.github.com/users/KindDragon/events{/privacy}", + "received_events_url": "https://api.github.com/users/KindDragon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-06-20T09:02:22Z", + "updated_at": "2023-06-20T09:02:22Z", + "author_association": "NONE", + "body": "std::is_trivially_relocatable помоему направлен на решение тойже проблемы другим путем https://github.com/cplusplus/papers/issues/43", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1598392461/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1598440952", + "html_url": "https://github.com/cpp-ru/ideas/issues/564#issuecomment-1598440952", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/564", + "id": 1598440952, + "node_id": "IC_kwDOFK7cns5fRkX4", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-06-20T09:33:27Z", + "updated_at": "2023-06-20T09:33:27Z", + "author_association": "NONE", + "body": "> std::is_trivially_relocatable помоему направлен на решение тойже проблемы другим путем [cplusplus/papers#43](https://github.com/cplusplus/papers/issues/43)\r\n\r\nя прекрасно знаю об этом и многих других пропозалах, их проблема в том, что они не помогают компилятору ничего вывести и не уменьшают количество нужного кода, а лишь увеличивают.\r\nНапример, нужно будет аттрибутом или ещё как то помечать типы тривиальные для релоцирования, к тому же нет ничего что уже сейчас бы не было доступно, т.е. прямо сейчас вы можете сделать using relocatable = int; внутри типа, потом в алгоритмах это проверять. Это будет надёжнее аттрибута. Короче говоря усложнение языка без профитов\r\n\r\nМоё предложение делает эту работу за программиста и позволяет старому коду стать лучше, иногда с минимальными изменениями типа = swap, позволит компилятору вовсе не генерировать мув конструкторы и т.д.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1598440952/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1598444066", + "html_url": "https://github.com/cpp-ru/ideas/issues/564#issuecomment-1598444066", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/564", + "id": 1598444066, + "node_id": "IC_kwDOFK7cns5fRlIi", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-06-20T09:35:34Z", + "updated_at": "2023-06-20T09:35:34Z", + "author_association": "NONE", + "body": "И если говорить про трейт is_trviially_destructible_after_move я считаю это первый шаг к тому чтобы статически доказывать семантические утверждения про типы, то чего так хотел Страуструп.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1598444066/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1600406981", + "html_url": "https://github.com/cpp-ru/ideas/issues/555#issuecomment-1600406981", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/555", + "id": 1600406981, + "node_id": "IC_kwDOFK7cns5fZEXF", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-06-21T08:24:09Z", + "updated_at": "2023-06-21T08:24:09Z", + "author_association": "NONE", + "body": "Это делается наоборот через превращение индекса в constexpr индекс и потом обращение по нему\r\n\r\n```C++\r\nvisit([&]{\r\n std::get(tpl);\r\n },\r\n index);\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1600406981/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1609058823", + "html_url": "https://github.com/cpp-ru/ideas/issues/566#issuecomment-1609058823", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/566", + "id": 1609058823, + "node_id": "IC_kwDOFK7cns5f6EoH", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2023-06-27T08:44:14Z", + "updated_at": "2023-06-27T08:54:59Z", + "author_association": "NONE", + "body": "Да, здесь не InputIterator-ы, а Bidirectional, но можно и на Input переписать, наверное.\r\n```\r\ntemplate\r\nOutputIterator merge_unique(InputIterator1 first1, InputIterator1 last1,\r\n InputIterator2 first2, InputIterator2 last2,\r\n OutputIterator result)\r\n{\r\n while (first1 != last1 && first2 != last2) {\r\n auto&& value1 = *first1;\r\n auto&& value2 = *first2;\r\n if (value1 < value2) {\r\n while (++first1 != last1 && !(value1 < *first1));\r\n *result++ = std::move(value1);\r\n } else if (value2 < value1) {\r\n while (++first2 != last2 && !(value2 < *first2));\r\n *result++ = std::move(value2);\r\n } else {\r\n while (++first1 != last1 && !(value1 < *first1));\r\n while (++first2 != last2 && !(value2 < *first2));\r\n *result++ = std::move(value1);\r\n }\r\n }\r\n while (first1 != last1) {\r\n auto&& value1 = *first1;\r\n while (++first1 != last1 && !(value1 < *first1));\r\n *result++ = std::move(value1);\r\n }\r\n while (first2 != last2) {\r\n auto&& value2 = *first2;\r\n while (++first2 != last2 && !(value2 < *first2));\r\n *result++ = std::move(value2);\r\n }\r\n return result;\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1609058823/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797378634", + "html_url": "https://github.com/cpp-ru/ideas/issues/1#issuecomment-797378634", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/1", + "id": 797378634, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzM3ODYzNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T09:59:29Z", + "updated_at": "2021-03-12T09:59:29Z", + "author_association": "MEMBER", + "body": "**Сергей Прейс, 2 декабря 2016, 13:29**\r\nЕсть, правда, проблемка: если я правильно помню, компиляторы имеют право игнорировать неподдерживаемые аттрибуты. Может надо как-то расширить ключевое слово `extern` на эту тему?\r\n\r\n**yndx-antoshkka, 2 декабря 2016, 16:18**\r\nСергей Прейс, на каком-то из недавних заседаний решили, что компиляторы должны игнорировать не поддерживаемые атрибуты. Так что в том плане - всё верно.\r\n\r\n**Сергей Прейс, 5 декабря 2016, 5:18**\r\nyndx-antoshkka, именно игнорирование атрибута меня и беспокоит: если visibility не поддерживается на платформе - это нормально. Но вот если конкретный компилятор его не поддержал (скажем, не успел) то будут проблемки: символы просто не проэкспортируются и будут недоступны в динамической библиотеке и как результат код приведённый в p0276r0 не сократится, а только раздуется за счёт проверок на версии компиляторов поддерживающих `[[visible]]`.\r\n\r\n**yndx-antoshkka, 7 декабря 2016, 20:00**\r\nСергей Прейс, у вас есть идеи как этого избежать?\r\n\r\n**Сергей Прейс, 8 декабря 2016, 12:30**\r\nyndx-antoshkka, один из вариантов - сделать это не атрибутом, а ключевым словом или модификатором к `extern`, чтобы все компиляторы поддерживающие стандарт были обязаны это правильно обрабатывать.\r\n\r\nСейчас на linux и windows эта проблема решена по-разному. На Windows `__declspec(dllexport)` не может игнонироваться. Он появился одновременно с динамическими билиотеками и всегда поддерживался и правильно обрабатывался всеми компиляторами на платформе. На linux дефолтное поведение - это `visibility=default` и все символы экпортируются, а `visibility=hidden` - это оптимизация по атрибуту, который может игнорироваться. Изменение этого поведения делается по ключу и, соответсвеннo, vendor-specific (разработчики компилятора вообще говоря не обязаны это поддерживать). Соответсвенно, не очень понятно как стандарт будет устроен - по идее чтобы атрибуты работали правильно он должен быть устроен как дефолтное поведение на Linux, но это ухудшит жизнь на Windows и принесет мало пользы на Linux. Если же в стандарте будет предписан явный экспорт - это поломает обратную совместимость на Linux и сделает использование артибутов невозможным - такой атрибут нельзя будет игнорировать.\r\n\r\nСейчас идёт движение в сторону стандартизации модулей и интерфейсов и в рамках этого направления, я думаю, можно стандартизовать и внешнюю видимость на уровне языка на не платформо-специфичных свойств и атрибутов.\r\n\r\n**Олег Ляттэ, 9 декабря 2016, 0:55**\r\nСергей Прейс, man gcc (5.3.0 Linux) рекомендует `-fvisibility=hidden` и помечать нужные символы/классы/неймспейсы `__attribute__ ((visibility(\"default\")))`. Это не только согласуется с подходом Windows, но и является более корректным решением, т.к. экспортить всё, конечно, гарантирует видимость, но затрудняет оптимизацию, нарушает инкапсуляцию, замедляет загрузку DSO.\r\n\r\nВ любом случае, если вы используете `-fvisibility=default` (или просто оставляете поведение по умолчанию), то `[[visible]]`, как и `__attribute__ ((visibility(\"default\")))`, просто не имеет никакого эффекта, т.к. все символы и так экспортируются (видимы), и наличие этих атрибутов ничего не поломает.\r\n\r\nЕсли же вы используете `-fvisibility=hidden`, то атрибут `[[visible]]` является по сути синонимом `__attribute__ ((visibility(\"default\")))`, и действует аналогично `__declspec(dllexport)` в Windows.\r\n\r\n**Олег Ляттэ, 9 декабря 2016, 1:05**\r\nСергей Прейс, кстати, не думаю, что в этом случае стоит мериться на компиляторы, которые не успели поддержать стандартный атрибут. Тем более, что управление видимостью символов уже давно реализовано практически во всех компиляторах, так что поддержка стандарта в этом случае будет делом вполне тривиальным.\r\n\r\n\r\n**Сергей Прейс, 13 декабря 2016, 19:09**\r\nОлег Ляттэ, боюсь, что за кучей написанных мною слов вы не поняли суть дилеммы.\r\n\r\nВсе атрибуты в стандарте сейчас \"do not change the meaning of the program, but may result in generation of more efficient code\". И \"Any attribute-token that is not recognized by the implementation is ignored\". Предложения по атрибутам, меняющим meaning of the program последовательно откланяются (на сколько я знаю) поскольку свойства влияющие на семантику должны быть (по идеологии стандарта) частью системы типов, а атрибуты - не являются.\r\n\r\nПочему дилемма:\r\n- Не удастся сделать атрибут `[[visible]]` при дефолтном `-fvisibility=hidden` (как на Windows). Такой атрибут не может быть проигнорирован компилятором с сохранением корректности кода. Надо либо менять базовые принципы концепции \"атрибут\" в стандарте либо использовать для определения видимости другую концепцию.\r\n- Гипотетический атрибут `[[visibility_hidden]]` был бы совместим с концепцией атрибутов, но от него было бы мало пользы и его было бы сложно реализовать на Windows.\r\n\r\nПоймите правильно, мне нравится идея стандартизованного управления видимостью для динамических библиотек. Я просто не вижу как это можно сделать стандартным C++ атрибутом (в том смысле в котором атрибуты сейчас понимаются в стандарте).\r\n\r\n**Олег Ляттэ, 15 декабря 2016, 1:46**\r\nСергей Прейс, если я не ошибаюсь, стандартом С++ видимость символов при динамической линковке никак не регулируется. Атрибут видимости вообще предназначен больше для линковщика, и никак не меняет значение программы с точки зрения языка, а, значит, вполне соответствует общим требованиям к атрибутам.\r\n\r\nОбязанность компилятора - скомпилировать файл с исходником в объектный файл в соответствии со стандартом. При этом компилятор _может_ - отнюдь не обязан - помочь линкеру связать динамические библиотеки (вспомните .def файлы у майкрософта - с их помощью вопрос экспорта символов решается вообще без какого-либо участия компилятора). Поэтому атрибут видимости вполне может игнорироваться компилятором без нарушения формальных требований.\r\n\r\n**Victor Dyachenko, 6 декабря 2016, 15:30**\r\nФича эта очень полезная, но, ради бога, не называйте атрибут \"visible\"!\r\n\r\nВидимость - это очень общее понятие и касается не только символов для динамического связывания. Хотя бы в что-то, вроде \"dl_visible\", переименуйте. В данном случае слепо копировать имя атрибута из GCC - не очень хорошая идея. И уже есть прецеденты, когда, например, `__attribute__((unused))` стал `[[maybe_unused]]`.\r\n\r\n**yndx-antoshkka, 7 декабря 2016, 16:07**\r\nVictor Dyachenko, готов переименовать атрибут, если будет предложено более красивое имя. \"dl_visible\" мне не по душе т.к. \"dl\" - малоизвестное платформозависимое сокращение.\r\n\r\n**Victor Dyachenko, 7 декабря 2016, 22:08**\r\nТермин \"dynamic linking\" как-то привязан к какой-то платформе? Как мне кажется, очень даже общее понятие. Но не суть. Все, что угодно, но не \"visible\"!\r\n\r\n**Victor Dyachenko, 7 декабря 2016, 22:13**\r\nСейчас, фактически только две живые системы: POSIX и Windows.\r\n\r\nPOSIX: `dlopen()`, `dlsym()`\r\nWindows: DLL\r\n\r\nПопробую предложить ещё варианты...\r\n\r\n\r\n**Victor Dyachenko, 7 декабря 2016, 22:15**\r\nА вот, кстати: `[[dlsym]]`. Коротко и по-делу :-)\r\n\r\n**yndx-antoshkka, 9 декабря 2016, 20:08**\r\nVictor Dyachenko, `[[dlsym]]` мне по душе! Название proposal менять нельзя, но вот внутри наверное и правда использую имя `[[dlsym]]`\r\n\r\n**Сергей Тиунов, 9 марта 2017, 20:07**\r\nyndx-antoshkka, как насчет `[[export]]`? не так замысловато, как `[[dlsym]]`.\r\n\r\n\r\n**Victor Dyachenko, 10 марта 2017, 9:31**\r\nСергей Тиунов, перегружено разными смыслами ещё больше чем visible. В частности на текущий момент планируется к использованию для модулей (ключевое слово, а не аттрибут)\r\n\r\n\r\n**Anatoly Scheglov, 27 декабря 2016, 17:23**\r\nНовый атрибут, внесение в стандарт таких понятий \"динамическая библиотека\" - слишком сложно чтобы заменить 13 строк кода (`#if EXPORTING`).\r\nСтандарт и так большой; тулчейны и так поддерживают DLL/SO.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797378634/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797385335", + "html_url": "https://github.com/cpp-ru/ideas/issues/2#issuecomment-797385335", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/2", + "id": 797385335, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzM4NTMzNQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T10:11:26Z", + "updated_at": "2021-03-13T15:03:26Z", + "author_association": "MEMBER", + "body": "**Anatoly Scheglov 27 декабря 2016, 16:28**\r\nДинамический импорт функций по имени - это костыль. Не надо стандартизировать костыли.\r\nДля сравнительно безопасных плагинов нужна стандартизация ABI (в т.ч. манглинга).\r\n\r\n**yndx-antoshkka 23 января 2017, 17:42**\r\nРаспишите пожалуйста подробнее ваше решение. Что именно вы предлагаете вместо подхода Boost.DLL?\r\n\r\n**Ivan Komissarov 10 августа 2018, 20:12**\r\nyndx-antoshkka, я мимокрокодил, но есть мысль, что сделать С++ плагин по аналогии с QPluginLoader[1] гораздо проще, чем стандартизовать загрузку функций. API офк можно придумать любое, но идея в том, чтобы отдавать пользователю с++ объект, а не функцию. Из головы сходу приходит идея возвращать std::unqiue_ptr, но это потребует динамической аллокации, возможно, есть способ лучше. ЗАТО это решит проблему манглинга - из Qt плагина наружу торчит _одна_ си (!) функция, возвращающая объект плагина и её манглинг известен.\r\nЭто предложение немного ортогонально вашему (и может быть реализовано через него), но позволяет скрыть очень много сложностей SOшек и может быт реализовано тупо через LoadLibrary/dlopen. При этом можно тупо забить на загрузку \"сишных\" функций - почти всё можно сделать через плагин.\r\nНо, насколько я знаю, стандарт не любит интерфейсы и наследование:(\r\n[1] http://doc.qt.io/qt-5/qpluginloader.html\r\n\r\n**yndx-antoshkka 13 августа 2018, 16:37**\r\nIvan Komissarov, как вы верно заметили - при таком подходе мы теряем функциональность загрузки плагинов, написанных на старом C++, и плагинов, написанных на других языках программирования. Это кажется очень серьёзным недостатоком.\r\n\r\n**Ivan Komissarov 13 августа 2018, 17:37**\r\nyndx-antoshkka, не теряем, так как нет никаких плагинов \"на с++\", из-за манглинга приходится заворачивать экспортируемые символы в \"extern C\" иначе код загрузки перестаёт быть переносимым. Поправьте, если ошибаюсь. В целом, я только за то, чтобы была встроенная обертка над dlopen/LoadLibrary, но только с поддержкой языка (т.е. манглинга). Иначе мы всё равно тащим кучу легаси в виде чисто-сишного АПИ плагина. ИМХО, не надо пихать в стандарт то, что сделано плохо по историческим причинам. Лучше дайте людям альтернативный инструмент как сделать правильнее\\проще\\удобнее и старые плагины сами отомрут. ИМХО, стандартизация даёт уникальную возможность что-то изменить к лучшему и этим надо пользоваться, а не тащить легаси (пусть оно теплое приятное и всем привычное).\r\n\r\nЯ подумал, что можно в клиентском коде сделать API типа\r\n```cpp\r\nstd::plugin load_plugin(\"name\"); // std::plugin это просто T & или обертка-аналог\r\n```\r\nа в плагине в cpp писать что-то типа\r\n```cpp\r\nstd::export_plugin baz(\"name\"); // объявили переменную\r\n```\r\nчто, по сути, объявляет синглтон\r\nчтобы не ограничиваться одним экспортируемым классом.\r\nТогда можно и функции экспортировать как-то так:\r\n```cpp\r\nint foo(int bar) { return 0; }\r\nstd::export_plugin>(\"foo\", foo);\r\n```\r\nРаботать это будет как-то так - при экспорте плагина кладем его в реестр плагинов, который можно отрезолвить через неманглированный сишный вызов а дальше уже по имени выдирать сами инстансы (надо подумать как это сделать типо-безопасно, можно ли не юзать RTTI, в общем, сделать прототип)\r\n\r\nМой поинт в том, что нет никакого смысла мучаться с QLibrary когда есть QPluginLoader, это стандартное правило 20\\80 - при разработке своего приложения просто пишется плагин с экспортом класса, а оставшиеся случаи - это да, указанные другие языки, сишные плагины/библиотеки (привет, OpenGL) и прочее. И в этих 20% случаев не факт, что загрузка символов - самая трудная часть (и стандартизация оной как-то облегчит жизнь), например для того же OpenGL есть куча версий, это всё надо как-то менеджить, да и миллиард функций удобнее будет обернуть в класс, а не хранить стопицот статик-переменных, в которые записали зарезолвленные указатели на эти функции.\r\n\r\n**yndx-antoshkka 21 августа 2018, 15:29**\r\nДа, так может быть удобнее, но есть проблемы:\r\n\r\n* Дополнительные накладные расходы на хранение строк\r\n\r\n* Дополнительные накладные расходы на поддержку реестра\r\n\r\n* Нет возможности подтягивать готовые С плагины. Я об этом уже писал, но наверное недостаточно подчеркнул необходимость такого функционала. Плагины C - это универсальный интрефейс, который поддерживается всеми языками програмирования. Если не поддерживать загрузку C плагинов, то из C++ приложения нельзя будет подтягивать библиотеки написанные на C/Java/.NET/... и соответственно полезность такого класса в стандарте сходит на нет. Многие проекты просто не могу себе такое позволить - у них уже есть большой набор плагинов и никто их переписывать не будет ЛИБО плагины для проекта разрабатываются сторонними разработчиками, и ограничивать их в выборе инструмента - это терять примущество по сравнению с аналогичными проектами.\r\n\r\nТот функционал что вы предлагаете, можно будет попробовать принять в стандарт отдельным предложением. При этом стоит посмотреть в сторону механизма базовой рантайм рефлексии плагинов https://www.boost.org/doc/libs/1_67_0/doc/html/boost_dll/tutorial.html#boost_dll.tutorial.querying_libraries_for_symbols . С таким подходом несколько меньше накладных расходов, но сохраняется хоть какая-то совместимость с другими языками программирования.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797385335/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797431037", + "html_url": "https://github.com/cpp-ru/ideas/issues/3#issuecomment-797431037", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/3", + "id": 797431037, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzQzMTAzNw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T11:27:58Z", + "updated_at": "2021-03-13T15:05:35Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 22 марта 2017, 11:30**\r\nЛюди уже работают над этим, в этом году надеюсь что будет имплементация в нескольких компиляторах: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4626.pdf\r\n\r\nВы можете помочь в развитии, если попробуете текущий прототип https://github.com/chriskohlhoff/networking-ts-impl и скажете, чего вам в нём не хватает, какие ошибки нашли.\r\n\r\n**h4tred 27 марта 2017, 12:35**\r\nyndx-antoshkka, лично мне, очень бы хотелось иметь оторванное от асинхронности API для более абстрактной работы с сетью. А данный API базируется на Asio и, по сути, прогибается под Windows IOCP, навязывая проактора на тех платформах, на которых его нет, т.е. на всех, кроме Windows (если ошибаюсь - поправьте).\r\n\r\n**yndx-antoshkka 27 марта 2017, 15:55**\r\nh4tred, никто ни под кого не прогибается. Исследуйте пожалуйста внимательно документ http://www.cs.wustl.edu/~schmidt/PDF/proactor.pdf\r\n\r\nСинхронный интерфейс в n4626.pdf так же присутствует.\r\n\r\n**h4tred 28 марта 2017, 8:00**\r\nyndx-antoshkka, детально ещё изучу, но даже беглый просмотр:\r\n> On real-time POSIX platforms, the asynchronous I/O functions are provided by the aio family of APIs [9].\r\n\r\nPosix AIO на том же Linux реализован на User-level в виде пула потоков (про Linux AIO/libaio слышал, но там свои нюансы). Не знаю как покажет себя на больших нагрузках. На macOS вроде только для файлов, не для сокетов. Можно делать эмуляцию поверх epoll, не сложно, но тоже снижает эффективность: вытянутые native_handle() из сокетов Asio, подсунутые в libev + синхронный интерфейс (с nowait) показали куда лучший результат, чем так же логика, полностью реализованная средствами Asio (асинхронный интерфейс). Тестировалось на небольшом HTTP 1.1 сервере. Ещё смутило обилие аллокаций памяти: они случаются на каждый асинхронный вызов (про свои аллокаторы знаю, но это другой вопрос).\r\n\r\nВ любом случае, AIO не используется в Asio, используется дополнительный слой абстракции поверх существующих механизмов. Если грубо: асинхронный интерфейс Asio нативно ложится на Windows IOCP, но требует дополнительных затрат ресурсов и менее эффективен поверх epoll/kqueue и иже с ними. Потом и ляпунул про \"прогиб\". Хотя, ЕМНИП, Крис изначально Asio начинал на Windows писать, это может несколько объяснить выбор интерфейса библиотеки...\r\n\r\nКак минимум, в данной схеме трудно реализовать подход: дождаться события на сокете, пусть будет чтения, запустить обработчик, узнать количество данных (не портируемо, но kqueue эту информацию может передать вместе с эвентом, в Linux - дополнительный сискол), после чего выделить блок памяти нужного размера и за один присест прочитать все данные. Или выделить дополнительный блок памяти и прочитать при помощи readv (не портируемо, но оптимально). Или переиспользовать текущие свободные буфера. В Windows IOCP и Asio ты передаёшь блок памяти сразу в обработчик и если данных больше, чем блок, нужно снова запускать асинхронную операцию. В контексте Asio это ещё и аллокация памяти на вызов. В kqueue ещё можно и чтенеие не делать, если есть ошибка и/или данных ноль - эта информация тоже есть в эвенте.\r\n\r\nИз всего этого плюс ещё немного хочется асбтракции над сокетами, но оторванными от механизма асинхронности, как минимум - меньше кода библиотеки, легче понять, разобраться, быстрее собираться. А средства асинхронной работы с сетью - отдельно и что бы была возможность выбрать оптимальный паттерн.\r\n\r\nPS в этом отношении интерфейс Java NIO мне больше нравится.\r\n\r\n**maksimus1210 3 апреля 2017, 16:45**\r\nДавно пользуюсь библиотеками Qt, на мой субъективный взгляд это лучшее решение для С++ на сегодня, их сокетами пользоваться очень легко, почему бы не взять их за основу.\r\n\r\n**yndx-antoshkka 4 апреля 2017, 15:10**\r\nh4tred, могу сказать что Крис и другие разработчики из WG21 в полной мере осознают какой платформой большинство людей пользуется для написания серверов: \"we talked about the \"ultra-low latency, high throughput\" systems that are typically encountered in the capital markets space and stated that such systems make heavy use of techniques such as coroutines in order to meet their demands. Several of the authors of this paper have extensive experience in that space. One aspect of those systems is that, by far, the most common deployment platform is Linux.\" (цитата из http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0158r0.html)\r\n\r\n> Как минимум, в данной схеме трудно реализовать подход: дождаться события на сокете.\r\n\r\nМне кажется мы расходимся в терминологии. Давайте разберем на примере: у вас 100 сокетов, и сразу произошло 16 событий. Как вы предлагаете их обрабатывать в вашей схеме?\r\n\r\n**h4tred 5 апреля 2017, 3:46**\r\nyndx-antoshkka,\r\n\r\n> Мне кажется мы расходимся в терминологии. Давайте разберем на примере: у вас 100 сокетов, и сразу произошло 16 событий. Как вы предлагаете их обрабатывать в вашей схеме?\r\n\r\nНебольшое допущение: сервер однопоточный и используем epoll.\r\n\r\n0) регистрируем сокеты в epoll при помощи epoll_ctl() (тоже допущение: сокеты уже откуда-то взялись)\r\n1) epoll_wait выходит из ожидания, и возвращает число событий - 16\r\n2) _последовательно_ просматриваются события в структуре events, переданной epoll_wait и запускаются обработчики\r\n3) в обработчике для каждого сокета сделать то, что я описал выше: определение размера, вычитывание всех данных.\r\n\r\nСобственно первый пункт - это и есть \"дождаться события на сокете\".\r\n\r\nВ случае Asio, если заглянуть во внутрь, различия начинаются с 3го пункта:\r\n3) запускается внутренний обработчик (пусть будет чтение из сокета) и читает указанное число байт в указанный пользователем буфер\r\n4) запускается пользовательский обработчик, куда передаётся (по памяти) число реально прочитанных байт и код ошибки.\r\n\r\nТак как буфер мы должны передать до возникновения события, мы реально не можем узнать сколько данных в буфере ядра, и не можем выполнить:\r\n1) переаллокацию буфера под нужный размер (не сильно оптимально)\r\n2) взять ещё один буфер для readv (оптимально, если есть пул буферов)\r\n\r\nи прочитать данные за _один_ системный вызов read/readv.\r\n\r\nЕсли мы не угадали с размером буфера, нам придётся делать ещё одну операцию асинхронного чтения, как я писал выше - плюс аллокация памяти.\r\n\r\nПлюс, при таком подходе трудно реализовать EPOLLET, что помогает, в том числе, снизить количество вызовов epoll_wait() в итоге. Если в текущей схеме мы применим EPOLLET, не дочитаем данные и снова запросим асинхронную операцию - для этого сокета мы уже колбека не дождёмся.\r\n\r\nНу и слово _последовательно_ в пункте 2) я тоже не просто так выделил. Дабы не возникло ощущения, что в Asio заполнение буффера данными будет происходить на уровне ядра и одновременно (или почти). Это верно (насколько хватает моих знаний) только для Windows. В любом случае, в однопоточном сервере, колбеки будут вызываться последовательно.\r\n\r\n**h4tred 5 апреля 2017, 4:01**\r\nyndx-antoshkka, я тут подумал... по сути, мало что мешает в текущей реализации Asio добавить интерфейс для асинхронного чтения (для записи и так буфер передавать нужно), в котором не нужно передавать буфер, а только факт запроса готовности сокета и соответствующий колбек. Правда опять: это не решит проблему с дополнительными аллокациями на запрос.\r\n\r\n**yndx-antoshkka 5 апреля 2017, 12:55**\r\n> Небольшое допущение: сервер однопоточный и используем epoll.\r\n\r\nЭто очень необычные требования, переводящие ваше серверное приложение в разряд экзотических.\r\n\r\nОбычно серверные приложения многопоточны и тогда проактор - идеальная архитектура, которая даёт возможность наиболее быстро, с минимальными задержками и равномерной нагрузкой обрабатывать запросы. Типичный пример - http сервер. Вы как разработчик заинтересованы в том, чтобы как можно скорее обработать запросы с как можно меньшими задержками. Когда пользователь запрашивает страницу, браузер может открыть несколько соединений и запрашивать разные ресурсы - поэтому ситуация, когда у вас сразу 16 событий случается на сервере - норма. Если вы будете обрабатывать каждое событие по пол секунды последовательно, как в акторе - пользователь прождёт 8 секунд и будет недоволен. Если примените проактор и обработаете в 16 потоков - пользователь прождёт пол секунды.\r\n\r\nНО при всё при этом, реализовать на ASIO предложенную вами схему можно, и достаточно просто:\r\n* async_read_some в null_buffers()\r\n* std::size_t bytes_readable = socket.available();\r\n* аллоцируете буферы, или комбинируете их например в boost::array bufs и вызваете sock.read_some(bufs); который прочтёт их за один системный вызов readv\r\n\r\nЕсть даже пример в оффициальной документации: http://www.boost.org/doc/libs/1_63_0/doc/html/boost_asio.html#boost_asio.overview.core.reactor\r\n\r\nP.S.: Подобный подход c null_buffers() (но многопоточный) я давным давно использовал для асинхронной работы с PostgreSQL: оправлял запрос, получал нативный сокет соединённый с базой данных, ждал когда появится нужноe количество байт ответа (асинхронно читал в null_buffers()) , после чего из сокета читал через API Postgres.\r\n\r\n**h4tred 7 апреля 2017, 8:33**\r\nyndx-antoshkka,\r\n> Это очень необычные требования, переводящие ваше серверное приложение в разряд экзотических.\r\n\r\nЭто допущение. Всё это примерно одинаково делается и в несколько потоков (обычно по числу ядер). Зачем усложнять объяснение?\r\n\r\n> Если вы будете обрабатывать каждое событие по пол секунды последовательно, как в акторе - пользователь прождёт 8 секунд и будет недоволен. Если примените проактор и обработаете в 16 потоков - пользователь прождёт пол секунды.\r\n\r\nТак, опять про разные вещи говорим. Проактор в однопоточном режиме будет так же выполнять запросы последовательно. Ровно как актор вполне может их обслуживать в несколько потоков. Повторюсь, в Asio на Linux используется epoll, который актор по своей природе.\r\n\r\n> НО при всё при этом, реализовать на ASIO предложенную вами схему можно, и достаточно просто:\r\n\r\nА вот этот момент я как-то упустил. Спасибо. Нужно будет погонять на пробном сервере (http, http_parser от nginx). На данный момент по числу RPS такой расклад был (сервер - многопоточный):\r\n1) libev (C++ интерфейс) + нативные сокеты - самый быстрый, получилось около 540k RPS при 4х потоках сервера, 4 потоках клиента и 100 единовременных подключений. На 10k - около 300k.\r\n2) libev + Asio абстракция и вытащенные native_handler - немногим хуже предыдущего пункта, но удобнее в плане абстракций над сокетами. При условиях выше показывал где-то на 50k запросов меньше.\r\n3) Asio (я standalone использовал) - в базовой реализации вообще сдулся (10-20k запросов), после включения трюка с TCP_NODELAY ретировался, но показал себя где-то раза в два медленнее.\r\n\r\nПонятно, что выкладки выше - вода без конкретных цифирь, но сейчас их найти не могу (точнее остались несуразные выкладки для разных условий тестирования). Плюс запускалось на localhost, а не в реальной сети. Попробую перепроверить в ближайшее время, тем более, что повод появился:\r\n> Есть даже пример в оффициальной документации: boost.org/doc/libs/1_63_0/doc/html/boost_asio.html#boost_asio.overview.core.reactor\r\n\r\nТак что пока у меня остаётся только претензия на аллокации памяти при каждом асинхронном запросе.\r\n\r\n**yndx-antoshkka 7 апреля 2017, 13:33**\r\nh4tred,\r\n\r\n> 3) Asio (я standalone использовал) - в базовой реализации вообще сдулся (10-20k запросов), после включения трюка с TCP_NODELAY ретировался, но показал себя где-то раза в два медленнее.\r\n\r\nСкорее всего у вас есть класс, который отвечает за работу с установленным соединением и содержит сокет. Добавьте в этот класс небольшой массив slab и перенаправляйте все аллокации в этот класс, чтобы он аллоцировал из slab если может. Держите пул инстансов, чтобы устанавливать соединения быстрее. При таком подходе производительность возрастёт где-то на порядок или на два.\r\n\r\nP.S.: будет очень круто, если кто-то напишет статью на Хабр о том, как выкрутить производительность ASIO на максимум. Если понадобится помощь - пишите.\r\n\r\n**Marat Abrarov 27 февраля 2019, 18:47**\r\nyndx-antoshkka,\r\n\r\n> будет очень круто, если кто-то напишет статью на Хабр о том, как выкрутить производительность ASIO на максимум. Если понадобится помощь - пишите.\r\n\r\nЕсть [Million RPS Battle](https://github.com/virtan/mrps) и есть идеи того, что в теории можно рекомендовать при использовании Asio на *nix и на Windows (например, как соотносится [Why does one NGINX worker take all the load?](https://blog.cloudflare.com/the-sad-state-of-linux-socket-balancing/) с Asio). К сожалению, нет железа (включая быструю сеть), где можно было бы проверить, что из теории действительно работает, а что можно опустить в угоду более простому коду.\r\n\r\nПонятно, что \"заточенное\" решение на том же C & epoll \"уделает\" Asio, отягощенную некоторыми абстракциями и необходимостью обеспечивать гарантии, которые эти самые абстракции предполагают (для удобства пользователей Asio – за удобство рано или поздно приходится платить).\r\n\r\nНепонятно, насколько большой overhead дает Asio (по сравнению с C & epoll) – стоит ли он этих самых удобств (относительная кроссплатформенность)?\r\n\r\nНасколько я помню список рассылки Asio и release notes – кажется, что автор пытался улучшить производительность Asio на Linux и уменьшил кол-во мест, где используются блокировки. Рецепт io_service with BOOST_ASIO_CONCURRENCY_HINT_UNSAFE_IO + io_service instance per worker thread должен работать. Где бы проверить…\r\n\r\n**yndx-antoshkka 27 февраля 2019, 20:06**\r\n> Есть [Million RPS Battle](https://github.com/virtan/mrps)\r\n\r\nТам, как и в подавляющем количестве примеров в интеренете, не оптимальная работа с ASIO: [в этот класс](https://github.com/virtan/mrps/blob/7608f58fe39f87a21787cfeaffa5340f1b12ce6a/c%2B%2B-virtan/server.cc#L13) надо добавить slab аллокатор и использовать его в асинхронных методах; надо нормально настраивать сокеты (например добавить no_delay(true) при первом получении сокета), да и плюс там UB при использовании acceptor.\r\n\r\n**Marat Abrarov 13 марта 2019, 2:56**\r\n> надо добавить slab аллокатор\r\n\r\nВо-первых, непонятно, как это поможет производительности на практике (тот же Yandex использует что-то вроде tcmalloc и ему хватает производительности... хотя там это вызвано характером нагрузки и trade-off между сложностью и теоретической эффективностью).\r\n\r\nВо-вторых, есть https://github.com/virtan/mrps/pull/3 (что там не так с acceptor? можно и это поправить) и мои локальные тесты не показывают выигрыша больше погрешности, когда используется Asio custom memory allocation (в собственным [ma_echo_server](https://github.com/mabrarov/asio_samples/tree/master/examples/ma_echo_server) я реализовал еще и параллельные чтение и запись, но и это не помогло в моих локальных тестах). Думаю, можно еще преаалоцировать сокеты для входящих соединений, хотя я уже выключил mutex на io_service (за счет concurrency hint), который используется для per-io_service-socket-implementation-registry, так что overhead от Asio уже сведен почти на нет.\r\n\r\nНасчет TCP_NODELAY на стороне сервера - эта опция включена на стороне тестового клиента (один для всех тестов и написан тоже на Asio), а на стороне сервера, даже в конкурирующих решениях эта опция вроде как не включается (явно). Значит, \"нечестно\" включать TCP_NODELAY и в сервере на Asio (c++-virtan)\r\n\r\n**yndx-antoshkka 13 марта 2019, 11:16**\r\n>> надо добавить slab аллокатор\r\n\r\n> Во-первых, непонятно, как это поможет производительности на практике\r\n\r\nНа старом glibc это ускоряло сервер приблизительно в три раза.\r\n\r\n> Во-вторых, есть https://github.com/virtan/mrps/pull/3\r\n\r\nСупер! Что с производительностью, по сравнению с epoll / libev ?\r\n\r\n**Marat Abrarov 13 марта 2019, 13:44**\r\n> На старом glibc это ускоряло сервер приблизительно в три раза.\r\n\r\nВот [тут](https://asio-samples.blogspot.com/2011/06/design-journeys-with-asio.html) (см. комментарии) пишут о \"в 2,5 раза\" при Ubuntu-11.04/AMD Phenom 9650/4096Gb/gcc-4.5.2/boost-1.47.0 и \"при полностью съеденных 4ех ядрах\"\r\n\r\n> Что с производительностью, по сравнению с epoll / libev ?\r\n\r\nЕще не дошел до такого сравнения, но тот же c++-virtan, что до pull request, что после показывает приблизительно одинаковые результаты. Разница в пределах погрешности. Полагаю, что мои условия тестирования - VMware Workstation на Windows 10 + Docker + запуск и клиента, и сервера на одном и том же железе - не позволяют \"раскрыться\" тестируемому образцу.\r\n\r\nP.S. Что-то не приходят уведомления, хотя я подписан на комментарии. Не сигнал ли это о том, что пора перевести данную дискуссию в другой формат и на другую площадку (GitHub, email)? Хотя бы до появления результатов (\"кто-то напишет статью на Хабр о том, как выкрутить производительность ASIO на максимум\")\r\n\r\n**Hare76 22 ноября 2017, 22:41**\r\nПолностью поддерживаю идею, что хотелось бы иметь классы для работы с сетью. Но если в них будет навязана асинхронность из буста, то лично мое мнение, что это будет только очередным камнем в огород очередного стандарта C++. Зачем смешивать одно с другим? Нет необходимости выходить на какие-то непонятные высокие уровни абстракции. Программирование на С++ как раз подразумевает более глубокое знание предмета и умение его использовать. Попытку переписать сервер с epoll на asio я очень быстро прекратил. Я сам, при необходимости, сделаю где нужно асинхронный код или распаралелю его по потокам (с пулом или без) и буду знать как он работает. Например, те же потоки в С++11 (threads) сделаны очень просто и сердито - по-спартански. Нет ничего лишнего. Многое вынесено в отдельные классы, другое выкинуто в принципе. И в итоге получилось, на мой взгляд, то, что нужно.\r\n\r\nНу а что касается того момента, что в asio идет \"прогиб\" под IOCP - не соглашусь. Используя IOCP можно написать код практически идентичный в своей парадигме epoll. Сам подход у них очень идентичен по своей сути. Но вот если к IOCP начинать лепить дополнительно асинхронное winapi - вот здесь уже и получается каша, которая не нужна в стандарте.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797431037/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797432738", + "html_url": "https://github.com/cpp-ru/ideas/issues/4#issuecomment-797432738", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/4", + "id": 797432738, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzQzMjczOA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T11:31:12Z", + "updated_at": "2021-03-13T15:05:42Z", + "author_association": "MEMBER", + "body": "**Alexey Kreschuk 31 мая 2019, 19:36**\r\nЭто предложение помогает и в обучении. Можно будет отложить обьяснение C string и C array с первого урока до более поздних.\r\n\r\n**Александр Коганов 3 июня 2019, 14:56**\r\nПричем это никак не должно повлиять на существующий код, можно поддерживать сразу оба варианта\r\n\r\n**Сергей Рыбин 1 декабря 2019, 18:54**\r\nenv бывает ещё 3м аргументом.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797432738/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797440806", + "html_url": "https://github.com/cpp-ru/ideas/issues/5#issuecomment-797440806", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/5", + "id": 797440806, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzQ0MDgwNg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T11:48:07Z", + "updated_at": "2021-03-13T15:05:54Z", + "author_association": "MEMBER", + "body": "**Виктор Губин 14 июня 2018, 13:07**\r\nТ.е. - смержить regexp (бывший boost regexp) и boost xpressive, или заменить реализацию на xpressive с портированием на С++ 20 без MPL, или заставить компилятор генерировать код конечного автомата на этапе компиляции наподобие Bison или Antlr только сразу в машинных кодах? У xpressive и Spirit есть существенные недостатки - очень внушительное время компиляции, сложность определения ошибки в регулярном выражении и т.п. (ко всему нельзя отключить исключения и RTTI, т.е. Проблемы для embedded/device drivers/kernel development и т.п.)\r\n\r\n**yndx-antoshkka 14 июня 2018, 18:13**\r\nВиктор Губин, да, заставить компилятор генерировать код конечного автомата в машинных кодах на этапе компиляции. При этом бинарная совместимость и все имеющиеся интерфесы [boost|std]::regex останутся старыми.\r\n\r\n**Evgeny Basargin 18 июля 2018, 17:57**\r\nи литерал до кучи std::literals::regex_literals::operator\"\"r", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797440806/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797442209", + "html_url": "https://github.com/cpp-ru/ideas/issues/6#issuecomment-797442209", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/6", + "id": 797442209, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzQ0MjIwOQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T11:51:13Z", + "updated_at": "2021-03-13T15:06:04Z", + "author_association": "MEMBER", + "body": "**webreh 18 сентября 2017, 17:54**\r\nСовершенно не очевидно, должно ли быть сообщение правой части инстанцировано при выполнении условия, как должно проверяться и что должно происходить, если инстанцирование сообщения об ошибке приводит к провалу или новому сообщению об ошибке\r\n\r\n**smertigdon 28 ноября 2017, 10:53**\r\nwebreh, вопрос хороший, но проблем особых не вижу. На данный момент инстанцирование чего-либо в compile-time **не должно** иметь побочных эффектов. Все хаки, опирающиеся на факт инстанцирования - дефекты стандарта (привет, friend+loophole). Я к тому, что выбор между инстанцированием правой части всегда или только при срабатывании assert'а - это лишь вопрос вкуса, на который нужно один раз ответить.\r\nЛично я пока не вижу причин против инстанцирования только при срабатывании. Пытаемся инстанцировать правую часть - ну отлично. Возникла ошибка при инстанцировании? Прерываем. В чём отличие от рекурсивного инстанцирования шаблонов?\r\n\r\nАлгоритм элементарный:\r\n1. Что-нибудь инстанцируем, наткнулись на static_assert*\r\n1. Если первый аргумент static_assert'а вычислился с результатом true, goto 4. Иначе, вычисляем второй аргумент.\r\n1. Пытаемся вычислить второй аргумент static_assert'а. Если в процессе попадём на static_assert, goto 0.\r\n1. Выводим в консоль вычисленную строку и прерываем компиляцию.\r\n1. Продолжаем вычисления/компиляцию\r\n\r\nДа, можно зациклиться. Впрочем, template-depth тоже придуман не просто так :)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797442209/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797460457", + "html_url": "https://github.com/cpp-ru/ideas/issues/7#issuecomment-797460457", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/7", + "id": 797460457, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzQ2MDQ1Nw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T12:28:33Z", + "updated_at": "2021-03-13T15:06:10Z", + "author_association": "MEMBER", + "body": "**BlackMat MATov 5 марта, 16:56**\r\nC++ не умеет преобразовывать float -> int через union.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797460457/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797461335", + "html_url": "https://github.com/cpp-ru/ideas/issues/8#issuecomment-797461335", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/8", + "id": 797461335, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzQ2MTMzNQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T12:30:28Z", + "updated_at": "2021-03-13T15:06:16Z", + "author_association": "MEMBER", + "body": "**Antervis 1 марта, 12:27**\r\nа для чего?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797461335/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797467080", + "html_url": "https://github.com/cpp-ru/ideas/issues/9#issuecomment-797467080", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/9", + "id": 797467080, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzQ2NzA4MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T12:43:35Z", + "updated_at": "2021-04-02T18:25:52Z", + "author_association": "MEMBER", + "body": "**ilnurkh, 1 декабря 2016, 23:00**\r\nдавайте сразу под флаг компилятора: попытка напечатать трейс в `stderr` при `terminate`/`abort` и т.д.\r\n\r\n**yndx-antoshkka, 2 декабря 2016, 13:14**\r\nilnur.khuziev, скорее всего так и получится в конечном итоге. В стандарте нельзя прописывать флаги компилятора, но разработчики компилятора, как мне кажется, проявят инициативу.\r\n\r\n**konyuchenko.nikita, 2 декабря 2016, 4:45**\r\nВообще говря, в стандарте нет понятия стека как такового и не оговорено, что он вообще может и должен существовать. Есть понятие stack unwinding, которое относится скорее к процессу вызова деструкторов.\r\nЕще вопрос - какой ожидаемый вывод при оптимизациях? Такой же как, например, `libunwind`, получаемый проходом по стеку и попыткой определить что определенный адрес мог быть адресом возврата, или же подразумевается дополнительная работа компилятора по подготовке метаданных? С оптимизацией хвостовых рекурсий что делать?\r\n\r\n**yndx-antoshkka, 2 декабря 2016, 13:24**\r\nkonyuchenko.nikita, в стандарте придётся сурово пожонглировать словами, чтобы описать stacktrace. Сложно, но можно.\r\n\r\nКомпилятор метаданные подготавливать не должен, все данные есть в дебажной секции бинарника и в таблицах экспортов. Стектрейс будет показываться и для оптимизированного кода. В случае с оптимизацией хвостовой рекурсии, часть вызовов может убраться из стектрейса, но строчка, где конструировался стектрейс будет показываться верно... Другими словами - 1 в 1 поведение gdb bt\r\n\r\n**Сергей Прейс, 2 декабря 2016, 13:24**\r\nkonyuchenko.nikita, Полностью согласен. Кроме того, никак не стандартизовано как стек связан с именами функций, так что не ясно как специфицировать что именно должен печатать этот класс.\r\n\r\n**Сергей Прейс, 2 декабря 2016, 13:26**\r\nyndx-antoshkka, понятия дебажной таблицы нет в C++ стандарте равно как и таблицы экспортов. Это всё регулируется ABI конкретной платформы и может принципиально отсутствовать.\r\n\r\n**Ilia, 5 декабря 2016, 20:28**\r\nПохоже стоит различать символизацию и получение stacktrace, как это делает POSIX и WinAPI.\r\nСимволизировать стек гораздо дольше, чем получить набор указателей на фреймы/функции.\r\n\r\n**yndx-antoshkka, 7 декабря 2016, 16:08**\r\nudalovilia, в прототипе эти понятия разнесены и выполняются независимо друг от друга.\r\n\r\n**Anatoly Scheglov, 27 декабря 2016, 17:39**\r\nНет и не нужно. Вывод стектрейса - это не то, что каждый разработчик пишет каждый день.\r\nДля случаев когда это надо, есть готовые библиотеки (в т.ч. системные).\r\n\r\n**yndx-antoshkka, 31 марта 2017, 12:10**\r\nAnatoly Scheglov, покажите мне пожалуйста эти библиотеки\r\n\r\n**iloskutov, 22 апреля 2017, 13:02**\r\nУже есть, например, Boost.Stacktrace, поддерживающий несколько бэкендов. Если с его функциональностью что-то не так — окей, можно засабмитить им Issue, но стандарт-то тут при чём?\r\n\r\nКак уже заметили, стандарт не определяет ни понятия стека, ни стектрейса, а компиляторы охотно инлайнят функции и оптимизируют хвостовую рекурсию, так что гарантий про такой стектрейс нельзя дать практически никаких. Чтобы это могло стать частью стандарта, надо переписать значительную его часть в терминах стека и дать в нём ряд гарантий, ограничивающих оптимизатор (и, как следствие, его эффективность).\r\n\r\n**yndx-antoshkka, 24 апреля 2017, 11:10**\r\niloskutov, Boost.Stacktrace я писал в качестве прототипа для принятия в стандарт C++. И на главной страницу Boost во втором параграфе прям написано - \"Задача Boost - создавать reference implementations для принятия в стандарт С++\"\r\n\r\nПользуясь вашей логикой, из стандарта надо убрать `std::thread`, `std::shared_ptr`, `std::unique_ptr`, `std::atomic`, `std::string_view`, `std::variant`. Ведь они же уже реализованы в сторонних библиотеках, а до 2011 года стандарт вообще не говорил про многопоточность :)\r\n\r\nИ да, если Boost.Stacktrace не накладывает ограничений на оптимизатор, то чего ради должен накладывать ограничения stacktrace из стандартной библиотеки?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797467080/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797468949", + "html_url": "https://github.com/cpp-ru/ideas/issues/9#issuecomment-797468949", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/9", + "id": 797468949, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzQ2ODk0OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T12:47:45Z", + "updated_at": "2021-03-12T12:47:45Z", + "author_association": "MEMBER", + "body": "Наше предложение на `std::stracktrace` https://wg21.link/P0881 стало частью стандарта C++23 http://eel.is/c++draft/stacktrace", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797468949/reactions", + "total_count": 1, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 1, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797474674", + "html_url": "https://github.com/cpp-ru/ideas/issues/10#issuecomment-797474674", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/10", + "id": 797474674, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzQ3NDY3NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T12:59:45Z", + "updated_at": "2021-03-12T12:59:45Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 1 декабря 2016, 19:34**\r\nМне нравится идея, но насколько я знаю, подобные предложения раньше отклонялись (я разведаю, по какой причине).\r\n\r\nА не хотите попробовать расширить вашу идею? Посмотрите например на библиотеку Boost.Process http://klemens-morgenstern.github.io/process/boost_process/tutorial.html#boost_process.tutorial.io Для этой библиотеки неправильно будет выставлять неуказанные параметры в дефолтное значение. Необходим какой-то механизм, чтобы точно понимать, какие параметры были указаны, а какие - нет.\r\n\r\n\r\n**Anatoly Scheglov, 27 декабря 2016, 17:32**\r\nИмя параметра - не часть сигнатуры. В разных файлах могут быть разные имена параметров.\r\n\r\nВ Python это фича полезна т.к. такие аргументы передаются как словарь.\r\n\r\n**yndx-antoshkka, 16 марта 2017, 15:48**\r\nЯ поискал прошлые обсуждения подобных предложений, и все они заканчивались плачевно. Слишком много проблем возникает, решение части этих проблем подымает новые проблемы и ломает пользовательский код. Против последнего подобного предложения проголосовали с ОЧЕНЬ большим перевесом.\r\n\r\nВот некоторые неразрешимые технические проблемы, которые возникают при добавлении именованных параметров функций:\r\n* forward declarationы могут иметь имена параметров отличные от definition функции\r\n* не работает с variadic template\r\n* изменение имени параметра функции начнёт ломать пользовательский код\r\n* это сильно усложнит и без того переусложнённое правило поиска верной перегрузки функции\r\n\r\n\r\nОднако в обсуждениях именно говорили про параметры функций. Можно попробовать вместо этого написать proposal на инициализацию агрегатов с указанием имён полей:\r\n```\r\npoint_2d_t{ int x; int y; };\r\npoint_3d_t : public point2d_t { int z; };\r\n\r\npoint_2d_t p1 {.x = 10, .y=42 };\r\npoint_3d_t p2 {.z = 777, .x = 10, .y=42 };\r\n```\r\n\r\n**borisbn, 21 апреля 2017, 18:13**\r\n> proposal на инициализацию агрегатов с указанием имён полей\r\nТ.е. вернуть то, что выкинули из Си, когда делали Си++ ? ;)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797474674/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797477467", + "html_url": "https://github.com/cpp-ru/ideas/issues/10#issuecomment-797477467", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/10", + "id": 797477467, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzQ3NzQ2Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T13:05:03Z", + "updated_at": "2021-03-12T13:05:03Z", + "author_association": "MEMBER", + "body": "К идее вернулся человек из международного комитета, обсуждение можно почитать здесь https://lists.isocpp.org/std-proposals/2020/06/1467.php\r\n\r\nМожем помочь советом или подкинуть идей, предложение сейчас на ранней стадии", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797477467/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797495412", + "html_url": "https://github.com/cpp-ru/ideas/issues/11#issuecomment-797495412", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/11", + "id": 797495412, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzQ5NTQxMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T13:38:00Z", + "updated_at": "2021-03-12T13:38:12Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 1 декабря 2016, 20:03**\r\nМне нравится jsoncpp, можно взять его за основу. Но придется исправить множество вещей. Вот что сразу бросилось в глаза:\r\n* никаких сырых указателей, вместо них - ссылки и `std::string_view`\r\n* нужно поддержать паттерн visitor\r\n* нужно поддержать rvalue references и `std::initializer_list`\r\n\r\n\r\n**none, 2 декабря 2016, 0:08**\r\nyndx-antoshkka, почему не бинарный джейсон, ксмель, протобуф? ну и аргумент \"хочется\" не самый мощный.\r\n\r\n**yndx-antoshkka, 2 декабря 2016, 13:27**\r\npavard, надо с чего-то начинать :) JSON весьма популярен, прост и не так ужасен как XML\r\n\r\n\r\n**none, 2 декабря 2016, 17:33**\r\nyndx-antoshkka, почему надо начинать это втягивать? стихия джейсона - веб, плюсы - для веба редко используются. более того вне веба ( ну и ряда бд, которые упрощают жизнь веб-разработчикам, поддержав джейсон ) джейсон вообще нигде не встречается.\r\nтобишь к чему это метафорой объясню - если ты одер розовые очки, это не значит что весь мир стал розовым - это значит твое восприятие такое.\r\n\r\n**yndx-antoshkka, 7 декабря 2016, 20:13**\r\npavard, json можно использовать везде где используют xml (например для конфигурационных файлов, отладки, описания интерфейсов). При этом json более компактен и прост в чтении.\r\n\r\n**pavelandreevith, 2 декабря 2016, 9:48**\r\nМне кажется лучшим кандидатом вот этот:\r\nhttps://github.com/nlohmann/json\r\n\r\nВся библиотека сделана \"по канонам\" С++. Утверждается, что там низкий оверхед. Огромное покрытие тестами, проверка на утечки памяти, интуитивный и очень удобный синтаксис и отличная документация. Бонусом json patch.\r\n\r\n\r\n**yndx-antoshkka, 2 декабря 2016, 13:25**\r\npavelandreevith, спасибо! Посмотрю в скором времени.\r\n\r\n**Андрей Урусов, 16 декабря 2016, 11:59**\r\npavelandreevith, спасибо, выглядит инересным\r\n\r\n**earlnsk, 21 марта 2017, 22:17**\r\nyndx-antoshkka, в описании nlohmann/json есть ссылка тесты производительности json библиотек для C++: https://github.com/miloyip/nativejson-benchmark#parsing-time\r\n\r\nОказывается там уже порядка 40 библиотек.\r\n\r\n**Victor Dyachenko, 6 декабря 2016, 15:39**\r\nВот это погибче и производительнее, чем jsonccp будет: http://rapidjson.org/\r\n\r\n**Anatoly Scheglov, 27 декабря 2016, 18:42**\r\nДождитесь статической рефлексии (интроспекции).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797495412/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797500226", + "html_url": "https://github.com/cpp-ru/ideas/issues/12#issuecomment-797500226", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/12", + "id": 797500226, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzUwMDIyNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T13:47:04Z", + "updated_at": "2021-03-12T13:47:42Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 2 декабря 2016, 13:03**\r\nВ C++17 хотели добавить `std::byte_t`. Финальное голосование предложение не прошло, люди захотели другое имя (`std::storage_byte_t`?).\r\n\r\nТо есть идея уже почти в стандарте, делать ничего не надо. Пару заседаний люди поиграются с именем типа и возможно даже получится включить `std::byte_t` в C++17.\r\n\r\n**y.belykhav. 2 декабря 2016, 15:47**\r\nЖаль что `std::` а не просто `byte` как `int` (((\r\n\r\n**yndx-antoshkka, 3 декабря 2016, 21:55**\r\ny.belykhav, просто `byte` ломает пользовательский код. Мы нашли множество примеров использования `typedef unsigned char byte;` Поэтому в `std::` и ещё подумают над именем.\r\n\r\n`std::byte` не имеет арифметических операций, что многих тоже смущает. Комитет ищет имя, которое бы отражало такое поведение.\r\n\r\n\r\n**y.belykhav, 8 декабря 2016, 15:30**\r\nyndx-antoshkka, Странно почему при выборе зарезервированного слова стандарт языка должен опираться на код людей. Язык должен жить независимо от кода. Да и наконец таки пусть сделают тогда рефакторинг. Ведь это была \"заплатка\" в связи с отсутствием возможности!\r\n\r\n**yndx-antoshkka, 13 декабря 2016, 15:09**\r\ny.belykhav, если новые стандарты будут ломать ранее работавший валидный код, то новыми стандартами серьёзные люди и компании пользоваться не будут. А потом и языком пользоваться перестанут.\r\n\r\n**Игорь Савенков, 11 марта 2019, 7:49**\r\nyndx-antoshkka,\r\nС другой стороны языком могут перестать пользоваться потому что новички вместо того чтобы написать простое и очевидное `byte` будут путаться в `std::storage_byte_t`, `std::size_t`, `std::some_other_strange_name_in_snake_case`.\r\nСерьезно, такие простые типы не должны находиться за префиксом, который длинней их собственного названия. Рефакторинг бывает болезненным, да, но это не значит, что его не нужно делать.\r\n\r\nЯ очень благодарен вам за вашу работу в комитете, серьезно. Но иногда меня пугает, что к обратной совместимости относятся так, будто это какое то священное животное\r\n\r\n\r\n**Алина Лебедева, 25 июля 2019, 15:03**\r\nyndx-antoshkka, А почему разработчики не могут добавить библиотеку для типа `byte`? То есть, если некоторые проекты могут перестать работать из-за использования `unsigned char` в качестве замены `byte`, можно добавить библиотеку, содержащую настоящий `byte`.\r\n\r\nВ старых проектах новая библиотека никаким образом не появится, а если человек захочет воспользоваться не костыльным байтом, он просто впишет в начало кода #include и будет пользоваться именно числовым типом данных.\r\n\r\nСтарые проекты в порядке, а будущие проекты будут без этого костыля.\r\n\r\n\r\n**Anatoly Scheglov, 27 декабря 2016, 17:37**\r\nНе нужно. Все разработчики и так знают что [signed/unsigned] char имеет размер 1 байт.\r\n\r\n> Для представления байтовых значений используется тип unsigned char.\r\n\r\nА еще char, а еще `std::uint8_t`.\r\n\r\n**y.belykhav, 14 января 2017, 23:23**\r\nAnatoly Scheglov, Согласен, вы показали свои глубокие знания особенно\r\n\r\n>А еще char, а еще std::uint8_t . \r\n\r\nНо проще же `BYTE`, вместо всего этого. Зря вы против такой простой вещи как `BYTE`. То что все как-то это обыгрывают, и настроили своих велосипедов, создав при этом проблему и аргумент \"просто byte ломает пользовательский код\" и есть доказательство проблемы. Я бы назвал отсутствие базового типа (именно базового а не std) как старая добрая всем известная проблема, что Вы и подтверждаете \"Все разработчики и так знают что [signed/unsigned] char имеет размер 1 байт.(BYTE)\" А то что Комитет пытается все запихнуть в std НЕ ЕСТЬ РАЗВИТИЕ ЯЗЫКА - а ЕСТЬ РАЗВИТИЕ STD\r\n\r\n\r\n**yndx-antoshkka, 14 февраля 2017, 17:02**\r\nProposal на `std::byte` http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0583r0.pdf\r\n\r\nЕсть все шансы, что будет в C++17\r\n\r\n**yndx-antoshkka, 9 марта 2017, 13:46**\r\nПриняли в С++17 с именем `std::byte`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797500226/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797503008", + "html_url": "https://github.com/cpp-ru/ideas/issues/13#issuecomment-797503008", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/13", + "id": 797503008, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzUwMzAwOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T13:52:04Z", + "updated_at": "2021-03-12T13:52:04Z", + "author_association": "MEMBER", + "body": "**maxf1312, 7 декабря 2016, 10:22**\r\nПоддерживаю. Этого часто не хватает, поскольку часто удобнее описывать строки форматов отдельно и иметь возможность параметризации форматов для вызова семейства `printf()`, чем городить жесткий код для настройки формата вывода в поток.\r\n\r\n**support@a-vz.spb.ru, 8 декабря 2016, 12:09**\r\nИ лучше `sprintf`, а также `sscanf`\r\n\r\n**Sir-VestniK, 12 декабря 2016, 7:08**\r\nОдним из немаловажных аргументов в пользу вывода через подстановку значений в шаблон сообщения можно использовать полную непригодность `std::ostream` подхода для локализации. В то время как printf-подобный подход очень даже переводо-пригоден. При этом важно, чтобы порядок вывода аргументов подставляемых в шаблон был управляемым.\r\n\r\n**Андрей Урусов, 16 декабря 2016, 11:57**\r\na-la `boost::format` или важно сохранить синтаксис `printf` ?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797503008/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797507685", + "html_url": "https://github.com/cpp-ru/ideas/issues/13#issuecomment-797507685", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/13", + "id": 797507685, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzUwNzY4NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T14:00:20Z", + "updated_at": "2021-03-12T14:00:20Z", + "author_association": "MEMBER", + "body": "Принято в C++20 http://eel.is/c++draft/format", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797507685/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797524997", + "html_url": "https://github.com/cpp-ru/ideas/issues/10#issuecomment-797524997", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/10", + "id": 797524997, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzUyNDk5Nw==", + "user": { + "login": "zamazan4ik", + "id": 7355383, + "node_id": "MDQ6VXNlcjczNTUzODM=", + "avatar_url": "https://avatars.githubusercontent.com/u/7355383?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/zamazan4ik", + "html_url": "https://github.com/zamazan4ik", + "followers_url": "https://api.github.com/users/zamazan4ik/followers", + "following_url": "https://api.github.com/users/zamazan4ik/following{/other_user}", + "gists_url": "https://api.github.com/users/zamazan4ik/gists{/gist_id}", + "starred_url": "https://api.github.com/users/zamazan4ik/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/zamazan4ik/subscriptions", + "organizations_url": "https://api.github.com/users/zamazan4ik/orgs", + "repos_url": "https://api.github.com/users/zamazan4ik/repos", + "events_url": "https://api.github.com/users/zamazan4ik/events{/privacy}", + "received_events_url": "https://api.github.com/users/zamazan4ik/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T14:30:06Z", + "updated_at": "2021-03-12T14:30:06Z", + "author_association": "NONE", + "body": "Возможно какие-то идеи можно тут почерпнуть: https://internals.rust-lang.org/t/pre-rfc-named-arguments/3831/196", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797524997/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797526171", + "html_url": "https://github.com/cpp-ru/ideas/issues/5#issuecomment-797526171", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/5", + "id": 797526171, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzUyNjE3MQ==", + "user": { + "login": "zamazan4ik", + "id": 7355383, + "node_id": "MDQ6VXNlcjczNTUzODM=", + "avatar_url": "https://avatars.githubusercontent.com/u/7355383?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/zamazan4ik", + "html_url": "https://github.com/zamazan4ik", + "followers_url": "https://api.github.com/users/zamazan4ik/followers", + "following_url": "https://api.github.com/users/zamazan4ik/following{/other_user}", + "gists_url": "https://api.github.com/users/zamazan4ik/gists{/gist_id}", + "starred_url": "https://api.github.com/users/zamazan4ik/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/zamazan4ik/subscriptions", + "organizations_url": "https://api.github.com/users/zamazan4ik/orgs", + "repos_url": "https://api.github.com/users/zamazan4ik/repos", + "events_url": "https://api.github.com/users/zamazan4ik/events{/privacy}", + "received_events_url": "https://api.github.com/users/zamazan4ik/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T14:31:46Z", + "updated_at": "2021-03-12T14:31:46Z", + "author_association": "NONE", + "body": "А Хана Дусикова этим вопросом ещё не занимается?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797526171/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797547822", + "html_url": "https://github.com/cpp-ru/ideas/issues/14#issuecomment-797547822", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/14", + "id": 797547822, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzU0NzgyMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T15:05:33Z", + "updated_at": "2021-03-12T15:05:33Z", + "author_association": "MEMBER", + "body": "**Олег Ляттэ, 6 декабря 2016, 1:25**\r\nНа мой взгляд Boost.MultiIndex - более комплексное решение (хоть и выглядит довольно громоздко).\r\n\r\n**Anatoly Scheglov, 27 декабря 2016, 18:43**\r\nВ бусте много библиотек на многие *редкие* случаи. Но это не повод тащить это всё в стандарт.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797547822/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797548769", + "html_url": "https://github.com/cpp-ru/ideas/issues/16#issuecomment-797548769", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/16", + "id": 797548769, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzU0ODc2OQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T15:07:06Z", + "updated_at": "2021-03-13T15:06:29Z", + "author_association": "MEMBER", + "body": "**Antervis 1 марта, 13:24**\r\nпо поводу четвертого пункта: Для стандартных упорядоченных контейнеров std::less имеет is_transparent, то есть map/set по умолчанию поддерживают гетерогенный поиск. Стандартные unordered_ контейнеры тоже поддерживают гетерогенный поиск, но стандартные std::hash не имеют is_transparent, то есть для гетерогенного поиска придется чуть-чуть дописать код.\r\n\r\n**ldvsoft 9 марта, 10:44**\r\nAntervis, спасибо! Я уже после того, как отправил предложение, нашёл платформу для гетерогенного поиска хотя она довольно запрятана. Остальные пункты точно в силе.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797548769/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797550061", + "html_url": "https://github.com/cpp-ru/ideas/issues/18#issuecomment-797550061", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/18", + "id": 797550061, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzU1MDA2MQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T15:09:09Z", + "updated_at": "2021-03-13T15:06:36Z", + "author_association": "MEMBER", + "body": "**develoit 27 февраля, 6:25**\r\nчто за чушь?? думайте лучше и пишите грамотный код! незачем свои глупости перекладывать на компилятор", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797550061/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797551356", + "html_url": "https://github.com/cpp-ru/ideas/issues/19#issuecomment-797551356", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/19", + "id": 797551356, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzU1MTM1Ng==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T15:11:08Z", + "updated_at": "2021-03-13T15:06:53Z", + "author_association": "MEMBER", + "body": "**nenomius 26 февраля, 15:56**\r\n```cpp\r\nint main()\r\n{\r\n CWheel wheel;\r\n wheel.Turn();\r\n}\r\n```\r\n\r\n**Максим Некипелов 26 февраля, 21:21**\r\nНакосячил с тем, что объяснил не так подробно. Когда писал пример забыл о том, как составлял заголовок (в примере CWheel не nested class). Исправляю ошибку:\r\n```cpp\r\nclass CVehicle\r\n{\r\npublic:\r\n\tfloat Velocity = 0.f;\r\n\r\n\tclass CWheel\r\n\t{\r\n\tpublic:\r\n\t\tvoid Turn()\r\n\t\t{\r\n\t\t\tstatic_cast(this)->Velocity += 10.f; // сейчас тут ошибка\r\n\t\t}\r\n\t} Wheel;\r\n};\r\n\r\nvoid ProcessWheel(CWheel* wheel)\r\n{\r\n\twheel->Turn();\r\n}\r\n\r\nint main()\r\n{\r\n\tCVehicle car;\r\n\r\n\tProcessWheel(&car.Wheel);\r\n}\r\n```\r\nА суть предложения в том, чтобы разрешить static_cast приведения указателя к объекту, который в композиции находится выше. Может, конечно, стоило бы добавить новый оператор для этого, а не использовать static_cast.\r\n\r\nВозникает также большой вопрос реализации данного чуда. Получается что компилятору нужно на каждый такой объект генерировать код метода с разным смещением, которое отбавляется от указателя this, и как он тогда узнает какой метод ему вызывать под конкретный объект? Видимое мной решение проблемы: предлагаю при использовании такого каста внутри класса преобразовывать класс в шаблонный класс, куда неявно будет досовываться указатель на поле, в котором класс используется как тип. В случае выше CWheel будет преобразовано в template class CWheel куда при объявлении Wheel будет оно и передано. Кто не понял:\r\n\r\nCWheel<&CVehicle::Wheel> Wheel;\r\nСейчас, кстати, такой код даст ошибку. Потому что Wheel еще не был объявлен, а уже суем в шаблон. Предлагаю этот косяк тоже исправить. Потому что компилятору не проблема посчитать смещения поля. Шаблон на это никак повлиять не может.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797551356/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797552276", + "html_url": "https://github.com/cpp-ru/ideas/issues/20#issuecomment-797552276", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/20", + "id": 797552276, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzU1MjI3Ng==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T15:12:37Z", + "updated_at": "2021-03-13T15:07:01Z", + "author_association": "MEMBER", + "body": "**ldvsoft 9 марта, 11:14**\r\nНе придём ли мы к explicit параметрам функций?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797552276/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797552940", + "html_url": "https://github.com/cpp-ru/ideas/issues/21#issuecomment-797552940", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/21", + "id": 797552940, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzU1Mjk0MA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T15:13:35Z", + "updated_at": "2021-03-13T15:07:06Z", + "author_association": "MEMBER", + "body": "**nenomius 26 февраля, 16:20**\r\nРаскройте/переформулируйте пожалуйста мысль, не понятно что именно вы предлагаете.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797552940/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797559492", + "html_url": "https://github.com/cpp-ru/ideas/issues/17#issuecomment-797559492", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/17", + "id": 797559492, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzU1OTQ5Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T15:24:03Z", + "updated_at": "2021-03-12T15:24:03Z", + "author_association": "MEMBER", + "body": "**Михаил Мальцев, 2 декабря 2016, 13:25**\r\nТакое предложение уже есть на рассмотрении: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0406r1.html\r\n\r\n**zamazan4ik@tut.by, 2 декабря 2016, 18:07**\r\nДа, я видел proposal. Тут мы голосуем, как я понял. И вполне возможно, что российская группа сможет как-то помочь в проталкивании некоторых предложений.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797559492/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797562020", + "html_url": "https://github.com/cpp-ru/ideas/issues/22#issuecomment-797562020", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/22", + "id": 797562020, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzU2MjAyMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T15:27:54Z", + "updated_at": "2021-03-12T15:28:11Z", + "author_association": "MEMBER", + "body": "**Anatoly Scheglov, 27 декабря 2016, 18:39**\r\nКакую именно? Или все сразу?\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797562020/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797564502", + "html_url": "https://github.com/cpp-ru/ideas/issues/23#issuecomment-797564502", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/23", + "id": 797564502, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzU2NDUwMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T15:31:50Z", + "updated_at": "2021-03-12T15:31:50Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 2 декабря 2016, 16:00**\r\nТут решить просто принять Boost.Sort не получится.\r\n\r\nКонкретный алгоритм/имплементация - это не задача комитета по стандартизации. Комитет по стандартизации описывает требования по памяти и сложности алгоритма. Если алгоритмы из Boost.Sort подходят под требования, но работают быстрее - тогда надо просто их реализацию перетащить в стандартные библиотеки.\r\n\r\nНасколько я помню, часть алгоритмов сортировки из Boost.Sort динамически аллоцировали память, то есть под требования `std::sort` не попадают.\r\n\r\nС Boost.Sort можно двигаться в следующем направлении:\r\n* перетаскивать имплементации в стандартные библиотеки\r\n* находить алгоритмы, которые работают лучше, но не попадают под требования стандартной библиотеки. Для этих алгоритмов можно попробовать написать proposal, со включением алгоритмов в стандартную библиотеку под новыми уникальным именем. Но новый алгоритм должен отличаться по вычислительной сложности, а не просто на константу. Стоит начать со списка таких алгоритмов.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797564502/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797568292", + "html_url": "https://github.com/cpp-ru/ideas/issues/26#issuecomment-797568292", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/26", + "id": 797568292, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzU2ODI5Mg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T15:37:50Z", + "updated_at": "2021-03-27T19:04:41Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 11 января, 19:14**\r\nhttps://wg21.link/P2141 - предложение на английском, с доп примерами.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797568292/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797570262", + "html_url": "https://github.com/cpp-ru/ideas/issues/25#issuecomment-797570262", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/25", + "id": 797570262, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzU3MDI2Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T15:40:50Z", + "updated_at": "2021-03-12T15:40:50Z", + "author_association": "MEMBER", + "body": "**Victor Dyachenko, 7 декабря 2016, 10:38**\r\nКак `char_traits::copy()` и `char_traits::length()` сделать `constexpr`, если одна из эффективных реализаций - ассемблер? Компиляторную магию не предлагать - её и так уже слишком много в современном C++. Проблема общая для языка. Хочешь compile-time - можешь потерять производительность в run-time. Хочешь гарантированно эффективный run-time - не получишь compile-time вообще.\r\n\r\n**Anton Bikineev, 7 декабря 2016, 15:35**\r\nVictor Dyachenko, length уже заапрувлена быть констэкпр. В libc++ сделана через констэкспрессный `__builtin_strlen`. copy может быть сделана через `__builtin_strcpy` или `__builtin_memcpy`.\r\n\r\n**Victor Dyachenko, 7 декабря 2016, 17:46**\r\n\r\n> __builtin_\r\n\r\nВот это я и имел в виду под компиляторной магией. Очень плохо, что сегодня разработчик стандартной библиотеки находится в более привилегированном положении, чем любой другой. В ANSI C такого не было, стандартная библиотека могла быть полностью реализована на стандартном C + asm. Обычному разработчику на каждый чих за новым __builtint_ к компиляторописателям не набегаешься...\r\nЯ не против, чтоб string_view мог инициализироваться во время компиляции, даже всеми руками за. Но вот способ, которым это пытаются решить... В очередной раз заметают более общую проблему под коврик, вместо того чтобы её решать. А ведь бумага с её изложением вышла сразу поле выхода C++11 (с ходу не найду, но на open-std.org она есть). С тех пор воз и ныне там :-(\r\n\r\n**Victor Dyachenko, 7 декабря 2016, 18:05**\r\nНашёл: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3583.pdf\r\n\r\nТут описывается пример с вычислением квадратного корня. В run-time на x86 это делается одной машинной инструкцией \"fsqrt\", но это нельзя использовать в compile-time. Для compile-time написать можно, но в run-time будет сильно неэффективно. Тут такие же случаи.\r\n\r\nА сompiler intrinsic не переносимы. И GCC с Clang'ом не единственные C++ компиляторы.\r\n\r\n**yndx-antoshkka, 7 декабря 2016, 16:03**\r\nСейчас один разработчик из международного комитета занимается как раз этой проблемой и хочет сделать constexpr `char_traits::copy`. Помочь ему мы наврядли сможем.\r\n\r\n**yndx-antoshkka, 20 ноября 2018, 15:05**\r\nХотя нет, смогли. https://wg21.link/P1032 приняли в Сан-Диего.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797570262/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797612165", + "html_url": "https://github.com/cpp-ru/ideas/issues/27#issuecomment-797612165", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/27", + "id": 797612165, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzYxMjE2NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T16:44:15Z", + "updated_at": "2021-03-12T16:44:15Z", + "author_association": "MEMBER", + "body": "**Михаил Мальцев, 6 декабря 2016, 15:29**\r\nС placeholder-ами таких проблем быть не должно, т.к. они \"extern const\", а не \"constexpr\":\r\nhttps://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/src/c%2B%2B11/placeholders.cc\r\n\r\n**Anton Bikineev, 7 декабря 2016, 15:38**\r\nМихаил Мальцев,\r\nМиша, это только в libstdc++ имплементации. Стандарт же говорит [20.14.10.4.2]:\r\nPlaceholders should be defined as:\r\n`constexpr unspecified _1{};`\r\nIf they are not, they shall be declared as:\r\n`extern unspecified _1;`\r\n\r\n\r\n**yndx-antoshkka, 7 декабря 2016, 15:49**\r\nПроверил логи заседания. GB28 было отправлено в LEWG для того, чтобы определить каким именно методом решать эту проблему: просто добавить недостающие inline, либо сделать чтобы `constexpr` для переменных автоматически добавлял Inline (как он сейчас делает для функций). В LEWG возникли вопросы по поводу ABI и решение было отложено на след заседание.\r\n\r\nЕсли есть желание помочь с этой проблемой, стоит написать proposal, в котором исследовать влияние добавления inline на ABI для clang и gcc. В нём же, стоит попробовать сформулировать \"патч\" к стандарту, который говорит что constexpr автоматически добавляет inline и для переменных тоже. Готов всячески помогать при написании proposal (но сделать всё самостоятельно к концу января не смогу).\r\n\r\n**Anatoly Scheglov, 27 декабря 2016, 18:45**\r\nУже предлагали всякие Inline Variables http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4424.pdf\r\n\r\n**yndx-antoshkka, 9 марта 2017, 17:39**\r\nИсправили в C++17. Пометили теги и все шаблонные переменные как inline в https://wg21.link/p0607.\r\n\r\nМеня немного волнует, что эти переменные получили таким образом external linkage вместо internal linkage. Но волнует не настолько сильно, чтобы думать о том как это исправить.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797612165/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797621452", + "html_url": "https://github.com/cpp-ru/ideas/issues/28#issuecomment-797621452", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/28", + "id": 797621452, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzYyMTQ1Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T16:57:58Z", + "updated_at": "2021-03-12T16:57:58Z", + "author_association": "MEMBER", + "body": "**Олег Ляттэ, 6 декабря 2016, 1:14**\r\nА чем не устраивает std::vector? Он делает по сути всё, что Вы хотите от `realloc` new. Плюс RAII, помогающий избежать проблем, характерных для ручной работы с памятью.\r\n\r\n**Victor Dyachenko, 6 декабря 2016, 15:42**\r\nОлег Ляттэ, а vector может расширить свою capacity без копирования уже созданных элементов в другое место? Не может. Вот как минимум для реализации такого и нужен `realloc`.\r\n\r\n**Victor Dyachenko, 6 декабря 2016, 15:42**\r\nБоюсь, что попытка полностью имитировать `realloc()` - это провальная идея, так как в общем случае объекты в C++ нельзя копировать с помощью `memcpy()`. Но вот возможность расширить выделеный кусок памяти, если рядом с ним есть свободное место - фича очень полезная и нужная. Тот же vector не использует move-конструктор элементов, если он не `noexcept`, что заметно бьёт по производительности, если кто-то написал даже тривиальный move-конструктор, но забыл его пометить `noexcept`. А если элементы не надо никуда двигать, то такой проблемы нет.\r\n\r\nНе готов пока предложить конкретный интерфейс, но идея такая. Распределитель памяти должен либо возвращать указатель на расширенный блок памяти, либо просто неудачу (например `nullptr`), если это сделано быть не может. Вызывающий код во втором случае просто выполняет всё то же самое, что делается сейчас: выделяет новый блок и перемещает элементы туда. Написать более высокоуровневую обёртку поверх такого примитива будет несложно. И учитывая, что все системные распределители пишутся на C, реализовать им такой примитив будет несложно.\r\n\r\n\r\n**Victor Dyachenko, 6 декабря 2016, 15:54**\r\nДа, и, конечно, под это дело необходимо будет видоизменить/расширить текущий интерфейс аллокаторов, чтобы контейнеры могли явно выражать, что они хотят: новый блок памяти или расширить старый.\r\n\r\n\r\n**yndx-antoshkka, 7 декабря 2016, 12:55**\r\nРазработчик libstdc++ сейчас продумывает механизм, позволяющий делать нечто подобное http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0401r0.html.\r\n\r\nОсновная идея: добавить \"обратную связь\", чтобы контейнер мог узнавать у аллокатора сколько памяти в действительности он выделил.\r\n\r\nДругие подходы скорее всего не будут работать на современных имплементациях malloc/new, которые как правило аллоцируют блоки одного из предопределённых размеров и просто не могут расширять проаллоцированный блок за пределы этого предопределённого размера.\r\n\r\nДругие подходы могут так же негативно повлиять на вычислительную сложность работы с контейнером, на что комитет не пойдёт.\r\n\r\n\r\n**Victor Dyachenko, 7 декабря 2016, 13:39**\r\nСпасибо за ссылку, но она немного о другом. Возможность узнать реально выделенный размер и возможность \"подрастить\" выбеленный блок - это ортогональные вещи.\r\nОсновная идея в моём комменте выше - дать возможность создателям контейнера декларировать свои намерения. Если в конкретном случае расширить нельзя, то не страшно - будет просто существующее поведение. Но если запрос будет удовлетворён, то получим существенный прирост скорости и не огребём проблем с безопасностью исключений при перетаскивании существующих элементов. Сложность работы с контейнером с точки зрения удобства никак не пострадает, а вычислительная будет не хуже чем сейчас, а в некоторых случаях гораздо лучше.\r\n\r\nP.S. Через вашу ссылку нашёл более близкое предложение: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3495.htm\r\n\r\n\r\n**yndx-antoshkka, 7 декабря 2016, 16:42**\r\nVictor Dyachenko, ваша идея требует от разработчика контейнера std::vector, при нехватке мета, пытаться увеличить размер выделенного блока на 1 элемент:\r\n```\r\nif (capacity == size) {\r\n if (try_realloc(size + 1)) return;\r\n\r\n ptr = allocate (size * 2);\r\n capacity = size * 2;\r\n}\r\n```\r\nЕсли вы создадите вектор на 2049 char и будете постепенно вызывать push_back ещё 2047 раз, то realloc вызовется 2047 раз. Это может дать серьёзное замедление производительности.\r\n\r\nЛибо разработчик контейнера будет пытаться вызвать realloc для в два раза большего объема памяти, и realloc всегда будет возвращать новый блок.\r\n```cpp\r\nif (capacity == size) {\r\n ptr = reallocate (size * 2);\r\n capacity = size * 2;\r\n}\r\n```\r\nВ этом случае, мы ничего не достигли, это аналогично вызовам new+move+delete. При этом придётся переместить логику new+move range+delete внутрь `std::allocator_traits`.\r\n\r\nСравните со случаем, когда аллокатор просто будет честно возвращать размер блока:\r\n```\r\nif (capacity == size) {\r\n ptr = allocate (size * 2);\r\n capacity = get_size_from_alloc(ptr);\r\n}\r\n```\r\nЕсли вы создадите вектор на 2049 char и будете вызывать push_back ещё 2047 раз, то мы даже не зайдем внутрь if. Это будет ощутимо быстрее. При этом, на современных имплементациях libc, оба подхода будут выдавать абсолютно одинаковые результаты.\r\n\r\nБолее того, используя подход \"вытаскиваем информацию из аллокатора\" можно будет написать функцию realloc, работающую с любыми аллокаторами. А вот из функции realloc не получится сделать нечто, достающее истинный размер блока из аллокатора.\r\n\r\n\r\n**Victor Dyachenko, 7 декабря 2016, 17:36**\r\n\r\n> ваша идея требует от разработчика контейнера std::vector, при нехватке мета, пытаться увеличить размер выделенного блока на 1 элемент:\r\n\r\nПочему это? Что мешает расширить на то же значение, на которое расширяет текущая реализация? Почему именно 1?\r\n\r\n\r\n\r\n**yndx-antoshkka, 7 декабря 2016, 19:56**\r\n\r\n> \"Почему это? Что мешает расширить на то же значение, на которое расширяет текущая реализация?\"\r\n\r\nВариант расширения в 2 раза рассмотрен сразу после первого примера, в том же сообщении.\r\n\r\n\r\n**Victor Dyachenko, 7 декабря 2016, 22:05**\r\n\r\n> Либо разработчик контейнера будет пытаться вызвать realloc для в два раза большего объема памяти, и realloc всегда будет возвращать новый блок.\r\n\r\nВот тут не понял, из чего следует такое поведение?\r\n\r\n> При этом придётся переместить логику new+move range+delete внутрь std::allocator_traits.\r\n\r\nНе нужно этого делать. Логика перемещения остаётся в контейнере!\r\n\r\nЕщё раз, аллокатор мы только просим расширить существующий блок. И он либо удовлетворяет наш запрос, либо сообщает, что он этого сделать не может.\r\n\r\nПохоже, надо пример написать, чтобы меня поняли правильно.\r\n```cpp\r\nvoid push_back(T v)\r\n{\r\n if(size() == capacity())\r\n {\r\n size_t new_capacity = ...;\r\n if(extend(space_ptr_, new_capacity))\r\n {\r\n // удалось расширить\r\n capacity_ = new_capacity;\r\n }\r\n else\r\n {\r\n // расширить не получается выделяем новый блок; перемещаем данныеж\r\n }\r\n }\r\n space_ptr_[size_++] = v;\r\n}\r\n```\r\nP.S. Ничто не мешает добавить сюда возможность аллокатору сообщать, сколько он реально выделил и использовать это значение. Это ОРТОГОНАЛЬНОЕ предложение, можно делать и то и другое.\r\n\r\n\r\n**yndx-antoshkka, 13 декабря 2016, 15:03**\r\nVictor Dyachenko, могу помочь с proposal на тему realloc, если хотите. Но у меня нехорошее чувство, что в комитете ваша идея будет воспринята в штыки.\r\n\r\n**Victor Dyachenko, 14 декабря 2016, 16:09**\r\nСпасибо, давайте попробуем. Набросал рабочий код, демонстрирующий идею + прикрутил фичу из p0401 - аллокатор может сообщать, сколько он реально выделил.\r\n\r\nТекст лучше напишу на русском для начала (с английским у меня не очень...) Дальше, наверное, удобнее будет общаться через e-mail. На какой адрес прислать набросок?\r\n\r\n\r\n**Victor Dyachenko, 1 февраля 2017, 14:13**\r\nОпубликовал:\r\nhttps://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/AeL6Q35t1j8\r\nhttps://github.com/2underscores-vic/articles/blob/master/realloc4cpp/realloc4cpp.md\r\n\r\n**yndx-antoshkka, 1 февраля 2017, 15:34**\r\nмои 5 копеек:\r\n* необходимо описать ситуацию, когда передаётся new_size меньше чем прошлый размер. Это ключевой плюс вашего предложения, т.к. предложение от Jonathan Wakely не может никак улучшиить ситуацию с `shrink_to_fit()`. Ваше же предложение сможет в ряде случаев выполнять shrink_to_fit() без переалллокаций и копирований.\r\n* Приведите ссылку на http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3495.htm и приведите небольшое сравнение двух предложений\r\n* возможно стоит добавить `noexcept` ?\r\n* стоит передавать \"сurrent block size as for `allocator::deallocate()`\". Для некоторых аллокаторов это позволит быстрее делать ``resize_allocated`.\r\n\r\nДедлайн для новых предложений - ближайшая пятница (оффициально дедлайн 2017-02-06, но было скинуто предупреждение что дедлайн скорее всего наступит в пятницу).\r\n\r\nЛично я бы рекомендовал не торопиться (скорее всего на ближайшем заседании обсуждать будут в основном только С++17), дождаться отклика на std-proposals и скрестить вашу идею с идеей Jonathan Wakely.\r\n\r\n\r\n**Victor Dyachenko, 1 февраля 2017, 15:55**\r\n* Есть в примере https://github.com/2underscores-vic/articles/blob/master/realloc4cpp/realloc4cpp.cpp. Стоит отдельно описать текстом?\r\n* ОK\r\n* `noexcept`, как мне кажется, тут лишний - не такая это тривиальная операция. И чем он тут кардинально поможет, как, допустим, в случае со swap или move-операциями?\r\n* Тоже склоняюсь к этому.\r\n\r\nДа, подождём откликов с std-proposals. Сам Jonathan Wakely добавлен список рассылки.\r\n\r\nЕще попросил бы Вас присылать замечания по использованию английского, если что бросилось в глаза. С ним у меня туго... :-[\r\n\r\n\r\n**yndx-antoshkka, 1 февраля 2017, 21:52**\r\n* да. В код редко заглядывают в простых случаях\r\n* `noexcept` позволит генерировать более компактный код - компилятор не будет генерировать код свёртки стека на случай исключения. Учитывая что метод resize_allocated скорее всего будет вызывать `extern` функцию, компилятору `noexcept` тут сильно поможет.\r\n\r\n\r\n**Дмитрий, 1 апреля 2017, 12:54**\r\nТеоретически есть 4 варианта - расширение памяти вперед, освобождение памяти спереди, расширение памяти назад и освобождение памяти сзади.\r\nОсвобождение памяти в обе стороны возможно во всех случаях и даст следующие гарантированные преимущества:\r\n1. Возможность реализовать эффективные `shrink_to_fit()` и `pop_front()` у вектора, без переаллокации памяти.\r\n2. Оптимизировать удаление элементов, расположенных до середины вектора. Например при удалении второго элемента из вектора в 100 элементов, достаточно сдвинуть первый элемент на вторую позицию и вернуть занимаемую первой позицией память системе, а не сдвигать 98 элементов назад, как реализовано сейчас.\r\nРасширение памяти возможно только если есть свободная память до/после. Но расширение даже на один элемент гораздо эффективнее переаллокации, поэтому требование увеличения размера вектора в 2 (или 1.5) раз при расширении памяти можно исключить. Если не влезает двойной размер, можно расширяется на столько, сколько возможно, даже на 1 элемент.\r\nРасширение памяти в обе стороны даст следующие преимущества:\r\n1. Возможность реализовать эффективный insert(begin()) у вектора (в некоторых случаях) без переаллокации памяти. Если есть свободная память до вектора - достаточно расширить ее назад и вставить элемент.\r\n2. Оптимизировать вставку элементов до середины вектора. Например при вставке элемента во вторую позицию вектора из 100 элементов, достаточно расширить память назад, и сдвинуть первый элемент назад, а не сдвигать 98 элементов вперед.\r\n3. Оптимизировать вставку в конец вектора, у которого capacity() уже равна size(), но есть свободная память после блока вектора.\r\nКонечно, необходимо всё продумывать, добавить анализ доступного для выделения объема и т.д., но если подойти к решению данного вопроса комплексно, в общем случае производительность работы с памятью может увеличиться многократно без каких-либо телодвижений со стороны программиста.\r\n\r\n\r\n**Ватенов Артем, 24 февраля 2018, 18:10**\r\nЭта оптимизация должна дать очень значительное ускорение, и повысить энергоэффективность с++ приожений, т.к. std::vector и std::string самые используемые контейнеры. На с++ просто не бывает кода без них.\r\n`realloc` обсуждают уже ни один год. Но ничего не меняется. И здесь инициатива застопорилась. В стандарт проходят куда более сложные, и менее важные вещи...\r\nЕще вектор/строки должно ускорить приравнивание `capacity()` к `_msize()`, т.к. память выделяется блоками и capacity обычно получается меньше. Из-за этого переаллокация происходит раньше, чем фактически возможно.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797621452/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797627157", + "html_url": "https://github.com/cpp-ru/ideas/issues/29#issuecomment-797627157", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/29", + "id": 797627157, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzYyNzE1Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T17:06:36Z", + "updated_at": "2021-03-12T17:06:36Z", + "author_association": "MEMBER", + "body": "**Павел Майоров, 7 декабря 2016, 17:00**\r\nДело в том, что произвольный предикат передавать в такие функции - нельзя. Тот же binary_search требует упорядоченности последовательности в терминах переданного предиката (более того - эта самая упорядоченность частично проверяется assert'ами в отладочной сборке). Если передать в функцию унарный предикат - то даже сам факт упорядоченности нельзя будет адекватно описать в документации.\r\n\r\nКроме того, сам факт что последовательность упорядоченна, обычно означает что нужный предикат где-то в другой функции уже передавался, например, в функцию сортировки. То есть надо лишь найти его и использовать повторно (DRY!) вместо того чтобы писать лямбду.\r\n\r\nДля случая поиска по конкретному полю - можно просто перегрузить в компараторе оператор (), дав возможность сравнивать объекты не только друг с другом - но и со значением поля напрямую.\r\n\r\nПо части же изменений в языке - я бы предпочел варианты функций, принимающих компаратор, которые бы принимали еще и поле (функтор) для сортировки (`sort_by`, `binary_search_by`, `lower_bound_by`, ...) - такое решение будет намного красивее и полезней нежели перегрузки с унарными предикатами.\r\n\r\n\r\n**h4tred, 21 марта 2017, 7:37**\r\nПавел Майоров, что-то тут оказывается уведомления не прилетают при комментариях...\r\n\r\n> Для случая поиска по конкретному полю - можно просто перегрузить в компараторе оператор (), дав возможность сравнивать объекты не только друг с другом - но и со значением поля напрямую.\r\n\r\nСпасибо, об этом я не подумал. Причём для лямбды тоже работает, хотя предложение иметь в таком варианте функтор - очень стоящее. Дабы было сложнее нарушить условия сортировки и не давать искать по другому полю.\r\n\r\nС другой стороны, особняком остаётся `std::search_n` - для неё критерий сортировки не имеет значения и по одной и той же коллекции можно бегать, используя разные поля и критерии поиска.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797627157/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797629732", + "html_url": "https://github.com/cpp-ru/ideas/issues/30#issuecomment-797629732", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/30", + "id": 797629732, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzYyOTczMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T17:10:43Z", + "updated_at": "2021-03-19T19:44:58Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 5 декабря 2016, 13:51**\r\nЭтим уже занимаются Bjarne Stroustrup и Herb Sutter: https://wg21.link/p0251", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797629732/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797636743", + "html_url": "https://github.com/cpp-ru/ideas/issues/31#issuecomment-797636743", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/31", + "id": 797636743, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5NzYzNjc0Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-12T17:21:53Z", + "updated_at": "2021-03-12T17:21:53Z", + "author_association": "MEMBER", + "body": "**Anatoly Kalin, 5 декабря 2016, 22:04**\r\nВ свою очередь могу предложить альтернативные варианты гтесту:\r\nhttps://github.com/onqtam/doctest (которая равняется на https://github.com/philsquared/Catch )\r\n\r\n\r\n**Ivan Komissarov, 7 декабря 2016, 13:24**\r\nТакже стоит учитывать возможности QtTest Framework http://doc.qt.io/qt-5/qtest-overview.html\r\nВ целом, очень похож на GTest, но есть ряд фич, которых AFAIK нет в gtest. А именно:\r\n- бенчмаркинг (по времени, по тикам процессора и тп)\r\n- возможность запускать один тест на различных тестовых данных\r\n\r\n\r\n**Михаил Павлов, 7 декабря 2016, 15:45**\r\nЧем плох `boost::test`?\r\nhttp://www.boost.org/doc/libs/1_62_0/libs/test/doc/html/index.html\r\n\r\n**alexei-developer, 8 декабря 2016, 21:39**\r\nЯ за gtest и gmock в включение в стандарт, полгода назад думал что gtest хватит, хотел перейти на буст, но выяснилось что у буста сейчас нет моков, раньше вроде бы были. После написания и тестирования сетевого приложения работающего с БД без моков уже не прдеставляю библиотеку юниттестирования без моков. гтест и гмок помоему подходят к стилю яндекса - ничего лишнего, было бы не плохо иметь уже в 17 стандарте std::unitest:test и std::unittest::mock\r\n\r\n**yndx-antoshkka, 13 декабря 2016, 14:59**\r\nalexei-developer, будет большой проблемой уговорить комитет использовать именно gtest/Boost.Test. Вы готовы взяться за это?\r\n\r\n\r\n**alexei-developer, 25 декабря 2016, 14:03**\r\nyndx-antoshkka, добрый день, был в отпуске, а оповешение что мне ответили почему то, не пришло на почту. =) Антон, а как это \"уговорить комитет\"? Что от меня требуется? =) Если могу чем-то помочь, то готов это сделать.\r\n\r\n**Сергей Прейс, 13 декабря 2016, 20:54**\r\nА зачем это именно в стандарте языка? Какая именно видится польза от включения этой библиотеки в стандарт (по сравнению с текущей ситуацией)?\r\n\r\n\r\n**alexei-developer, 25 декабря 2016, 14:10**\r\nСергей Прейс, добрый день, у меня есть следующие проблемы, ребята либо вообще не разрабатывают авто тесты, либо разрабатывают как попало и на чем попало. В питоне например, такой проблемы нет, все разработывают на автотестах питона включенных в поставку питона. Что касается C++ и его стандарта, то тут я в принципе согласен, что возможно в стандарте это не к чему, но хотя бы в libstdc++ =) А по большому счеты я был бы не против чтобы сам стандарт поддерживал авттесты. Можно было бы сразу приучать с++ программистов использовать автотетсы на примерах хелоу ворлд, ну и плюс добавлять что автотесты даже включены в стандарт с++, так что их использование настоящими программистами должно быть must have =)\r\n\r\n\r\n\r\n**Anatoly Scheglov, 27 декабря 2016, 17:35**\r\nЕсть sigle-file header-only библиотеки, в частности Catch.\r\nДобавление библиотеки в стандарт - это слишком сложно по сравнению в добавлением в проект одного файла catch.hpp", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/797636743/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798126896", + "html_url": "https://github.com/cpp-ru/ideas/issues/34#issuecomment-798126896", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/34", + "id": 798126896, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODEyNjg5Ng==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T10:37:41Z", + "updated_at": "2021-03-13T15:07:29Z", + "author_association": "MEMBER", + "body": "**Antervis 12 января, 17:23**\r\nа зачем? У вас если строковый литерал фиксированный, т.е. известен на этапе компиляции, значит и string_view от него, в котором будет содержаться размер, можно вычислить на этапе компиляции.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798126896/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798130606", + "html_url": "https://github.com/cpp-ru/ideas/issues/35#issuecomment-798130606", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/35", + "id": 798130606, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODEzMDYwNg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T10:40:30Z", + "updated_at": "2021-03-13T15:07:47Z", + "author_association": "MEMBER", + "body": "**develoit 9 декабря 2020, 12:33**\r\nчто мешает нужные алгоритмы свободными функциями сделать??\r\nзапилят же когда-нибудь f(x) -> x.f и будет вам счастье)\r\n\r\n**valera_ee 9 декабря 2020, 13:19**\r\nКорень проблемы кроется в том, что алгоритмы работы с данными отделены от данных, и непонятно подхит алгоритм к контейнеру или нет, нужно ковырять справки или разбирать ошибки компилятора.\r\n\r\nНапример, класс std::array имеет метод fill(), а std::vector - нет, похоже на бардак в STL. Очень длинные строчки кода где используются алгоритмы, Ranges хорошо упростят код, но не решат проблему в целом.\r\n\r\n**maxon 9 декабря 2020, 15:15**\r\nvalera_ee, контейнеры, алгоритмы и итераторы -- это не \"корень проблемы\", а как раз решение многих трудностей. Способ хранения данных и алгоритмы их обработки -- это разные сущности, с какой стати их приколачивать друг к другу гвоздями, ещё и внутри стандартной либы? Это и в прикладном варианте попахивает.\r\n\r\nСложности с \"подходит алгоритм к контейнеру или нет\" мне тоже непонятны. Большинство - подходит. Практически все контейнеры имеют ForwardIterator, а большинству алгоритмов этого достаточно. \r\nПопытка получить RandomAccessIterator у std::forward_list закономерно закончится ошибкой, но я бы не назвал эту ситуацию \"непонятно подходит или нет\". \r\n\r\n**valera_ee 9 декабря 2020, 18:22**\r\nmaxon, ну вот простой житейский пример, я хочу удалить из контейнера элементы неудовлетворяющие предикату, я делаю 2 действия:\r\n 1 - дергаю внешнюю функцию std::remove_if\r\n 2 - затем возвращённый итератор передаю на вход самого контейнера\r\n\r\n`people.erase(std::remove_if(people.begin(), people.end(), is_valid), people.end());`\r\n\r\nНу проще же писать: `people.remove_if(is_valid);`\r\n\r\n**develoit 10 декабря 2020, 3:46**\r\nvalera_ee, ну ведь и не сложнее писать: `remove_if(people, is_valid);`\r\n\r\nрассматривай не примитивные методы-члены в контейнерах, как специализации обобщенных алгоритмов (в виде свободных функций), оптимальные для этих структур данных (контейнеров).\r\n\r\n**Топунов Владимир Андреевич 10 декабря 2020, 10:09**\r\nЕсть вариант получше [Unified Call Syntax](http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0251r0.pdf)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798130606/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798171464", + "html_url": "https://github.com/cpp-ru/ideas/issues/33#issuecomment-798171464", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/33", + "id": 798171464, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODE3MTQ2NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T11:11:16Z", + "updated_at": "2021-03-13T11:11:16Z", + "author_association": "MEMBER", + "body": "Участники РГ21 запросили повышение проритета задачи во время международного собрания и нам удалось убедить других участников в важности фичи. \r\n\r\nИдея по добавлению форматтеров для chrono стала частью C++20 http://eel.is/c++draft/time#format . Отдельное спасибо авторам https://wg21.link/p1361 за отличное предложение!", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798171464/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798182502", + "html_url": "https://github.com/cpp-ru/ideas/issues/15#issuecomment-798182502", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/15", + "id": 798182502, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODE4MjUwMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T11:19:18Z", + "updated_at": "2021-03-13T11:19:18Z", + "author_association": "MEMBER", + "body": "Идея активно прорабатывается международным комитетом вот в этом предложении https://wg21.link/P0214 . \r\n\r\nВ новых версиях libstdc++ даже есть реализация https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/include/experimental/simd . \r\n\r\nПробуйте, делитесь фидбеком. Если что-то не так в предложении - ещё есть время исправить недочёты.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798182502/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798230157", + "html_url": "https://github.com/cpp-ru/ideas/issues/37#issuecomment-798230157", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/37", + "id": 798230157, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODIzMDE1Nw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T11:50:21Z", + "updated_at": "2021-03-13T15:08:00Z", + "author_association": "MEMBER", + "body": "**Nikola_g 11 декабря 2020, 18:55**\r\nМне кажется слишком запутано будет, если будет иерархия наследования или вложенность.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798230157/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798332289", + "html_url": "https://github.com/cpp-ru/ideas/issues/39#issuecomment-798332289", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/39", + "id": 798332289, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODMzMjI4OQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T12:57:46Z", + "updated_at": "2021-03-13T15:08:09Z", + "author_association": "MEMBER", + "body": "**Nikola_g 11 декабря 2020, 19:01**\r\nНе понятно, что за проблема побудила ввести такой синтаксис?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798332289/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798335782", + "html_url": "https://github.com/cpp-ru/ideas/issues/41#issuecomment-798335782", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/41", + "id": 798335782, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODMzNTc4Mg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T13:00:04Z", + "updated_at": "2021-03-13T15:08:34Z", + "author_association": "MEMBER", + "body": "**lexasub 9 декабря 2020, 11:27**\r\nТогда нужны алгоритмы, которые работают с такими итераторами. Есть обычные алгоритмы, но зачем тогда эти итераторы? Нужны алгоритмы работающие с циклическими итераторами.\r\n\r\n**Данила Милютин 14 января, 7:02**\r\nНедавно встретил: \r\nhttps://github.com/Quuxplusone/ring_view\r\n\r\nВыглядит созвучным с вашим предложением.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798335782/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798343843", + "html_url": "https://github.com/cpp-ru/ideas/issues/42#issuecomment-798343843", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/42", + "id": 798343843, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODM0Mzg0Mw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T13:05:18Z", + "updated_at": "2021-03-13T15:08:42Z", + "author_association": "MEMBER", + "body": "**Данила Милютин 15 декабря 2020, 19:39**\r\nИными словами, strong typedef.\r\nЯ - за. Такого не хватает в языке.\r\nМожно будет много ошибок избежать и сократить много boilerplate.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798343843/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798347096", + "html_url": "https://github.com/cpp-ru/ideas/issues/43#issuecomment-798347096", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/43", + "id": 798347096, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODM0NzA5Ng==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T13:07:30Z", + "updated_at": "2021-03-13T15:02:45Z", + "author_association": "MEMBER", + "body": "**develoit 4 декабря 2020, 3:45**\r\nс этими функциями прекрасно справляется splice_after/splice", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798347096/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798350702", + "html_url": "https://github.com/cpp-ru/ideas/issues/45#issuecomment-798350702", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/45", + "id": 798350702, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODM1MDcwMg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T13:09:52Z", + "updated_at": "2021-03-13T15:02:28Z", + "author_association": "MEMBER", + "body": "**alekseyvladimirovich 9 декабря 2020, 21:38**\r\nТаких классов в C++ нет и это правильно. Все непредвиденные ситуации вы всё равно не отловите, а скорость вычислений резко упадёт. Да и непонятно, какую ситуацию считать непредвиденной. Вычисление 1e30+1 - это непредвиденная ситуация или так должно быть? А 1e30+1-1e30? Такие классы дадут ложную иллюзию защищённости, не решая серьёзных проблем\r\n\r\n**Nikola_g 11 декабря 2020, 18:08**\r\nalekseyvladimirovich, Кто вам сказал заменить? Где это написано? Там сказано добавить, кто вам запрешает испозовать стандартные типы? Видно вы не работали с математическими задачами, которые мы встречаемся каждый день. С помощью такой обёртки были отловлены многи ошибки с не корректным вычислением. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798350702/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798352622", + "html_url": "https://github.com/cpp-ru/ideas/issues/46#issuecomment-798352622", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/46", + "id": 798352622, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODM1MjYyMg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T13:11:07Z", + "updated_at": "2021-03-13T15:02:18Z", + "author_association": "MEMBER", + "body": "**lexasub 9 декабря 2020, 11:33**\r\nа зачем собственно?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798352622/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798361344", + "html_url": "https://github.com/cpp-ru/ideas/issues/47#issuecomment-798361344", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/47", + "id": 798361344, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODM2MTM0NA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T13:16:52Z", + "updated_at": "2021-03-13T14:21:36Z", + "author_association": "MEMBER", + "body": "**m0xf 2 декабря 2020, 21:28**\r\nДля того, что не приходилось конструировать новую строку подошёл бы вариант stoi с аргументом типа string_view. А у него уже есть конструктор от пары итераторов.\r\n\r\n**develoit 4 декабря 2020, 3:52**\r\nm0xf, +\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798361344/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798371990", + "html_url": "https://github.com/cpp-ru/ideas/issues/49#issuecomment-798371990", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/49", + "id": 798371990, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODM3MTk5MA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T13:23:56Z", + "updated_at": "2021-03-13T14:21:19Z", + "author_association": "MEMBER", + "body": "**raidenluikang 6 сентября 2020, 20:33**\r\nhttps://en.cppreference.com/w/cpp/string/basic_string/replace\r\n\r\nпожалуйста не усложняйте `std::string.replace` )\r\n\r\n**Евгений Тонишев 13 сентября 2020, 1:13**\r\nЕсть же [std::replace](https://en.cppreference.com/w/cpp/algorithm/replace)\r\n\r\n**Kirill Frolov3 октября 2020, 13:41**\r\n`std::replace` требует итераторов и предиката, кроме того работает с одним элементом, а не с последовательностью.\r\n\r\nЗдесь нужен цикл внутри которого производится поиск следующего вхождения подстроки в строку и последующая замена. Такой алгоритм будет неэффективен если замены производятся многократно в одной строке и напрашиваются другие решения...\r\n\r\nКроме того, возникает множество вопросов:\r\n\r\n1) должна выполняться единственная замена или множественные?\r\n2) если выполняется множественная замена, то поиск должен продолжаться со следующего символа или после заменённой подстроки?\r\n3) возможно ли использование дополнительной памяти (копии строки) или желательно избегать реаллокации?\r\n\r\nЯ думаю, указанные вопросы -- это причина, почему такой функции нет в библиотеке. Её легко реализовать самостоятельно, но для библиотечной функции возникает слишком много тонкостей.\r\n\r\n**Kirill Frolov 3 октября 2020, 13:43**\r\nЯ думаю, в библиотеке такая функция нужна, но как отдельная функция, а не перегрузка существующей функции, на которую в итоге окажется навешан существенно разный функционал.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798371990/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798383999", + "html_url": "https://github.com/cpp-ru/ideas/issues/50#issuecomment-798383999", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/50", + "id": 798383999, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODM4Mzk5OQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T13:31:44Z", + "updated_at": "2021-03-13T13:31:44Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka25 августа 2020, 12:49**\r\nВроде всё хорошо: https://godbolt.org/z/99an43\r\n\r\n**HedgehogInTheCPP25 августа 2020, 23:18**\r\nyndx-antoshkka, хм, да, с 14 стандарта так можно (2 и 3 вариант ожидаемо). Похоже я уже потионьку начинаю забывать как писать на С++ вручную, всё генерацией обложено. В следующий раз буду проверять на compiler explorer.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798383999/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798387505", + "html_url": "https://github.com/cpp-ru/ideas/issues/51#issuecomment-798387505", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/51", + "id": 798387505, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODM4NzUwNQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T13:34:11Z", + "updated_at": "2021-03-13T14:21:08Z", + "author_association": "MEMBER", + "body": "**Kirill Frolov 3 октября 2020, 13:46**\r\nЯ думаю, что нужна профильная \"телеконференция\" (вроде comp.lang.c++ но на русском). Обсуждение чего-либо в рамках окошка на 4 строки и на веб сайте принадлежащем непонятно организации -- не продуктивно. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798387505/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798396159", + "html_url": "https://github.com/cpp-ru/ideas/issues/52#issuecomment-798396159", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/52", + "id": 798396159, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODM5NjE1OQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T13:40:20Z", + "updated_at": "2021-03-13T13:40:26Z", + "author_association": "MEMBER", + "body": "**HedgehogInTheCPP 25 августа 2020, 23:22**\r\nсломает auto.\r\n```cpp\r\nauto val = foo();\r\n```\r\nперестанет компилироваться.\r\n\r\n**Дмитрий 8 сентября 2020, 21:46**\r\nHedgehogInTheCPP, не перестанет, если допустить подобный вариант для случая отсутствия перегрузок.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798396159/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798492253", + "html_url": "https://github.com/cpp-ru/ideas/issues/53#issuecomment-798492253", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/53", + "id": 798492253, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODQ5MjI1Mw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T15:13:36Z", + "updated_at": "2021-03-13T15:13:36Z", + "author_association": "MEMBER", + "body": "**al-mission-2016 23 июля 2020, 16:34**\r\nВсё это, и даже больше, скорее всего будет добавлено в C++23, поскольку улучшение механизмов поиска по образцу (pattern matching) - один из приоритетов C++23. Только синтаксис будет немного другой - switch по ряду причин решили не трогать. Скорее всего введут ключевое слово inspect. В итоге будет свич не только по числам и по строкам, но даже по типам.\r\n\r\n**al-mission-2016 23 июля 2020, 16:40**\r\nНапример (предварительный синтаксис):\r\n```cpp\r\n // По числам:\r\n inspect (x) {\r\n 42: print(\"Параметр Хабла Ho: 42 мили/в секунду/на мегапарсек\");\r\n 43: print(\"Это 43\");\r\n __: print(\"не важно\");\r\n }\r\n\r\n // По строкам:\r\n inspect (s) {\r\n \"foo\": print(\"фу\");\r\n \"bar\": print(\"бар\");\r\n __: print(\"default\");\r\n }\r\n\r\n // По полиморфным типам, [r], [w, h] ниже - это капчинг членов-данных:\r\n int get_area(const Shape& shape) const {\r\n return inspect (shape) {\r\n [r] => 3.14 * r * r,\r\n [w, h] => w * h\r\n }\r\n }\r\n```\r\nТакже inspect будет визитёром для std::tuple, std::variant, std::any.\r\n```cpp\r\n // Поддержка std::variant:\r\n inspect (var) {\r\n c: print(\"Volume = {}\", pow(c.edge(), 3));\r\n s: print(\"Volume = {}\", 4./3 * pi * pow(s.radius(), 3));\r\n }\r\n```\r\nВ общем, смотрите пропозал Pattern Matching (поиск по паттерну) http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2020/p1371r2.pdf\r\n\r\n[P1371R2 - C++23 - Pattern Matching (поиск по паттерну). 2020-01-13](http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2020/p1371r2.pdf)\r\n\r\n**NeoProgramming 14 января, 9:09**\r\nal-mission-2016, жуть какая, зачем повторять ошибки C# с двумя синтаксисами switch? Нужно просто расширить существующий оператор.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798492253/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798493314", + "html_url": "https://github.com/cpp-ru/ideas/issues/54#issuecomment-798493314", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/54", + "id": 798493314, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODQ5MzMxNA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-13T15:14:45Z", + "updated_at": "2021-03-13T15:14:45Z", + "author_association": "MEMBER", + "body": "**oficsu 20 июля 2020, 22:51**\r\nМне кажется, что достаточно снять требование на то, чтобы message был string literal и разрешить вторым аргументом передавать любой тип, способный в constexpr-контексте быть приведённым к char const*, в таком случае точно не произойдёт глупости и никто не смешает языковую и библиотечную фичу в кучу, каждый сможет написать свой форматтер, угодный его душе\r\n\r\nПравда, возникают вопросы с зависимыми шаблонными параметрами. Так мы сможемdependent_false передать прямо в строку сообщения об ошибке, не уверен, есть ли связанные с этим проблемы", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798493314/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798867364", + "html_url": "https://github.com/cpp-ru/ideas/issues/55#issuecomment-798867364", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/55", + "id": 798867364, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg2NzM2NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T08:18:46Z", + "updated_at": "2021-03-14T08:18:46Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 7 декабря 2016, 12:07**\r\nМало кто из Python разработчиков знает об этом синтаксисе, а ведь именно из него, как я понимаю, и взята эта идея.\r\n\r\nСинтаксис отсутствует во множестве языков программирования и не интуитивно понятен. Мне было бы не приятно читать код, в котором есть подобные конструкции.\r\n\r\n\r\n**pavelandreevith, 8 декабря 2016, 21:15**\r\nyndx-antoshkka, я соглашусь с этим else, и напомню, что в python он используется в т.ч. для определения, был ли выход из цикла обычный, или с использованием break.\r\n\r\nhttp://ideone.com/quZxlv\r\nhttp://ideone.com/iFdkb6\r\n\r\nИ я помню доклад Sean Parent в 2013-м, где он достаточно красноречиво аргументировал, что циклы - это вообще плохо. Но пару раз такой фичи мне в С++ очень не хватало.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798867364/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798868222", + "html_url": "https://github.com/cpp-ru/ideas/issues/56#issuecomment-798868222", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/56", + "id": 798868222, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg2ODIyMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T08:24:09Z", + "updated_at": "2021-03-14T08:24:09Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 7 декабря 2016, 12:45**\r\nПредложение отличное, но над ним уже работают в Ranges. В http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0459r0.pdf секции [future.iterator_range] есть об этом параграф:\r\n\r\n\"Algorithms like equal_range and rotate could use a concrete range type instead of pair\r\nas their return type, improving composability. It would also be useful to implement a view::all range view\r\nthat yields a lightweight range object that refers to all the elements of a container.\r\n\r\nA future paper will propose such a type.\"\r\n\r\n**Victor Dyachenko, 7 декабря 2016, 13:14**\r\nБыло подобное ещё до принятия C++11. Не каждая пара итераторов является диапазоном, поэтому это просто опасно, делать такое. Например алгоритм, вроде minmax(), но возвращающий итераторы на максимальный и минимальный элементы.\r\nБыло ещё предложение сделать тип\r\n```cpp\r\ntemplate\r\nclass range : public std::pair;\r\n```\r\nНо это предложение тоже отвергли.\r\n\r\n**Павел Майоров, 7 декабря 2016, 16:44**\r\nНельзя такое делать для пар, пара элементов имеет другую семантику. Нужен отдельный тип данных. И, кажется, его уже делают.\r\n\r\n\r\n**Олег Ляттэ, 8 декабря 2016, 0:10**\r\nСогласен с тем, что pair с итераторами - скорее подпорка, чем полноценное воплощение идеи диапазонов (ranges). Однако даже если (\"когда\", надеюсь) в стандарт и добавят диапазоны, то пойдёт ли комитет на то, чтобы изменить интерфейс уже устоявшихся алгоритмов и контейнеров, и изменит возвращаемый тип с пары на диапазон, поломав тем самым обратную совместимость? Я сомневаюсь. Поэтому и предложил пару простых перегрузок, которые заметно упростят работу в имеющихся на сегодняшний день условиях.\r\n\r\n\r\n**polukarov.mikhail, 9 декабря 2016, 8:29**\r\nУ меня была схожая идея, но по поводу std::istream. Можно было бы добавить перегрузку для создания диапазона из потока ввода. Есть правда одна тонкость - std::istream_iterator требует шаблонный параметр указывающий тип читаемого элемента. Ведется ли в комитете обсуждение подобных предложений?\r\n\r\n**yndx-antoshkka, 13 декабря 2016, 14:56**\r\npolukarov.mikhail, не очень понял вашу идею, объясните поподробнее\r\n\r\n**polukarov.mikhail, 17 декабря 2016, 22:25**\r\nСейчас чтобы прочитать что-либо из потока данных необходимо создавать пару итераторов std::istream_iterator<...>. Например:\r\n```cpp\r\nusing namespace std;\r\n\r\nistringstream str(\"0.1 0.2 0.3 0.4\");\r\npartial_sum(istream_iterator(str),\r\nistream_iterator(),\r\nostream_iterator(std::cout, \" \"));\r\n\r\nistringstream buf(\"1 2 3 4 5 6 7\");\r\ncopy(istream_iterator(str),\r\nistream_iterator(),\r\nostream_iterator(cout, \" \"));\r\n```\r\nБыло бы удобно перегрузить `std::begin()`/`std::end()` принимающие `std::basic_istream<...>`. В таком случае можно будет писать такой код:\r\n```cpp\r\nistringstream str(\"0.1 0.2 0.3 0.4\");\r\n// using begin()/end()\r\npartial_sum(begin(str), end(str), ostream_iterator(cout, \" \"));\r\n```\r\nНу и в идеале, использовать ranges и производящую функцию типа make_range(), например так:\r\n```cpp\r\nistringstream buf(\"1 2 3 4 5 6 7\");\r\n// using make_range()\r\ncopy(make_range(str), ostream_iterator(cout, \" \"));\r\n```\r\n\r\nВсе выше описанные функции могут быть реализованы примерно так:\r\n```cpp\r\ntemplate\r\nistream_iterator\r\nbegin(basic_istream& stream) {\r\n return istream_iterator(stream);\r\n}\r\n\r\ntemplate\r\nistream_iterator\r\nend(basic_istream&) {\r\n return istream_iterator();\r\n}\r\n\r\ntemplate\r\nrange< istream_iterator >\r\nmake_range(basic_istream& stream) {\r\n return { istream_iterator(stream), istream_iterator() };\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798868222/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798879093", + "html_url": "https://github.com/cpp-ru/ideas/issues/56#issuecomment-798879093", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/56", + "id": 798879093, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg3OTA5Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T09:55:21Z", + "updated_at": "2021-03-14T09:55:21Z", + "author_association": "MEMBER", + "body": "В C++20 добавили [std::ranges::subrange](https://eel.is/c++draft/range.subrange), выполняющий запрошенный функционал, и внедрили его использование во все алгоритмы.\r\n\r\nИдею \"Перегрузить std::begin()/std::end() для std::basic_istream\" вынес в отдельный тикет https://github.com/cpp-ru/ideas/issues/57", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798879093/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798879816", + "html_url": "https://github.com/cpp-ru/ideas/issues/58#issuecomment-798879816", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/58", + "id": 798879816, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg3OTgxNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T10:01:31Z", + "updated_at": "2021-03-14T10:01:31Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 7 декабря 2016, 12:30**\r\nЛично мне жутко не нравятся свойства, так как они скрывают вызов функции и в лучшем случае заставляют печатать на 1 символ больше:\r\n```cpp\r\nclass foo {\r\n int n_;\r\npublic:\r\n int n() const { return n_; }\r\n void n(int value) { n_ = value; }\r\n};\r\n\r\n// usage\r\nfoo f{};\r\nf.n(123); // на 1 символ короче\r\n```\r\n\r\n**Anatoly Scheglov, 27 декабря 2016, 18:52**\r\nyndx-antoshkka, свойства полезны как ad-hoc средство отладки. Обычное поле можно заменить на свойство и логировать/делать ассёрты на его чтение/запись.\r\n\r\n**Andrey Davydov, 13 января 2017, 11:51**\r\nAnatoly Scheglov, для отладки можно воспользоваться таким трюком stackoverflow.com/a/5924594\r\n\r\n\r\n**mezastel, 23 марта 2017, 16:31**\r\nAndrey Davydov, пример, приведенный на StackOverflow это, извините, трэш тотальный. Должны работать простые присваивания, например `foo.x = bar`, а доступ должен быть через `foo.x` а не `foo.x()` что собственно уже можно получить в обычном С++\r\n\r\n**Andrey Davydov, 23 марта 2017, 16:39**\r\nmezastel, для пользователя класса Foo работают простое присваивание foo.x = bar и доступ foo.x\r\n\r\n**dix75, 13 января 2017, 13:06**\r\nВесьма полезная вещь, особенно если ты пишешь не только на с++ и портируешь из других языков в с++\r\n\r\n**yndx-antoshkka, 13 января 2017, 13:36**\r\ndix75, под этим предлогом можно в C++ притащить очень много сомнительных вещей: монады, сборщик мусора, интерпритируемость языка, нестрогую типизацию, synchronized(this)...\r\n\r\nА для тех, кто переписывает с Перла, можно ещё добавить \\\\, ~~, =>{}, @_, $@, $_, qw//\r\n\r\n\r\n**mrgordonfreman, 13 января 2017, 14:03**\r\ndix75, а как подход convention over configuration будет совместим со старым кодом? Если случайно у меня имя поля и функция-сеттер были названы в соответствии с правилами новой фичи, то при обращении к такому полю в деталях реализации внезапно начнет вызываться сеттер?\r\n\r\n\r\n**maxf1312, 23 марта 2017, 15:02**\r\nПоставил минус, несмотря на то, что нередко пользуюсь обертками COM, которые генерирует MS Visual Studio через директиву import.\r\n\r\nСам предпочитаю пару методов в стиле:\r\n```cpp\r\nint n() const;\r\nvoid n(int n);\r\n```\r\nЕсли бы это было в языке - нужно было бы обязательно прописывать селекторы и модификаторы, т.к. соглашение по умолчанию не подойдет - очень много старого кода существует, обязательно будут коллизии имен.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798879816/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798880232", + "html_url": "https://github.com/cpp-ru/ideas/issues/38#issuecomment-798880232", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/38", + "id": 798880232, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4MDIzMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T10:04:29Z", + "updated_at": "2021-03-14T10:04:29Z", + "author_association": "MEMBER", + "body": "Закрыто в пользу #58 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798880232/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798880382", + "html_url": "https://github.com/cpp-ru/ideas/issues/59#issuecomment-798880382", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/59", + "id": 798880382, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4MDM4Mg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T10:05:52Z", + "updated_at": "2021-03-26T17:24:38Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 29 ноября 2017, 18:35**\r\nКак разработчик Boost.LexicalCast я буду выступать категорически против принятия lexical_cast в стандарт в том виде, что он в Boost.\r\n\r\nПравильный lexical_cast, это lexical_cast использующий std::to_chars/std::from_chars и не умеющий конвертировать пользовательские типы данных. Желательно при этом ему быть constexpr :)\r\n\r\n\r\n**Игорь, 29 ноября 2017, 19:25**\r\nyndx-antoshkka, То есть, я так понимаю сейчас стоит задача переписать существующий lexical_cast где внутри будут эти std::from_chars/std::to_chars, которые не тянут как мне помниться кучу лишнего, как например локаль. И только потом рассматривать возможность включения в стандарт? А почему не конвертить пользовательские типы данных? Почему бы ему не быть универсальным? В чем проблема?\r\n\r\n\r\n**yndx-antoshkka, 30 ноября 2017, 13:23**\r\nпользовательские типы данных обычно конвертируются через basic_ostream, а он использует локаль, динамические аллокации. Получится не консистентно - обычные типы всегда будут конвертироваться в C локали, пользовательские типы - в текущей. Можно конечно для basic_ostream всегда явно задавать C локаль, но это дополнительно замедлит функцию\r\n\r\n\r\n**Сергей Трифонов, 29 ноября 2017, 22:17**\r\nМне нравится больше библиотека fmtlib. Удобнее для форматирования текста.\r\n\r\n\r\n**Антон Бикинеев, 30 ноября 2017, 16:30**\r\nСергей Трифонов, есть, кстати, предложение стандартизовать эту либу: #13", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798880382/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798880715", + "html_url": "https://github.com/cpp-ru/ideas/issues/60#issuecomment-798880715", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/60", + "id": 798880715, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4MDcxNQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T10:08:45Z", + "updated_at": "2021-03-14T10:31:55Z", + "author_association": "MEMBER", + "body": "**valera_ee 21 июля 2020, 8:58**\r\nХорошая библиотека, поддерживаю, но хочется, чтобы она в stl работала быстрее, чем в boost.\r\n\r\n**yndx-antoshkka 21 июля 2020, 9:45**\r\nЕсть аналогичное предложение #59", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798880715/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798881311", + "html_url": "https://github.com/cpp-ru/ideas/issues/61#issuecomment-798881311", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/61", + "id": 798881311, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4MTMxMQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T10:14:22Z", + "updated_at": "2021-03-14T10:14:22Z", + "author_association": "MEMBER", + "body": "**Ayrtat 21 ноября 2020, 13:16**\r\nДействительно! Нужна вещь\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798881311/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798881576", + "html_url": "https://github.com/cpp-ru/ideas/issues/62#issuecomment-798881576", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/62", + "id": 798881576, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4MTU3Ng==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T10:16:27Z", + "updated_at": "2021-03-14T10:16:38Z", + "author_association": "MEMBER", + "body": "**Andrey 14 июля 2020, 11:27**\r\nРешается reflection-ом (в частности, в Reflection TS -- https://cplusplus.github.io/reflection-ts/draft.pdf -- есть get_enumerators).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798881576/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798881987", + "html_url": "https://github.com/cpp-ru/ideas/issues/63#issuecomment-798881987", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/63", + "id": 798881987, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4MTk4Nw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T10:19:56Z", + "updated_at": "2021-03-14T10:19:56Z", + "author_association": "MEMBER", + "body": "**maxon 30 июня 2020, 19:53**\r\nПервого уже сейчас можно добиться с помощью концептов:\r\n```cpp\r\ntemplate\r\nconcept Types = \r\n\tstd::is_same_v || \r\n\tstd::is_same_v || \r\n\tstd::is_same_v>;\r\n \r\n template requires Types\r\n void f(T t) \r\n {\r\n \tstd::cout << typeid(T).name() << \" - size=\" << sizeof(T) << std::endl;\r\n }\r\n```\r\n, причём гибче чем в Вашем предложении: например, вместо std::is_same можно так же использовать std::is_convertible. Ну или любые другие type_traits.\r\n\r\nВторой пример -- это, по сути, часть Reflection TS, принятия которго с нетерпением ждём.\r\n\r\n\r\n\r\n**Николай Бахтин 30 июня 2020, 22:59**\r\nКхм, может я чего-то не понимаю, я не настолько хорошо знаком с концептами, но в данном примере накладывается ограничение на тип T, либо int, либо double, либо std::vector.\r\n\r\nКак это связано с тем, что я говорил, мне непонятно. :(\r\n\r\n\r\n**Николай Бахтин 30 июня 2020, 23:54**\r\nМне кажется, что шаблонный оператор for, это довольно простая для понимания конструкция, сильно не нагружающая код (в плане зрительного восприятия), но позволяющая делать вещи, которые ранее было делать нельзя, или затруднительно.\r\n\r\nНа мой субъективный взгляд конструкция вида:\r\n```cpp\r\ntemplate\r\nfor ( T : type_range )\r\n{\r\n loop_statement\r\n}\r\n```\r\nлегко воспринимается глазами. Тут много знакомого от обычного с++.\r\n\r\n\r\n**Николай Фоменко 1 июля 2020, 13:37**\r\nПервая часть кода это вариативный шаблон:\r\n\r\n \r\n```cpp\r\n#include \r\n#include \r\n\r\ntemplate\r\nstruct Foo\r\n{\r\n static void print();\r\n};\r\n\r\n\r\ntemplate\r\nstruct Foo\r\n{\r\n static void print()\r\n {\r\n std::cout << typeid(T).name() << \" - size=\" << sizeof(T) << std::endl;\r\n Foo::print();\r\n }\r\n};\r\n\r\ntemplate<>\r\nstruct Foo<>\r\n{\r\n static void print() {}\r\n};\r\n\r\nint main()\r\n{\r\n Foo>::print();\r\n return 0;\r\n}\r\n```\r\n**Andrey 14 июля 2020, 11:23**\r\nhttp://wg21.link/P1306\r\n\r\n\r\n**Максим Некипелов 18 ноября 2020, 2:51**\r\nРефлексия будет в C++23, но гораздо в лучшем виде, чем написал ты\r\n\r\nhttp://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p1240r0.pdf\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798881987/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798882254", + "html_url": "https://github.com/cpp-ru/ideas/issues/64#issuecomment-798882254", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/64", + "id": 798882254, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4MjI1NA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T10:22:21Z", + "updated_at": "2021-03-14T10:22:21Z", + "author_association": "MEMBER", + "body": "**HedgehogInTheCPP 25 августа 2020, 23:32**\r\n\r\nТут в примере, уж если так хочется использовать goto то надо использовать goto, перегружать синтаксис не надо ;) Решение уже есть. О полезности применения goto я не говорю, но явно уже есть универсальный оператор для тех-же целей.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798882254/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798883440", + "html_url": "https://github.com/cpp-ru/ideas/issues/60#issuecomment-798883440", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/60", + "id": 798883440, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4MzQ0MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T10:31:33Z", + "updated_at": "2021-03-14T10:31:33Z", + "author_association": "MEMBER", + "body": "Закрыто в пользу #59", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798883440/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798885197", + "html_url": "https://github.com/cpp-ru/ideas/issues/65#issuecomment-798885197", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/65", + "id": 798885197, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4NTE5Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T10:45:52Z", + "updated_at": "2021-03-14T10:45:52Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 7 декабря 2016, 12:12**\r\nЕсли вы предлагаете именно расширять класс std::string новыми методами, то гарантирую что комитету не понравится идея добавить зависимость на std::locale в std::string.\r\n\r\nВ данный момент сделать нечто подобное можно будет следующим образом:\r\n* дождаться Unified call syntax\r\n* добавить множество методов для работы со строками\r\n* Unified call syntax (я на это очень надеюсь) сделает всё остальное, позволит вызывать s.to_lower_copy()\r\n\r\n**Victor Dyachenko, 7 декабря 2016, 13:09**\r\nКопировать Java, С# или ещё что-то - плохая идея, как мне кажется. Функции для работы со строками, безусловно, нужны. Но это должны быть свободные функции. Сейчас в стандартном C++ есть минимум 3 представления для строк:\r\n\r\n1) const char * + '\\0'\r\n2) std::string\r\n3) std::string_view\r\n\r\nИ ещё куча в сторонних библиотеках: ustring, CString, QString и т.п.\r\n\r\nСвободные функции позволят реализовать один интерфейс для них для всех. При таком подходе, замена одного типа на другой должна происходить абсолютно прозрачно для такого кода.\r\n\r\n\r\n**Ivan Komissarov, 8 декабря 2016, 12:51**\r\nVictor Dyachenko, посмотрел в код QString (у которых юникод). Судя по всему, toLower()/toUpper() может менять размер строки (когда lowered/uppered символ становится/перестаёт быть суррогатной парой). Получается, что для uft-8 const char* нельзя сделать inplace to_lower. Тут можно было бы возразить, что это работа локали, но, согласно, доке QString::toLower работает в С локали (в отличие от QLocale::toLower).\r\nС другой стороны, можно интерпретировать строку как latin1, как делает QByteArray::toLower (т.е. тупо игнорируя все символы с кодом > 127). Не уверен, однако, что это универсальное решение, подходящее для стандарта.\r\n\r\n**Anatoly Scheglov, 27 декабря 2016, 18:41**\r\nНет. Не нужно брать API C# или Java. Почитайте boost/algorithm/string.\r\n\r\n**Will Code For Food, 25 октября 2017, 17:23**\r\nstd::basic_string и так считается перегруженным лишними не-статическими методами, но java-утятки тащат и тащат всякий ad-hoc-мусор, типа split.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798885197/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798886483", + "html_url": "https://github.com/cpp-ru/ideas/issues/65#issuecomment-798886483", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/65", + "id": 798886483, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4NjQ4Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T10:56:53Z", + "updated_at": "2021-03-14T10:56:53Z", + "author_association": "MEMBER", + "body": "`split` сделали в C++20 с принятием ranges:\r\n```cpp\r\nstring str{\"the quick brown fox\"};\r\nfor (word : str | view::split(' ') | view::common) {\r\n cout << string{begin(word), end(word)) << '*';\r\n}\r\n```\r\nВыведет:\r\n```\r\nthe*quick*brown*fox*\r\n```\r\n\r\nЭто была одна из замых неприятных функций. Остальные функции, не использующие локали, из Boost.StringAlgo должно быть добавить сравнительно несложно https://www.boost.org/doc/libs/1_75_0/doc/html/string_algo/reference.html", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798886483/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798887641", + "html_url": "https://github.com/cpp-ru/ideas/issues/66#issuecomment-798887641", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/66", + "id": 798887641, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4NzY0MQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:06:12Z", + "updated_at": "2021-03-14T11:06:12Z", + "author_association": "MEMBER", + "body": "**Алексей Телишев 11 июня 2020, 15:52**\r\nНельзя так делать - сломается совместимость:\r\n```cpp\r\nstruct X {} f;\r\ndouble operator% (double, X) { return 0; }\r\n\r\nint main ()\r\n{\r\n auto position = 1 * 33.%f;\r\n}\r\n```\r\n\r\n**Николай Фоменко 14 июня 2020, 9:04***\r\nОчень странные примеры. И дело даже не в точности предложения чисел...\r\n\r\nМожет автор хотел этого?\r\n```cpp\r\nauto position = width / 3.0;\r\n```\r\n\r\n**Andrey 16 июня 2020, 21:20**\r\nhttps://gcc.godbolt.org/z/TzNeow", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798887641/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798888318", + "html_url": "https://github.com/cpp-ru/ideas/issues/67#issuecomment-798888318", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/67", + "id": 798888318, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4ODMxOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:11:49Z", + "updated_at": "2021-03-14T11:11:49Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 7 декабря 2016, 12:14**\r\nМне нравится идея. Если вы готовы её заниматься, я всячески буду вам помогать.\r\n\r\nНачать развивать вашу идею стоит с прототипа. У вас есть что-то на примете?\r\n\r\n**Ivan Komissarov, 7 декабря 2016, 13:56**\r\nЯ в своё время что-то фиксил в KArchive (https://api.kde.org/frameworks-api/frameworks-apidocs/frameworks/karchive/html/index.html). В целом, это не очень большой объем работы, если не одно но - используется широкий спектр внешних библиотек (напр, tar может быть пожат через gzip (deflate), а может через bzip2). Вопрос, что делать с этими библиотеками - тащить ли их в стандарт? Иметь один алгоритм (те же deflate/inflate) может быть полезно, но вот все сразу?\r\n\r\nАналогично с изображениями (я писал поддержку Direct Draw Surface (aka *.dds) и помогал писать Apple Icon Image (aka *.icns) в Qt Image Formats http://doc.qt.io/qt-5/qtimageformats-index.html). Есть повсеместно используемые libpng, libjpeg, к которым регулярно выпускаются патчи, устраняются уязвимости. Стоит ли это реинмлементить с нуля?\r\n\r\nТо есть возникает скорее вопрос - может ли стандартная библиотека зависеть от других (сишных?) библиотек.\r\n\r\n\r\n**yndx-antoshkka, 7 декабря 2016, 19:53**\r\nIvan Komissarov, не может и не должна. Но вы и не должны прописывать детали реализации. Вам нужно описать что делает каждый конкретный предлагаемый метод, а уже как его реализовывать - задача для разработчиков стандартной библиотеки.\r\n\r\nПопробуйте начать со сжатия данных. Стоит наверное посмотреть как это сделано в Boost, ограничить набор форматов архивирования некоторым подмножеством и продумывать для них интерфейс.\r\n\r\n\r\n**Сергей Прейс, 13 декабря 2016, 20:47**\r\nНе очень понятно почему это все должно быть в стандарте языка (не только С++ а вообще любого) - соответствующие форматы меняются и кажется разумным, чтобы поддержкой актуальных версий занимались разработчики форматов, а не поставщики стандартных библиотек для языков.\r\n\r\n**Сергей Ковалёв, 19 января 2017, 15:18**\r\nЕсли это будет в стандарте я только за. Взгляните на PHP язык совершенно безобразный много противоречий, но из коробки идёт всё что нужно для работы в виде расширений. Именно по этой причине он очень широко распространён. Можно быстро решить возникшую проблему, не выходя за рамки стандартных расширений. Почему-то в C++ больше смотрят на высокоуровневые вещи в ящыке и упорно продолжают его усложнять. В результате получаем очень красивый фрактал, вместо инструмента для работы.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798888318/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798888758", + "html_url": "https://github.com/cpp-ru/ideas/issues/68#issuecomment-798888758", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/68", + "id": 798888758, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4ODc1OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:15:32Z", + "updated_at": "2021-03-14T11:15:32Z", + "author_association": "MEMBER", + "body": "**Антон Рапетов, 17 марта 2017, 20:38**\r\nВообще хорошая идея. Может вместо того чтобы писать кучу пропозелов, мы соберёмся и докодим https://conan.io/ до приличного состояния?\r\n\r\n**chizhanov@doxycraft.com, 25 марта 2017, 2:52**\r\nПолностью согласен с автором. Хватит усложнять синтаксис. Когда появились шаблоны я был рад что появился отличный инструмент который сильно облегчит разработку. Но я же не думал что его станут использовать везде где не попадя что не облегчает, а усложняет. Усложняет чтение кода. Усложняет отладку. Усложняет апдейты. Я ожидал что с появлением шаблонов можно будет 100 строк заменить 5-10. Но в итоге получилось что 100 строк обычного кода, заменяются 100ей строк кода на шаблонах.\r\n\r\n**maksimus1210, 3 апреля 2017, 17:47**\r\nОчень нравятся библотеки в языке Java, они обеспечивают высокую продуктивность работы, просты, лаконичны и довольно мощные. Идею этих библиотек подхватили разработчики Qt, что благотворно сказалось на продуктивности разработки приложений на С++ и их производительности. Библиотеки STL и Boost довольно сложны и к ним нужно привыкать, проще говоря очевидные вещи там не очевидны, например, если я хочу обратиться к i-тому элементу линейного списка, то в Qt я пишу так: m_list.at(i), что бы повторить тоже самое с STL я пишу :\r\n```cpp\r\nlist::iterator it = iii.begin();\r\nstd::advance(it, 3);\r\nint a = *it;\r\n```\r\nКак видно, очевидное не очевидно. Надеюсь я понятно описал идею.\r\n\r\n\r\n**yndx-antoshkka, 3 апреля 2017, 18:19**\r\nmaksimus1210, QList это не std::list, это std::vector. У std::vector есть at(i).\r\n\r\n**Михаил Максимов, 25 апреля 2017, 15:20**\r\nНовый синтаксис языка, упрощает работу программистов: for_each, structured bindings, built-in threads, filesystem. Система сборки и управления пакетами - это отличная идея, которая не имеет отношения к стандарту языка и развитие языка не должно зависеть или быть остановлено разработкой менеджера пакетов.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798888758/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798889685", + "html_url": "https://github.com/cpp-ru/ideas/issues/69#issuecomment-798889685", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/69", + "id": 798889685, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg4OTY4NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:20:02Z", + "updated_at": "2021-03-14T11:20:02Z", + "author_association": "MEMBER", + "body": "**alexander.y.k, 8 декабря 2016, 15:54**\r\nДемонстрация проблемы (осторожно, требует 10GB RAM):\r\n```cpp\r\n#include \r\n#include \r\n\r\nint main()\r\n{\r\n std::unordered_set< int > unord;\r\n unsigned actual_buckets = unord.bucket_count();\r\n\r\n for( int i = 0; i < 256*1024*1024; ++i )\r\n {\r\n if( unord.size() + 1 >= unord.bucket_count() * unord.max_load_factor() ) {\r\n std::cout << \"Expect rehashing on \" << unord.size() + 1 << \" items.\" << std::endl;\r\n }\r\n\r\n unord.insert( i );\r\n\r\n if( actual_buckets != unord.bucket_count() ) {\r\n std::cout << \"Buckets extended from \" << actual_buckets << \" to \" << unord.bucket_count() << std::endl;\r\n actual_buckets = unord.bucket_count();\r\n }\r\n }\r\n\r\n return 0;\r\n}\r\n```\r\nВывод:\r\n```\r\n...\r\nExpect rehashing on 36473443 items.\r\nBuckets extended from 36473443 to 74066549\r\nExpect rehashing on 74066549 items.\r\nBuckets extended from 74066549 to 150406843\r\nExpect rehashing on 150406840 items.\r\nExpect rehashing on 150406841 items.\r\nExpect rehashing on 150406842 items.\r\nExpect rehashing on 150406843 items.\r\nBuckets extended from 150406843 to 305431229\r\n...\r\n```\r\n\r\n**yndx-antoshkka, 13 декабря 2016, 14:01**\r\nalexander.y.k, может в данном примере стоит использовать rehash/reserve, чтобы избежать проблемы? Или есть случаи, где rehash/reserve не помогают?\r\n\r\n**alexander.y.k, 13 декабря 2016, 20:14**\r\nyndx-antoshkka, да, это вполне возможно. Например оценивать что load_factor стал равен 90% от max_load_factor, тогда производить reserve и вставку. Единственное что смущает, что это эвристика, и она требует дополнительные усилия и внимательность чтобы сделать все правильно. Например нужно предусмотреть, что кол-во вставляемых элементов + актуальный размер коллекции будут меньше чем новый \"capacity\", а еще лучше меньше чем 90% этой величины. На мой взгляд для такой тривиальной операции сложность слишком высока.\r\n\r\nОтсюда несколько выводов: 1. трудно быть абсолютно уверенным, что наша эвристика корректно себя ведет для любой тройки величин: размера коллекции, max_load_factor и числа вставляемых элементов; 2. мы никогда не используем максимально эффективно все доступное пространство; 3. мы искажаем политику роста контейнера собственной логикой, что не критично, но намекает на проблему в стандартном дизайне.\r\n\r\nХотелось бы видеть в С++ такой уровень инженерной дисциплины, который не опирается на подобные техники.\r\n\r\nЗамечу так же, что судя по тому, что мне удалось понять из сходных кодов GCC, они уже имеют величину, которая, c дополнительной проверкой, реализует семантику capacity(), это _M_next_rehash:\r\nhttps://github.com/gcc-mirror/gcc/blob/e11be3ea01eaf8acd8cd86d3f9c427621b64e6b4/libstdc%2B%2B-v3/include/bits/hashtable_policy.h#L597\r\n\r\nНо дополнительная проверка вновь зависит от float арифметики.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798889685/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798890092", + "html_url": "https://github.com/cpp-ru/ideas/issues/70#issuecomment-798890092", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/70", + "id": 798890092, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MDA5Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:23:10Z", + "updated_at": "2021-03-14T11:23:10Z", + "author_association": "MEMBER", + "body": "**Sir-VestniK, 11 декабря 2016, 19:28**\r\n\r\n> Правда, в данный момент непонятно, как реализовать конструирование флагов от битового выражения с энумами.\r\n\r\nЯ обычно определяю QFlags operator| (my_enum, my_enum) и его одного всегда хватает.\r\n\r\nИдея обсуждалась как в группе рассылки future proposals пару раз. Может быть полезным почитать эти обсуждения чтобы учесть их в предложении:\r\n1 https://groups.google.com/a/isocpp.org/d/topic/std-proposals/NBZXi_E67qg/discussion\r\n2 https://groups.google.com/a/isocpp.org/d/topic/std-proposals/1RPxJSJ_0z8/discussion\r\n\r\nP.S. У меня есть переносимый миленький шаблончик для подобных вещей: http://my-it-experiments.blogspot.ru/2015/11/blog-post.html методом копипасты таскаю его между разными проектами где нет Qt.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798890092/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798890445", + "html_url": "https://github.com/cpp-ru/ideas/issues/71#issuecomment-798890445", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/71", + "id": 798890445, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MDQ0NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:25:55Z", + "updated_at": "2021-03-14T11:25:55Z", + "author_association": "MEMBER", + "body": "**Олег Ляттэ, 13 декабря 2016, 10:30**\r\nА откуда такой transform будет знать, что результат нужно складывать именно в vector, а не list или ещё какой-нибудь deque? Не уверен, что из итераторов на входе можно надёжно определить контейнер для хранения, тем более, что в качестве итераторов мы можем использовать пару указателей на каким-то хитрым способом выделенную память.\r\n\r\n**dix75, 13 декабря 2016, 10:54**\r\nСоглашусь с предыдущим постом. Если Вам необходимо такое поведение напишите враппер или их коллекцию\r\n\r\n**Дмитрий, 19 декабря 2016, 16:28**\r\nfoo | ranges::view::transform(op_increase) | ranges::to_vector;\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798890445/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798890652", + "html_url": "https://github.com/cpp-ru/ideas/issues/72#issuecomment-798890652", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/72", + "id": 798890652, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MDY1Mg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:27:40Z", + "updated_at": "2021-03-14T11:27:40Z", + "author_association": "MEMBER", + "body": "**Andrey 29 мая 2020, 16:40**\r\nВы же понимаете, что 0 < i < 100 это уже компилирующий код? Вы предлагаете поменять его смысл.\r\n\r\n\r\n**Falen 30 мая 2020, 14:40**\r\nAndrey, а вы считает текущий смысл - нормальный в большинстве случаев ?\r\n\r\nДавайте придумаем аналог, но он был бы очень полезен.\r\n\r\n\r\n\r\n**Andrey 30 мая 2020, 17:29**\r\nFalen, есть случаи, когда текущий смысл \"нормальный\": http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0893r1.html#WhichExprs. Все уже придумано до нас.\r\n\r\n\r\n**Андрей Бурмагин 9 июня 2020, 13:12**\r\nAndrey, может тогда просто добавить в стандартную библиотеку функцию std::in_range(), принимающую три числовых параметра и возвращающую булево значение?\r\n\r\n\r\n**Andrey 9 июня 2020, 18:47**\r\nАндрей Бурмагин, мое мнение, что от такой функции хуже не будет, но и пользы большой в добавлении таких мелочей в стандарт я не вижу. Хотя прецедент уже есть -- clamp.\r\n\r\n\r\n**Андрей Попандопуло 18 июня 2020, 13:58**\r\nАндрей Бурмагин, подобная функция не учтёт inclusive и exclusive использования границ сравнения. \r\n\r\n\r\n**Андрей Попандопуло 18 июня 2020, 14:06**\r\nЭто действительно было неприятно, если приходилось многократно сравнивать результат некого вызова, ранее до появления конструкции if с инициализацией. И тогда, возможно, был смысл в подобной конструкции. Однако, теперь, на мой взгляд, в этом мало смысла. Например, код, приведённый ниже, даже выглядит по смыслу вполне наглядно и не плодит лишних переменных, нужных лишь для сравнения:\r\n\r\n`if (auto &&val {calc()}; 0 < val && val < 100) ... `", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798890652/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798891160", + "html_url": "https://github.com/cpp-ru/ideas/issues/71#issuecomment-798891160", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/71", + "id": 798891160, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MTE2MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:31:13Z", + "updated_at": "2021-03-14T11:31:13Z", + "author_association": "MEMBER", + "body": "Как верно заметили выше - std::ranges позволяют делать нечто подобное.\r\n\r\nК несчастью, пока не приняли `std::ranges::to`, так что вместо\r\n```cpp\r\nauto vect = foo | views::transform(op_increase) | ranges::to;\r\n```\r\nпридётся писать\r\n```cpp\r\nauto common_view = foo | views::transform(op_increase) | views::common;\r\nstd::vector vect(common_view.begin(), common_view.end());\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798891160/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798891666", + "html_url": "https://github.com/cpp-ru/ideas/issues/74#issuecomment-798891666", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/74", + "id": 798891666, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MTY2Ng==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:34:26Z", + "updated_at": "2021-03-14T11:34:26Z", + "author_association": "MEMBER", + "body": "**Magomed Kostoev 19 июля 2020, 17:05**\r\nПрям мысли прочли, как раз хотел прийти сюда с таким же предложением.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798891666/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798892004", + "html_url": "https://github.com/cpp-ru/ideas/issues/73#issuecomment-798892004", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/73", + "id": 798892004, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MjAwNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:37:29Z", + "updated_at": "2021-03-14T11:37:29Z", + "author_association": "MEMBER", + "body": "**Сергей Прейс, 13 декабря 2016, 20:17**\r\nМожет стоит сделать у коллекций дополнительный параметр в шаблоне - concurency_policy примерно как execution_policy для алгоритмов сделали.\r\n\r\n**f03n1x, 14 декабря 2016, 10:54**\r\nСергей, это очень клевая идея, но она несколько большего масштаба, чем просто одна структура данных :). На самом деле это еще связано с интерфейсом этих объектов. Для того, чтобы сделать так как вы хотите необходимо, чтобы у обычных, многопоточных и lock-free коллекций был одинаковый интерфейс. Не факт, что такое в принципе возможно сделать.\r\n\r\n**yndx-antoshkka, 14 декабря 2016, 14:44**\r\nСергей Прейс, дополнительный параметр в шаблоне добавить нельзя: это поменяет ABI а значит такая идея в комитете C++ не пройдёт.\r\n\r\n**Сергей Прейс, 15 декабря 2016, 13:01**\r\nf03n1x, ну в общем да, согласен. Ради одной коллекции не стоит наводить общность. Просто кажется, что иметь две разных реализации одной концепции под разными именами немного странно. Кажется, что более правильно сделать что-то с существующей концепцией.\r\n\r\n\r\n**Сергей Прейс, 15 декабря 2016, 13:11**\r\nyndx-antoshkka, порядка 70 шаблонов в получили новый параметр в C++17 (execution_policy). Но наверное я понимаю о чем вы: для функций это получилось сделать из-за перегрузки (overloading) а для классов такого механизма не существует. В принципе unordered_map в этом случае остаётся концептуально прежним, меняется только реализация, так что нет необходимости добавлять параметр в шаблон - можно добавить конструкторы с новым параметром concurency_policy, который будет влиять на внутреннюю реализацию, но не на ABI.\r\n\r\n**konyuchenko.nikita, 7 января 2017, 11:21**\r\nЯ бы скорей предпочел видеть что-то на вроде такого:\r\n```cpp\r\ntemplate<\r\n class Key,\r\n class T,\r\n class Hash = std::hash,\r\n class KeyEqual = std::equal_to,\r\n class Allocator = std::allocator< std::pair >\r\n> class unordered_map\r\n : public generic_unordered_map<\r\n Key,\r\n T,\r\n Hash,\r\n KeyEqual,\r\n Allocator,\r\n std::concurrent_policy::none>;\r\n\r\ntemplate<\r\n class Key,\r\n class T,\r\n class Hash,\r\n class KeyEqual,\r\n class Allocation,\r\n class ConcurrentPolicy\r\n> class generic_unordered_map;\r\n```\r\nConcurrent Policies:\r\nnone\r\nlock_free - several implementations for platforms (ARM needs different implementation than x86)\r\nmutex_based\r\netc.\r\n\r\nПри этом в unordered_map дополнительный шаблонный параметр не попадает (хотя ABI все равно меняется)\r\n\r\n\r\n**Victor Gubin, 2 октября 2017, 23:07**\r\nТут только Хеш таблица, еще есть и Skip List, стеки Трайбера и т.д.\r\n\r\nСвяжитесь с автором http://www.boost.org/doc/libs/1_62_0/doc/html/lockfree.html , все что в boost - изначально кандидаты в стандартную библиотеку.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798892004/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798892048", + "html_url": "https://github.com/cpp-ru/ideas/issues/75#issuecomment-798892048", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/75", + "id": 798892048, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MjA0OA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:37:49Z", + "updated_at": "2021-03-14T11:37:49Z", + "author_association": "MEMBER", + "body": "**Georgy Firsov 4 мая 2020, 11:54**\r\nТак для этого есть концепты. Можно написать концепт как конъюнкцию из нескольких \r\n\r\nstd::is_same\r\n\r\n**Aracks 4 мая 2020, 12:31**\r\nGeorgy Firsov, я ждал такого коментария. И концепты - это другое по ряду причин:\r\n* Во-первых, если я хочу именно ограничить набор значений аргумента шаблона перечеслением некоторого конечного количества типов, то это неудобно делать концептами.\r\n* Во-вторых, концепты не могут гарантировать, что количество возможных значений аргумента будет конечным, а, следовательно, главная задумка будет невыполнима.\r\n\r\nОсновная суть моего предложения - это позволить писать шаблоны в cpp файле так, что бы компилятор сразу генерировал N вариантов специализаций в объектнике и более не трогал данный шаблон при последующих перекомпиляциях, что бы не замедлять сборку.\r\n\r\n\r\n**Aracks 4 мая 2020, 12:34**\r\nGeorgy Firsov, а, да, и второй вариант использования, из предложенных мною, концептами, насколько я знаю, вообще не может быть реализован.\r\n\r\n\r\n**Andrey 4 мая 2020, 12:33**\r\nТого что вы хотите можно и сейчас достичь следующим образом.\r\n\r\nВ header-е пишется объявление\r\n\r\ntemplate\r\nvoid my_func(const std::basic_string& cr_value);\r\nВ .cpp она определяется, и явно инстацируется:\r\n```cpp\r\ntemplate void my_func(const std::string& cr_value);\r\ntemplate void my_func(const std::wstring& cr_value);\r\ntemplate void my_func(const std::u8string& cr_value);\r\ntemplate void my_func(const std::u16string& cr_value);\r\ntemplate void my_func(const std::u32string& cr_value);\r\n```\r\n**Aracks 4 мая 2020, 12:35**\r\nAndrey, а реализации? Мне копипаст делать для всех?\r\n\r\n\r\n**Aracks 4 мая 2020, 12:38**\r\nAndrey, Если поместить реализацию в заголовочник, то она будет компилироваться столько раз, сколько данный заголовочник включён в разные cpp-файлы.\r\n\r\nЕсли же поместить в cpp, то придётся делать копипаст.\r\n\r\n\r\n**Andrey 4 мая 2020, 12:53**\r\nAracks, копипаст делать не придется, почитайте о том что такое explicit template instantiation.\r\n\r\n\r\n**Aracks 4 мая 2020, 12:58**\r\nAndrey, да, прошу прощения. Это в точности то, что нужно, хотя и с более длинным синтаксисом.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798892048/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798892396", + "html_url": "https://github.com/cpp-ru/ideas/issues/76#issuecomment-798892396", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/76", + "id": 798892396, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MjM5Ng==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:40:54Z", + "updated_at": "2021-03-14T11:40:54Z", + "author_association": "MEMBER", + "body": "**Roman K. 15 апреля 2020, 16:56**\r\nМожно добавить реализацию для \r\n\r\nstd::hash>\r\n\r\n**gbalog 24 июля 2020, 7:46**\r\nRoman K., да, такой вариант хорош, но не лишён недостатков. например, при нём нельзя передать кастомный seed.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798892396/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798892532", + "html_url": "https://github.com/cpp-ru/ideas/issues/77#issuecomment-798892532", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/77", + "id": 798892532, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MjUzMg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:41:50Z", + "updated_at": "2021-03-14T11:41:55Z", + "author_association": "MEMBER", + "body": "**Georgy Firsov 4 марта 2020, 23:12**\r\nМожно использовать итераторы для этой цели.\r\n\r\nВ векторе и списке итераторы соответствуют требованию InputIterator, а значит к ним можно применить std::advance (со сдвигом на положительное значение). В итоге получением итератора на первый элемент подпоследовательности и заданием длины этой подпоследовательности в сущности получаем аналог substr для std::vector, std::list, std::forward_list\r\n\r\n\r\n**Aracks 1 мая 2020, 11:31**\r\nЯ так понимаю, что Вы пытаетесь добавить функционал на подобие, как в питоне, который позволяет оперировать произвольными подсписками списков. Только боюсь, что для стандартных STL-контейнеров это не подойдёт, ибо простые задачи, как уже сказал Georgy Firsov, легко решаются итераторами, а какие-то сложные манипуляции с подсписками попросту будут неэфффективно работать на стандартных STL-коллекциях. \r\n\r\nВот если бы в STL были бы мета-коллекции, которые не хранят элементы на самом деле, а лишь представляются коллекциями, то такой функционал был бы для них полезен. Только вот такие мета-коллекции - это, скорее, функционал для СУБД и нужен-ли он в C++ сообще?\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798892532/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798892703", + "html_url": "https://github.com/cpp-ru/ideas/issues/78#issuecomment-798892703", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/78", + "id": 798892703, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MjcwMw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:43:08Z", + "updated_at": "2021-03-14T11:43:08Z", + "author_association": "MEMBER", + "body": "**Nate Reinar Windwood 8 марта 2020, 11:45**\r\nhttps://en.cppreference.com/w/cpp/container/set/erase_if\r\n\r\nАлсо, по идее, Ranges позволяют это делать через filter и (|=). Не нужно лишних сущностей.\r\n\r\n\r\n**Antervis 10 марта 2020, 14:45**\r\nNate Reinar Windwood, filter не умеет работать in_place, а erase_if не умеет делать действия над элементами (если не выносить его в предикат, но это введет среднего читающего в ступор)\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798892703/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798893073", + "html_url": "https://github.com/cpp-ru/ideas/issues/79#issuecomment-798893073", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/79", + "id": 798893073, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MzA3Mw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:45:53Z", + "updated_at": "2021-03-14T11:46:09Z", + "author_association": "MEMBER", + "body": "**Игорь Гусаров 4 марта 2020, 15:06**\r\nЗдравствуйте, Николай!\r\n\r\n1. В чём видится основная польза от миксинов? Т.е. какую проблему (или неудобство) они позволяют решить? Дадут ли они только новый синтаксис вызова, или предполагается как-то их использовать (\"подмешивать\") в определения классов?\r\n\r\n2. Вероятно, в примерах опечатка и интерфейсы должны были быть объявлены как шаблоны? Иначе не совсем понятно, на что влияет параметр в угловых скобках, например CStringUtils.\r\n\r\n3. Если основной целью является возможность вызвать strlen(c_string) в виде c_string.strlen(), то это уже пытались ввести в язык. Пока безуспешно. У предложения нашлись как ярые сторонники, так и ярые противники. Чтобы не пересказывать здесь всю историю, взгляните на документы P0131R0 (обсуждение возникающих проблем), N4474 (первоначальное предложение) и P0251R0 (более узкое предложение, которое всё равно не прошло).\r\n\r\n\r\n**Николай Бахтин 5 марта 2020, 22:13**\r\n>>1. В чём видится основная польза от миксинов?\r\n\r\nХороший вопрос требует хорошего ответа. Надо будет над этим подумать.\r\n\r\n \r\n\r\n>>2. Вероятно, в примерах опечатка и интерфейсы должны были быть объявлены как шаблоны? Иначе не совсем понятно, на что влияет параметр в угловых скобках, например CStringUtils.\r\n\r\nМоя мысль была в том, что \"подмешивание\" методов миксинов в структуры и классы происходит только тогда, когда мы указываем это явно. Конструкция вида:\r\n\r\nusing имя-интерфейса<имя-типа>;\r\n\r\nговорит о том, что в этой области видимости мы для указанного типа подмешиваем методы указанного интерфейса. Если такого указания не делать, то никакого \"подмешивания\" не происходит. Пример:\r\n```cpp\r\nvoid function1(const char* name)\r\n{\r\n using CStringUtils;\r\n size_t name_len = name.strlen(); //Ok\r\n}\r\n\r\nint main()\r\n{\r\n const char* name = \"Tomas\";\r\n function1(name);\r\n size_t name_len = name.strlen(); //Error\r\n\r\n return 0;\r\n}\r\n```\r\n \r\n\r\nВозможно данный вариант синтаксиса не самый лучший. Можно было бы как-то подругому, например:\r\n```cpp\r\nusing CStringUtils(const char*);\r\nusing CStringUtils : const char*;\r\nusing CStringUtils[const char*];\r\nusing CStringUtils for const char*;\r\n```\r\n>>3. ... взгляните на документы P0131R0 (обсуждение возникающих проблем), N4474 (первоначальное предложение) и P0251R0 (более узкое предложение, которое всё равно не прошло)...\r\n\r\nСпасибо за информацию\r\n\r\n\r\n\r\nИгорь Гусаров 6 марта 2020, 2:03\r\nА, то есть вот в этом примере должно было быть две директивы using?\r\n```cpp\r\nusing Parent1;\r\n\"Hello World\".Method1(some_string);\r\n\r\nusing Parent1>;\r\nstd::map params;\r\nparams.Method2(\"addr\");\r\n```\r\n\r\n**Николай Бахтин 6 марта 2020, 6:39**\r\nДа, все верно. Это я ошибся .\r\n\r\n**Nate Reinar Windwood8 марта 2020, 11:27**\r\nНе нужна отдельная сущность, лучше допилить концепты до полноценных тайпклассов.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798893073/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798893673", + "html_url": "https://github.com/cpp-ru/ideas/issues/80#issuecomment-798893673", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/80", + "id": 798893673, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5MzY3Mw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:50:47Z", + "updated_at": "2021-03-14T11:50:47Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 21 февраля 2020, 16:19*\r\nСкорей всего будут примеры кода, которые меняют рантайм поведение из-за этого. Нужно продумать подобные случаи, и показать что уже сейчас они не являются переносимыми.\r\n\r\n\r\n**Alexandr Timofeev 22 февраля 2020, 0:31**\r\nyndx-antoshkka, так как expressions в return statements не являются xvalue, я уточнил причину. Это сделано из-за старых non-copyable but Cpp17CopyContructable типов. Для поддержки таких типов можно позаимствовать поведение overload resolution из http://eel.is/c++draft/class.copy.elision#3 \r\n\r\nЕдинственное изменение рантайм поведения которое мне приходит в голову это сайд эффекты?\r\n\r\n\r\n\r\n**Игорь Гусаров 25 февраля 2020, 20:01**\r\nAlexandr Timofeev, отличия будут не только в сайд-эффектах, но ещё и в моменте фактического разрушения объекта:\r\n```cpp\r\nstruct Test\r\n{\r\n int value = 3;\r\n};\r\n\r\nvoid bar(shared_ptr);\r\n\r\nvoid foo(shared_ptr x, int* ptr)\r\n{\r\n bar(x); // This is the last use of `x`.\r\n\r\n // If `x` was implicitly moved to call `bar`,\r\n // then `Test` object could get destroyed.\r\n\r\n // Question: what if `ptr` was pointing\r\n // to `Test::value` member of that object?\r\n *ptr = 56;\r\n}\r\n```\r\n\r\n**Alexandr Timofeev 26 февраля 2020, 0:59**\r\nИгорь Гусаров, действительно, пример:\r\n```cpp\r\nint main() {\r\n std::shared_ptr ptr{};\r\n auto i = ptr->value; // good\r\n foo(ptr, &i); // last use of ptr, can move\r\n}\r\n\r\nint main() {\r\n std::shared_ptr ptr{};\r\n auto pi = &ptr->value; // oh, no!\r\n foo(ptr, pi); // last use of ptr? \r\n}\r\n```\r\nФактически, это значит любой вызов мембер функции объекта либо передача объекта по ссылке либо взятие указателя на объект - не дает неявно сделать мув, так как потенциально адрес объекта может быть сохранен во внешнее состояние и компилятор при текущих возможностях не может доказать что на объект ничто не ссылается. \r\n\r\nЭто оставляет юз кейз пробрасывания локальной переменной без использования мембер функций либо _только_ по значению, либо, возможно, пробрасывание их в конструктор?\r\n\r\nПолучилось довольна интересная дискуссия, однако польза выглядит крайне сомнительно относительно проблемных юз кейзов, которые как раз таки наоборот усложнят логику решения где использовать мув явно, а где нет, из-за того что компилятор не может гарантировать что не происходит что-то необычное с адресом локальной переменной.\r\n\r\n\r\n\r\n**Игорь Гусаров 26 февраля 2020, 22:35**\r\n \r\n\r\nAlexandr Timofeev, простите, что недостаточно чётко озвучил суть того примера: код, рантайм-поведение которого изменится с появлением неявного мува, целиком находится внутри функции foo и, как мне кажется, не зависит от того, применяется ли неявный мув к вызову самой foo.\r\n\r\nНо если конкретный способ вызова foo важен, то он может быть таким:\r\n```cpp\r\nint main()\r\n{\r\n Test* p = new Test;\r\n int* i = &p->value;\r\n foo(shared_ptr{p}, i);\r\n}\r\n\r\nint main()\r\n{\r\n auto p = make_shared();\r\n int* i = &p->value;\r\n foo(move(p), i);\r\n}\r\n```\r\nПовторюсь, мне кажется, что конкретный способ как вызвать функцию так, чтобы разные аргументы ссылались на один и тот же ресурс - не важен. Shared_ptr и функция с двумя аргументами - это только иллюстрация.\r\n\r\nОтвет на предположение Антона заключался в том, что при муве RAII-объекта поменяется момент фактического освобождения ресурса: ресурс будет освобождён не в деструкторе исходного, а в деструкторе нового объекта. Что в некоторых случаях может повлиять на логику программы.\r\n\r\n\r\n**Alexandr Timofeev 27 февраля 2020, 16:07**\r\nИгорь Гусаров, действительно. Я абсолютно упустил такой юз кейз. При этом можно представить несинтетический пример для такой ситуации. Например что-то похожее на идиому shared_from_this в АСИО, только с передачей указателя на текущий объекта в параметрах функций по значению при асинхронных операциях. \r\n\r\nТем более что это порождает недетерминированное время жизни ресурсов, так как становится очень легко упустить вроде бы невинный локальный объект. \r\n\r\n\r\n\r\n**Игорь Гусаров 21 февраля 2020, 19:33**\r\nСаттер действительно утверждал, что последнее использование автоматического объекта можно спрогнозировать на этапе компиляции? Даже в следующем примере?\r\n```cpp\r\nvoid foo(SomeClass x)\r\n{\r\n bar(x); // Is this the last use of 'x'?\r\n\r\n int val;\r\n std::cin >> val;\r\n\r\n if (val > 5)\r\n baz(x);\r\n}\r\n```\r\n\r\n**Alexandr Timofeev 21 февраля 2020, 19:58**\r\nИгорь Гусаров, спасибо за прекрасный пример!\r\n\r\n\r\nДа, Саттер действительно утверждает что это можно сделать в общем случае:\r\nhttps://youtu.be/qx22oxlQmKc?t=1514\r\n\r\nОн ссылается на исследование времени жизни объектов для С++ в https://wg21.link/p1179r1 где приводится глава по поводу ветвления на основе рантайм переменной, более специфично https://godbolt.org/z/WqK1wT .\r\n\r\nТак, в вашем примере последнем использованием является только baz(x), что справедливо и для кода написанного человеком. \r\n\r\n \r\n\r\n\r\n**Andrey 22 февраля 2020, 12:27**\r\nAlexandr Timofeev, а как это должно работать в таком случае?\r\n```cpp\r\nstruct X { ... };\r\n\r\nstruct Y {\r\n X x1, x2;\r\n\r\n Y(X&&, X&&); \r\n Y(X const &, X&&);\r\n Y(X&&, X const &);\r\n Y(X const &, X const &);\r\n};\r\n\r\nY f() {\r\n X x = ...;\r\n return { x, x };\r\n}\r\n```\r\n\r\n**Alexandr Timofeev 22 февраля 2020, 14:21**\r\nAndrey, это кстати отличный пример где как раз таки неявные мувы помогут избежать ошибок.\r\n\r\nНа практике многие эксперты очень часто имеют трудности в том чтобы вспомнить в каких случаях order of evaluation определен. \r\n\r\nТак, в вашем примере используются лист инициализация, порядок определен слева на право - поэтому последнем определенным использованием `x` является последний аргумент, что позволяет нам написать: \r\n```cpp\r\nY f1() {\r\n X x = X{};\r\n return { x, std::move(x) }; // Y(X const &, X&&);\r\n}\r\n```\r\nОднако, в другой ситуации:\r\n```cpp\r\nY bar(X x1, X x2) {\r\n return { std::move(x1), std::move(x2) };\r\n}\r\n\r\nY f2() {\r\n X x = X{};\r\n return bar(x, std::move(x)); // Oh, no!\r\n}\r\n```\r\nВероятность человеческой ошибки очень велика. Однако компилятор точно знает что раз порядок не определен, то `x` не имеет определенного последнего использования. \r\n\r\nТут могут возникнуть два изменения поведения:\r\n1. Патологический пример:\r\n```cpp\r\nstruct Y {\r\n X x1, x2;\r\n\r\n Y(X&&, X&&); \r\n Y(X const &, X&&) = delete;\r\n Y(X&&, X const &);\r\n Y(X const &, X const &);\r\n};\r\n```\r\n2. Сайд эффекты\r\n```cpp\r\nvoid erase_filesystem();\r\nvoid backup_filesystem();\r\n\r\nstruct Y {\r\n X x1, x2;\r\n\r\n Y(X&&, X&&); \r\n Y(X const &, X&&) { erase_filesystem(); }\r\n Y(X&&, X const &);\r\n Y(X const &, X const &) { backup_filesystem(); }\r\n};\r\n```\r\n\r\n\r\n** Alexandr Timofeev 22 февраля 2020, 14:41**\r\nAndrey, я к сожалению упустил момент что в данной ситуации внутри конструктора мы получим ссылки на один и тот же объект, что может поломать поведение внутри функции.\r\n\r\n\r\n**Alexandr Timofeev 22 февраля 2020, 15:07**\r\nAndrey, действительно, следуя http://eel.is/c++draft/res.on.arguments#1.3 , то автоматическое преобразование к xvalue возможно только если в текущем expression переменная биндится не более одного раза. По [p1179] это можно отследить, в том числе даже непрямые зависимости в разделе 2.5.2. \r\n\r\nОпять же, в данном случае механизм неявного преобразования помог бы избежать ошибки тем что он бы учел данное правило. \r\n\r\n\r\n**Alexandr Timofeev 22 февраля 2020, 16:32**\r\nАльтернативная проблема https://godbolt.org/z/BX-DCf\r\n```cpp\r\n#include \r\n#include \r\n\r\nstd::string_view wrap(std::string_view sv) {\r\n return sv;\r\n}\r\n\r\nextern void consume(std::string);\r\nextern void use(std::string_view);\r\n\r\nvoid foo() {\r\n auto s = std::string(\"123\");\r\n auto sv = wrap(s);\r\n consume(s);\r\n use(sv);\r\n}\r\n```\r\n\r\n\r\n\r\n**Alexandr Timofeev 22 февраля 2020, 23:54**\r\nПродолжая проблему, любое выражение, которое биндит аргумент по ссылке/указателю, которе при этом не является последним выражением в локальной области, препятствует неявным мувам, потому что потенциально значение может сохраниться в глобальный стейт и использоваться в функциях дальше. \r\n\r\n\r\n**Игорь Гусаров 25 февраля 2020, 20:13**\r\nЕщё нужно продумать, чтобы неявное move-конструирование аргуметнов не мешало писать код, предоставляющий strong exception guarantee.\r\n\r\nСейчас при простом вызове функции с передачей аргументов по значению соблюдаются все требования strong exception guarantee:\r\n```cpp\r\nvoid bar(SomeObject y);\r\n\r\nvoid foo(SomeObject x)\r\n{\r\n bar(x); // If `bar` throws, the value of `x` is not modified.\r\n}\r\n```\r\nВ случае же неявного мува, уже не получится сохранить исходное значение x при вылете исключения из bar.\r\n\r\n\r\n**Alexandr Timofeev 25 февраля 2020, 23:31**\r\nИгорь Гусаров, с другой стороны, является ли состояние \"x\" наблюдаемым состоянием программы в случае если только ее последнее использование мувит? Ведь та же классическая имплементация copy-swap делается через параметры по значению.\r\nПриведите пожалуйста более расширенный пример когда мы можем наблюдать нарушение гарантии. \r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798893673/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798894783", + "html_url": "https://github.com/cpp-ru/ideas/issues/81#issuecomment-798894783", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/81", + "id": 798894783, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODg5NDc4Mw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T11:59:18Z", + "updated_at": "2021-03-14T11:59:18Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 21 февраля 2020, 16:16**\r\nДля этого в C++20 можно использовать std::bit_cast\r\n\r\n\r\n**Никита Колотов 13 июня 2020, 20:03**\r\nyndx-antoshkka, std::bit_cast не является constexpr когда хотя бы один из параметров является указателем\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798894783/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798926681", + "html_url": "https://github.com/cpp-ru/ideas/issues/77#issuecomment-798926681", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/77", + "id": 798926681, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5ODkyNjY4MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-14T15:27:05Z", + "updated_at": "2021-03-14T15:27:05Z", + "author_association": "MEMBER", + "body": "C++20 Ranges добавляют необходимый функционал:\r\n```cpp\r\nauto sub = container | std::views::drop(3) | std::views::take(5);\r\nauto sub1 = std::views::counted(container.begin() + 3, 5); // assert contqiner.size() >= 3\r\nauto sub2 = std::ranges::subrange(container.begin() + 3, container.begin() + 8); // assert contqiner.size() >= 8\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/798926681/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799263856", + "html_url": "https://github.com/cpp-ru/ideas/issues/82#issuecomment-799263856", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/82", + "id": 799263856, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTI2Mzg1Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T09:28:54Z", + "updated_at": "2021-03-15T09:28:54Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 13 декабря 2016, 13:54**\r\n\r\nМожно уже сейчас делать через static_assert:\r\n```cpp\r\ntemplate\r\nstruct Cool {\r\n static_assert(!is_same_v, \"Запрещено!\");\r\n\r\n void print() {}\r\n};\r\n```\r\n\r\n**dix75, 14 декабря 2016, 15:01**\r\nДа. Согласен. Более того у меня было такое же мнение. Но после того как Комитет ввел ключевое слово delete для удаления функций-член, которые мы десятилетиями помещали в private секции\r\nсвое мнение изменил.\r\nЯвное удаление имплиментации унифицирует процесс разработки и на ряду с явным инстацированием шаблонов, некоторая реализация помеченная как delete делает код более читабельным с одной стороны и позволит компиляторам оптимизировать процесс (например поиска) с другой.\r\n\r\n**develoit, 23 декабря 2016, 4:41**\r\n```cpp\r\ntemplate <>\r\nstruct Cool\r\n{ Cool() = delete; };\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799263856/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799269636", + "html_url": "https://github.com/cpp-ru/ideas/issues/82#issuecomment-799269636", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/82", + "id": 799269636, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTI2OTYzNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T09:36:19Z", + "updated_at": "2021-03-15T09:36:19Z", + "author_association": "MEMBER", + "body": "Недавно рассматривали похожее предложение https://wg21.link/P2041 и основное возражение - \"Слабая мотивация\".\r\n\r\nНужно придумать кейсы, когда `= delete` действительно даёт преимущества.\r\n\r\nПока что\r\n- `static_assert` даёт диагностику лучше, чем `= delete`, но является hard error (не работает со SFINAE)\r\n- концепты SFINAE дружелюбны и дают такую же плохую диагностику, как и `= delete`. Читаемость кода при этом приблизительно одинаковая. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799269636/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799278501", + "html_url": "https://github.com/cpp-ru/ideas/issues/83#issuecomment-799278501", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/83", + "id": 799278501, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTI3ODUwMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T09:48:00Z", + "updated_at": "2021-03-15T09:48:00Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 14 декабря 2016, 14:03**\r\nКак я понимаю, вы хотите именно улучшить какой-то алгоритм/имплементацию, и хотите чтобы вам было удобно это делать на свой лад...\r\n\r\nЕсли вы инжинер-разработчик новой платформы/архитектуры, то у вас такой проблемы не возникает в принципе - у вас своя имплементация стандартной библиотеки и вы можете делать что хотите; либо вы свои расширения добавляете в одну из уже имеющихся стандартных библиотек.\r\n\r\nЕсли вы не \"автор\" платформы, а разработчик хорошо разбирающийся в теме - добавьте ваши расширения в имеющиеся стандартные библиотеки. Миллионы людей скажут вам \"спасибо\", ваш браузер будет работать быстрее, игрушки удвоят FPS и т.д.\r\n\r\nНу а если вы разбираетесь, но о других не заботитесь... то зачем другим заботиться об упрощении вашей жизни, ценой усложнения своей?\r\n\r\nЯ категорически против того, чтобы упрощать и поощрять неправильные подходы к разработке.\r\n\r\n**Сергей Прейс, 15 декабря 2016, 14:17**\r\nyndx-antoshkka,\r\nЯ тоже категорически против того, чтобы упрощать и поощрять неправильные подходы к разработке, но я также против того, чтобы существующие стандартные библиотеки пухли от платформо-зависимого или алгоритмо-специфического кода.\r\n\r\nЕсли я \"автор\" платформы/архитектуры зачем мне клонировать и тащить всю стандартную С++ библиотеку? Существующие публичные библиотеки по большей части состоят из стандартного переносимого С++ кода и кажется, что прямое переиспользование этого кода - это более правильный подход к разработке, чем создание копии с небольшими отличиями.\r\n\r\nЕсли в моей прикладной системе нужны/возможны оптимизации для определенных специализаций стандартных алгоритмов, я не вижу зачем пихать их в существующие реализации стандартных библиотек. Тем более, что\r\n(1) Они вполне могут быть совместимы с любой реализации и пихать их во все реализации кажется странным\r\n(2) Не все распространенные реализации стандартных библиотек вообще допускают добавление туда стороннего кода.\r\n\r\nВ обоих случаях кажется более правильно распространять специфические реализации отдельно и независимо от стандартных библиотек.\r\n\r\nНа самом деле почти то, что я хочу уже и так есть в стандарте, но с определенными ограничениями:\r\n§ 17.6.4.2.1 475©ISO/IEC N4606\r\nA program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited...\r\n\r\nСобственно всего лишь хочется иметь возможность делать специализации для встроенных и библиотечных типов и отключать библиотечные специализации.\r\n\r\nСкажем, в библиотеке совместимой с C++17 будет некая реализация алгоритмов для parallel_unsequenced_policy. Она будет описана в наряду с последовательными реализациями и опираться на какие-то средства поддержки многопоточности (скажем std::thread). Хочется иметь возможность заменить эту реализацию на другую (скажем основанную на TBB) без необходимости тащить к себе последовательные реализации.\r\n\r\n**yndx-antoshkka, 20 декабря 2016, 14:16**\r\nЭто уже можно делать, если вы разработчик стандартной библиотеки: [Note: This provision reserves the privilege of creating non-standard execution policies to the library implementation. — end note]\r\n\r\nЕсли вам хочется более продвинутые способы выполнения - добавляйте их сразу в стандартную библиотеку. Если они очень хороши - можем помочь с добавлением их в стандарт.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799278501/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799322411", + "html_url": "https://github.com/cpp-ru/ideas/issues/84#issuecomment-799322411", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/84", + "id": 799322411, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTMyMjQxMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T10:54:56Z", + "updated_at": "2021-03-15T10:54:56Z", + "author_association": "MEMBER", + "body": "**f03n1x, 16 декабря 2016, 15:23**\r\nЯ бы предложил еще предоставить возможность использования типов с неограниченной точностью.\r\n\r\n**yndx-antoshkka, 19 декабря 2016, 20:59**\r\nf03n1x, это отдельный proposal http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4038.html , мы им не занимаемся. Но при желании, вы можете предложить свою помощь авторам.\r\n\r\n**Anatoly Scheglov, 27 декабря 2016, 17:16**\r\nКлючевое слово \"иногда\". По сравнению с другими стандартными библиотеками (строки, алгоритмы, etc) необходимость в такой библиотеке исчезающе мала.\r\n\r\n**yndx-antoshkka, 14 февраля 2017, 17:08**\r\nЕсть сразу два предложения на тему:\r\n* http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0104r1.html\r\n* http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0539r0.html\r\n\r\nКому какие предложения больше нравятся и почему? Передам ваши соображения на заседании.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799322411/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799334665", + "html_url": "https://github.com/cpp-ru/ideas/issues/85#issuecomment-799334665", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/85", + "id": 799334665, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTMzNDY2NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T11:12:30Z", + "updated_at": "2021-03-15T11:12:30Z", + "author_association": "MEMBER", + "body": "**none, 20 декабря 2016, 19:17**\r\nчем static constexpr auto npos = std::string::npos; не устроил?\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799334665/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799337723", + "html_url": "https://github.com/cpp-ru/ideas/issues/85#issuecomment-799337723", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/85", + "id": 799337723, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTMzNzcyMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T11:17:17Z", + "updated_at": "2021-03-15T11:18:31Z", + "author_association": "MEMBER", + "body": "В C++ `using` хорошо работает для enum, но не работает для значений.\r\n```cpp\r\nstruct struct_v { static constexpr int value = 42; };\r\nenum class enum_v { value = 42 };\r\n\r\nvoid test() {\r\n using enum_v::value;\r\n //using struct_v::value; // compilie time error\r\n}\r\n```\r\n\r\nКажется что тут есть что подправить и стоит сделать поведение симметричным с enum", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799337723/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799350846", + "html_url": "https://github.com/cpp-ru/ideas/issues/86#issuecomment-799350846", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/86", + "id": 799350846, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTM1MDg0Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T11:39:18Z", + "updated_at": "2021-03-15T11:39:18Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 19 декабря 2016, 20:55**\r\nМне кажется, что нет необходимости заниматься Precompiled header, когда в комитете вот-вот должны стандартизировать модули. Они будут уметь больше чем Precompiled header и должны лучше ускорять сборку проекта.\r\n\r\n**dix75, 20 декабря 2016, 10:11**\r\nyndx-antoshkka,\r\nВот-вот уже длится годами, и даже если появятся потребность в Precompiled header не отпадет.\r\n\r\n**yndx-antoshkka, 20 декабря 2016, 18:49**\r\nModules == Precompiled header + много всего полезного.\r\n\r\nБольшинство присутствующих в комитете будут против работы над устаревшей технологией Precompiled header, и предпочтут вместо этого сконцентрировать силы на новой - Modules.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799350846/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799352648", + "html_url": "https://github.com/cpp-ru/ideas/issues/86#issuecomment-799352648", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/86", + "id": 799352648, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTM1MjY0OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T11:42:24Z", + "updated_at": "2021-03-15T11:42:24Z", + "author_association": "MEMBER", + "body": "В C++20 появились модули, которые стандартизуют практики по оформлению кода для получения модуля и обладают всем функционалом Precompiled Headers.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799352648/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799413842", + "html_url": "https://github.com/cpp-ru/ideas/issues/87#issuecomment-799413842", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/87", + "id": 799413842, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTQxMzg0Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T13:20:54Z", + "updated_at": "2021-03-15T13:21:08Z", + "author_association": "MEMBER", + "body": "**Михаил Мальцев, 19 декабря 2016, 15:15**\r\nСм. #13 \r\n\r\n**dix75, 19 декабря 2016, 16:40**\r\nМихаил Мальцев,\r\nДа похоже, но не совсем то,\r\nВ c# 6 дополнительно поддерживается дополнительное форматирование\r\nпример:\r\n```\r\n$\"\\t'{file.name}' encrypted\";\r\n```\r\n**yndx-antoshkka, 20 декабря 2016, 13:55**\r\nА у вас есть рабочий прототип предложения?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799413842/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799447081", + "html_url": "https://github.com/cpp-ru/ideas/issues/88#issuecomment-799447081", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/88", + "id": 799447081, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTQ0NzA4MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T14:05:20Z", + "updated_at": "2021-03-15T14:05:20Z", + "author_association": "MEMBER", + "body": "**Anatoly Scheglov, 27 декабря 2016, 18:38**\r\nВо всех примерах только `make_from_tuple`.\r\nТо что `make_from_tuple` не проверяет отсутствие пользовательского конструктора - это проблема ее реализации.\r\nКортеж это не массив, поэтому в примере с vector было бы странно получить вектор {4,1} из кортежа.\r\n\r\n**Дмитрий, 27 декабря 2016, 21:02**\r\nAnatoly Scheglov,\r\n\r\n> Во всех примерах только make_from_tuple.\r\nВраньё.\r\n\r\n> То что make_from_tuple не проверяет отсутствие пользовательского конструктора - это проблема ее реализации.\r\n\r\nПроблема функции make_from_tuple в том, что с её помощью принципиально невозможно проинициализировать объект при помощи фигурных скобок.\r\n\r\n> Кортеж это не массив, поэтому в примере с vector было бы странно получить вектор {4,1} из кортежа.\r\n\r\nВо-первых, std::vector здесь приведён для простоты. Все знают, что у него есть и такой, и сякой конструкторы. Благодаря этому не нужно вставлять в пример самопальные классы.\r\nВо-вторых, \"странность\" — понятие субъективное. Если пользователю нужно позвать именно такой конструктор именно с этими значениями кортежа, то он имеет на это право. Если типы не сойдутся, то компилятор подскажет, что не так.\r\n\r\nТак что критика не принимается.\r\nЕщё раз внимательно перечитайте предложение.\r\n\r\n**Victor Dyachenko, 28 декабря 2016, 14:54**\r\nА чем перегрузка функций по тэгу лучше просто двух функций? Вроде\r\n\r\nmake_from_tuple_parens()\r\nmake_from_tuple_braces()\r\n\r\nПодобные тэги нужны только в конструкторах, потому как имя там выбрать нельзя.\r\n\r\nА по поводу невозможности использовать emplace()/make_unique() для типов без конструктора, вроде обычных структур, так на это уже много лет как заведён дефект в Комитете, и даже решение уже есть, но вот что-то так оно и лежит без движения.\r\n\r\n**Дмитрий, 30 декабря 2016, 1:05**\r\nVictor Dyachenko,\r\n\r\n> А чем перегрузка функций по тэгу лучше просто двух функций?\r\n\r\nКонкретно в случае с make_from_tuple я бы предпочёл вообще другое решение. Подробнее об этом я писал здесь: https://groups.google.com/a/isocpp.org/forum/?fromgroups#!topic/std-discussion/aQQzL0JoXLg\r\n\r\nНу а в целом, кажется, что это покрасивее и поуниверсальнее. Потому что для каждой функции делать ещё по два варианта с какими-то суффиксами — не очень хорошо. К тому же теги можно использовать в связке с метапрограммированием.\r\n\r\n> решение уже есть\r\n\r\nЕсли речь идёт об этом: http://cplusplus.github.io/LWG/lwg-active.html#2089 , то это полумера. Это решение не подразумевает возможности явного выбора способа инициализации. А я считаю, что такая возможность всё-таки нужна.\r\n\r\n**yndx-antoshkka, 20 января 2017, 11:52**\r\nЕсли у вас есть силы дальше работать над идеей, могу помочь с написанием proposal и обсуждениями в международной рассылке.\r\n\r\n**Дмитрий, 26 февраля 2017, 15:41**\r\nСоздал тему на форуме: https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/Wnl9w53uAiY\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799447081/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799504448", + "html_url": "https://github.com/cpp-ru/ideas/issues/89#issuecomment-799504448", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/89", + "id": 799504448, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTUwNDQ0OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T15:19:28Z", + "updated_at": "2021-03-15T15:19:28Z", + "author_association": "MEMBER", + "body": "**dix75, 21 декабря 2016, 19:28**\r\nБолее сложный пример\r\n```cpp\r\ntemplate\r\ntypename std::result_of::type select(R fun) {\r\n using result_t = typename std::result_of::type;\r\n auto const id = ...;\r\n return id != 0u ? fun(query) : result_t{};\r\n}\r\n```\r\n\r\n**Дмитрий, 23 декабря 2016, 1:55**\r\ndix75,\r\nКонкретно в этом случае тернарка заменяется на\r\n```cpp\r\nif (id != 0u) return fun(query);\r\nelse return {};\r\n```\r\nИ result_t не нужен.\r\n\r\nВсё-таки хотелось бы увидеть более осмысленные случаи применения, потому что пока складывается впечатление, что вы хотите чего-то странного.\r\n\r\n**dix75, 30 декабря 2016, 16:09**\r\ndmitriy@izvolov.ru,\r\nУважаемый это упрощенный код (идея).\r\n\r\n**develoit, 23 декабря 2016, 4:30**\r\ntemplate \r\nauto/decltype(auto) select(R...)\r\n{\r\n...\r\nreturn ...;\r\n}\r\n\r\nauto выведение типа в помощь, в общем)\r\n\r\n**dix75, 30 декабря 2016, 12:34**\r\ndeveloit,\r\nУважаемый это упрощенный код (идея).\r\n\r\n**dix75, 30 декабря 2016, 12:57**\r\nЕще пример\r\n```cpp\r\ntemplate\r\nauto max(X x, Y y) -> decltype(x + y) {\r\n decltype(result) _1 = {};\r\n return _1;\r\n}\r\n```\r\nВ качестве выражения в decltype могут выступать более сложные заготовки.\r\np.s. Обращаю внимание, это тестовый пример. Не нужно давать советы, как написать правильно существующими средствами. Главная идея добавления в стандарт чего-либо, облегчить написание и понимание кода.\r\n\r\n**Дмитрий, 30 декабря 2016, 21:16**\r\ndix75,\r\n\r\nИ снова достаточно `return {}`.\r\nПожалуйста, покажите хотя бы один пример, когда конструкция `decltype(return)` действительно необходима.\r\n\r\n**dix75, 5 января 2017, 0:43**\r\ndmitriy@izvolov.ru,\r\nХм. Давайте серьезно подходить к решению проблемы.\r\n1. Ваш ответ не верен, т.к не отвечает требованию создания переменой с областью видимости в функции. decltype(result) _1 = {};\r\n2. Я намеренно опустил вычисления внутри функции.\r\n3. Данную задачу можно решить существующими средствами с++, также как и большинство предложенных вещей в с++ 11 и даже 98\r\n\r\n**Олег Ляттэ, 9 января 2017, 1:09**\r\nПочему я поставил палец вверх этой идее:\r\n\r\n1. Дублирование информации (в т.ч. в коде) - не есть хорошо. Если мы один и тот же тип пишем в двух и более местах, при этом он везде должен быть одинаков (иначе в лучшем случае ошибка компиляции, в худшем - некорректное поведение), то это потенциальный источник ошибок при последующей поддержке кода (рефакторинг, багофикс, и т.д.).\r\n\r\n2. Если приходится писать не простой тип (одно-два коротких слова), а применять некоторое количество шаблонной (или и того круче - препроцессорной) магии, то даже просто чтение кода может сильно затрудниться. Не говоря о его поддержке.\r\n\r\n3. Не всегда можно обойтись плэйсхолдером auto. Например может понадобиться вызвать шаблонную функцию, которую нужно явно специализировать типом (если из аргументов все нужные типы не выводится). Или пропустить возвращаемый тип через мясорубку трэйтов (для каких-то проверок, допустим). Или в конце концов просто сделать typeid() возвращаемого типа (для какой-нибудь проверки, для поиска в пуле, для вывода сообщения в лог - да мало ли зачем).\r\n\r\nВот пример функции, которая создаёт UI контрол для переменной какого-то типа:\r\n```cpp\r\n/* для простоты принимаются и возвращаются сырые указатели вместо чего-то более безопасного/удобного/гибкого */\r\ntemplate\r\ntypename control_traits::control_type* create_control(T* value_ptr) {\r\n if(auto ctrl = static_pool.find::control_type>()) {\r\n ctrl->bind(value_ptr);\r\n return ctrl;\r\n } else {\r\n auto new_ctrl = new typename control_traits::control_type(value_ptr);\r\n static_pool.add(new_ctrl);\r\n return new_ctrl;\r\n }\r\n}\r\n```\r\nУже выглядит немного вырвиглазно. А вывод типа может ещё более усложниться, если мы, к примеру, будем брать control_traits не от T непосредственно, а от некоего обобщенного типа (чтобы для short int, unsigned char и int использовался один контрол c перегруженными конструктором и bind). Добавим ещё немножко чего-нибудь - и вот у нас уже паровоз, который надо разбивать на несколько строк. А потом ещё и копипастить.\r\n\r\nА так мы могли бы один раз вывести возвращаемый тип в прототипе функции, а потом просто использовать тот же decltype(return). Да, мы можем сделать using (или по старинке typedef) где-то в начале тела функции, но это всё равно как минимум одна копипаста.\r\n\r\n**yndx-antoshkka, 9 января 2017, 12:48**\r\nОлег Ляттэ, вы приводите примеры, которые я обычно использую чтобы доказать что decltype(return) не нужен:\r\n```cpp\r\ntemplate\r\nusing control = typename control_traits::control_type;\r\n\r\ntemplate\r\ncontrol* create_control(T* value_ptr) {\r\n if(auto ctrl = static_pool.find*>()) {\r\n ctrl->bind(value_ptr);\r\n return ctrl;\r\n } else {\r\n auto new_ctrl = new control(value_ptr);\r\n static_pool.add(new_ctrl);\r\n return new_ctrl;\r\n }\r\n}\r\n```\r\nПрошу заметить, что\r\ncontrol* короче чем\r\ndecltype(return)\r\n\r\nИ при этом намного понятнее и красивее.\r\n\r\n\r\nДавайте я вам приведу пример своего кода, где decltype(return) будет к месту:\r\n```cpp\r\ntemplate \r\nconstexpr size_array fields_count_and_type_ids_with_zeros() noexcept {\r\n size_array types{};\r\n constexpr std::size_t N = fields_count();\r\n flat_type_to_array_of_type_ids(types.data, std::make_index_sequence());\r\n return types;\r\n}\r\n```\r\nУ этого примера есть один недостаток: он ужасен и его надо переписать. С `decltype(return)` вся его ужасность не так сильно будет бросаться в глаза - что огромный минус.\r\n\r\nВсе примеры где `decltype(return)` был к месту - были примерами ужасного кода и `decltype(return)` просто маскировал эту ужасность.\r\n\r\n**Олег Ляттэ, 9 января 2017, 16:22**\r\nyndx-antoshkka, но ведь добавление нового типа (алиаса) в глобальной области видимости вместо вывода прямо в прототипе функции - скорее обход проблемы, чем её решение, т.к. требуется \"занять\" дополнительное имя (чего на мой взгляд стоит по возможности избегать).\r\n\r\nПо поводу ужасности кода. Во-первых, оценка степени ужасности кода - вещь довольно субъективная, и конструктивно спорить тут очень сложно (если возможно).\r\n\r\nВо-вторых, мы живём в далеко не идеальном мире, и многие практические решения (в т.ч. и успешно работающие в продакшене) очень многие наши коллеги назовут ужасными/кошмарными/отвратительными. И будут скорее всего правы. Но этот код работает, и переписывать его с нуля - совсем не факт, что когда-нибудь станут (работает - не трогай). Но что-то починить и поправить очень возможно, что придётся. Так почему бы не дать инструмент, чтобы как-то нивелировать эту ужасность? Код будет легче читаться и сопровождаться, а плохие архитектурные решения - на мой взгляд проблема ортогональная обсуждаемой здесь, и может/должна решаться в отрыве от \"сахарных\" возможностей компилятора.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799504448/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799512103", + "html_url": "https://github.com/cpp-ru/ideas/issues/90#issuecomment-799512103", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/90", + "id": 799512103, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTUxMjEwMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T15:28:50Z", + "updated_at": "2021-03-15T15:28:50Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 9 января 2017, 12:03**\r\nА подобный подход вас утроит:\r\n```cpp\r\ntemplate\r\nstd::string operator % (const std::string& format, const std::tuple& args) {\r\n return /* ... */;\r\n}\r\n// usage\r\nint main() {\r\n using namespace std::literals;\r\n std::cout << \"cool %i\\n\" % std::make_tuple(10);\r\n std::cout << \"cool %i = %s\\n\" % std::make_tuple(10, \"strange\"s);\r\n}\r\n```\r\n\r\n**dix75, 9 января 2017, 12:37**\r\nyndx-antoshkka,\r\nКак вариант, конечно да. Я эту проблему решаю имеено так, но здесь нет красоты.\r\nПостоянно писать std::make_tuple утомительно.\r\nОчень часто приходится писать небольшие print, json, xml и другие выводы в поток в файл и др.\r\nИ таким образом будет понятно, что я хочу сделать:\r\n```cpp\r\n\"{ name: %1 }\"._json(Object);\r\n\"%1\"._xml(Object);\r\n\"name is %1\"._print(Object);\r\n```\r\n\r\n**yndx-antoshkka, 9 января 2017, 13:01**\r\nо! А вот так:\r\n```cpp\r\nstruct my_string_view {\r\n const char* data;\r\n\r\n template \r\n std::string operator()(Args&&... args) const {\r\n return /* ... */;\r\n }\r\n};\r\n\r\nconstexpr my_string_view operator \"\" _print(const char* format, std::size_t) {\r\n return {format};\r\n}\r\n```\r\nТогда получается что ваш синтаксис работает:\r\n```cpp\r\n// usage\r\nint main() {\r\n using namespace std::literals;\r\n std::cout << \"cool %i\\n\"_print(10);\r\n std::cout << \"cool %i = %s\\n\"_print(10, \"strange\"s);\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799512103/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799515218", + "html_url": "https://github.com/cpp-ru/ideas/issues/90#issuecomment-799515218", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/90", + "id": 799515218, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTUxNTIxOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T15:32:43Z", + "updated_at": "2021-03-15T15:32:43Z", + "author_association": "MEMBER", + "body": "Запрошенный синтаксис можно применять начаиная с C++14. Для этого нужен пользовательский литерал, возвращающий объект с перегруженным `operator()`, как показано выше.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799515218/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799519293", + "html_url": "https://github.com/cpp-ru/ideas/issues/91#issuecomment-799519293", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/91", + "id": 799519293, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTUxOTI5Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T15:38:00Z", + "updated_at": "2021-03-15T15:38:00Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 9 января 2017, 11:55**\r\nЛично я - ярый противник всякого \"синтаксического сахара\" в ядре языка. Добавление таких вещей упрощает написание кода, но ведёт к абсолютно нечитаемому коду:\r\n```\r\nwhile (foo ~~ { @... }) {\r\n return {} unless foo != bar;\r\n foo += $&;\r\n} else {\r\n static decltype(return) var;\r\n var += @ + ...;\r\n ++ g{hello}{word}[1:var:max];\r\n var;\r\n}\r\n{}\r\n```\r\n\r\nВ случае с пинтоновскими слайсами есть большой недостаток: все три аргумета `operator[::]` имеют одинаковый тип и крайне легко ошибиться в порядке их передачи.\r\n\r\nОднако, если добавлять функционал наподобие `operator[::]` не в ядро языка, а в виде свободных функций - у меня возражений не будет:\r\n```cpp\r\nfor (auto i : xrange(10))\r\n std::cout << i << std::endl;\r\n\r\nfor (auto i : creverse(vect))\r\n std::cout << i << std::endl;\r\n\r\nfor (auto i : crange(vect, 0, end, 2))\r\n std::cout << i << std::endl;\r\n```\r\n\r\n**dix75, 9 января 2017, 12:26**\r\nyndx-antoshkka,\r\nУ меня складывается ощущение, что большое кол-во нововведений в новый стандаот, это синтаксический сахар.\r\n\r\n**Дмитрий, 9 января 2017, 18:44**\r\nКаким будет тип результата воздействия данного оператора, например, на указатель?\r\n```cpp\r\n// decltype(pointer[a:b:c]) = ?\r\n```\r\n\r\n**Садченко Игорь, 28 марта 2017, 15:00**\r\nСлайсы уже есть в некотором проявлении в valarray.\r\nhttp://en.cppreference.com/w/cpp/header/valarray\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799519293/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799556179", + "html_url": "https://github.com/cpp-ru/ideas/issues/92#issuecomment-799556179", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/92", + "id": 799556179, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTU1NjE3OQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T16:25:48Z", + "updated_at": "2021-03-15T16:25:48Z", + "author_association": "MEMBER", + "body": "**Alexander 3 марта 2020, 23:43**\r\nБыло бы неплохо провести исследование, как много кода сломается от такого изменения :)\r\n\r\n\r\n**riad 8 марта 2020, 13:20**\r\nAlexander, есть какие-то тулзы для этого?\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799556179/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799558997", + "html_url": "https://github.com/cpp-ru/ideas/issues/93#issuecomment-799558997", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/93", + "id": 799558997, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTU1ODk5Nw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T16:29:09Z", + "updated_at": "2021-03-15T16:29:09Z", + "author_association": "MEMBER", + "body": "**Antervis 14 февраля 2020, 11:51**\r\nэто предложение Герба Саттера \"unified function call syntax\" (который не торопятся принимать в стандарт) с добавлением extension'а (а вот эту штуку явно не хотят добавлять в стандарт).\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799558997/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799560401", + "html_url": "https://github.com/cpp-ru/ideas/issues/94#issuecomment-799560401", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/94", + "id": 799560401, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTU2MDQwMQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T16:30:54Z", + "updated_at": "2021-03-15T16:30:54Z", + "author_association": "MEMBER", + "body": "**Игорь Гусаров 30 января 2020, 14:22**\r\n1. Он планируется перегружаемым?\r\n\r\n2. Учитывая разрешение объявления переменных в условии if, можно попробовать обобщить эту практику, разрешив объявление переменных в условии оператора ?:.\r\n\r\nauto result = (auto x = foo()) ? x : otherFoo;\r\n\r\nauto ptr = (auto p = strchr(line, '=')) ? p + 1 : \"\";\r\n\r\n**Antervis 11 февраля 2020, 19:01**\r\nдилемма в том, что чаще нужно что-то типа\r\n\r\nstring* p = foo();\r\nreturn p ? *p : \"null\";\r\nчто как раз и наводит нас на вопрос о перегружаемости. Для std::optional было бы удобно:\r\n\r\nreturn foo() ?: \"abc\";\r\n// вместо\r\nauto res = foo(); // optional\r\nreturn res ? *res : \"abc\";\r\n\r\n\r\n**Андрей Попандопуло 18 июня 2020, 14:28**\r\nПредлагаемый синтаксис скорее заставит и компилятор и интеллисенс задуматься о том, что на лицо явная синтакическая ошибка. Предложение Игря Гусарова выглядит в этом случае предпочтительнее. На мой взгляд, лучше, чтобы такой оператор вообще был похож на if с инициализацией. Например:\r\n\r\nauto result = (auto &&val {calc()}; val < 0) ? 0 : val;\r\nВ отличии оригинального предложения, где сравнение (в С# или Javascript) происходит с null, сдесь можно производить любое сравнение без многократного вызова кода, создающего сравниваемое значение. Естественно, scope этой переменной сам оператор.\r\nГолосую \"за\" саму идею, но предлагаемый синтаксис, как по мне, - не очень.\r\n\r\n\r\n\r\n**Jovibor 19 июня 2020, 3:22**\r\nАндрей Попандопуло,\r\n\r\nМожно и так. Правда это более громоздко.\r\n\r\nОсновная-же идея здесь это однострочность, и лишь однократный вызов предикатной ф-ии.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799560401/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799562180", + "html_url": "https://github.com/cpp-ru/ideas/issues/95#issuecomment-799562180", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/95", + "id": 799562180, + "node_id": "MDEyOklzc3VlQ29tbWVudDc5OTU2MjE4MA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-15T16:33:18Z", + "updated_at": "2021-03-15T16:33:18Z", + "author_association": "MEMBER", + "body": "**zamazan4ik@tut.by 22 января 2020, 23:04**\r\nУ Вас есть какие-то оценки о том, сколько кода сломается? :)\r\n\r\n\r\n**Никита Колотов 26 января 2020, 21:42**\r\nzamazan4ik@tut.by, Не так много. По большей части сломается только уже сломанный, неподдерживаемый код, в первую очередь старые проекты под Visual Studuo, в которой до недавнего времени диагностика такого рода проблем ограничивалась обнаружением использования неинициализированных переменных. Проекты под g++ и clang++ собираемые хотя бы с минимальным уровнем предупреждений -Wall (в который входит -Wreorder) по идее не должны потребовать правок. Осознание сложностей с неправильным порядком инициализаторов пришло достаточно давно - диагностика Wreorder появилась более 10 лет назад, так что данное предложение по сути просто попытка закрепить устоявшуюся практику.\r\n\r\n\r\n**Alexander 27 января 2020, 13:29**\r\nНикита Колотов, я это понимаю. Но навскиду и я могу говорить. Я более чем уверен, что есть куча кодовой базы, которая собирается без этого варнинга\\забивает на него. Поэтому это может отломать работающий нормально код.\r\n\r\nЕсли приведёте статистику, которую вы соберёте хотя бы по Open Source проектам, к своему предложению, будет превосходно. Если что, могу дать отправную точку, как это делать :)\r\n\r\n\r\n**Никита Колотов 27 января 2020, 22:58**\r\nAlexander, Скажем так, проекты, которые не задают при сборке даже минимального уровня предупреждений (то бишь даже без -Wall), я бы не стал характеризовать как \"работающий нормально код\". Статистику собрать было бы конечно хорошо, но как собрать достаточно объемную достоверную статистику - это вопрос. Первое, что приходит в голову - поискать на гитхабе: поиск [c++] -Wall дает 11М+ результатов по коду 1M по коммитам, а -Wno-reorder только 36К по коду и только 625 коммитов.\r\n\r\n\r\n\r\n**webreh 19 февраля 2020, 9:44**\r\nДля начало надо это deprecate, и никакой код не сломается.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/799562180/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800048195", + "html_url": "https://github.com/cpp-ru/ideas/issues/96#issuecomment-800048195", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/96", + "id": 800048195, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDA0ODE5NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T08:08:57Z", + "updated_at": "2021-03-16T08:08:57Z", + "author_association": "MEMBER", + "body": "**Sir-VestniK, 9 января 2017, 18:22**\r\nКак быть если в перечислении встречаются одинаковые по значению, но разные по имени элементы?\r\n```cpp\r\nenum class A {a = 1, b, c = 1};\r\nvoid foo(A val) {std::cout << static_cast(val);}\r\n\r\nfoo(A::a);\r\nfoo(A::c);\r\n```\r\nНа сколько я понимаю генеральную линию партии, то путь к выяснению строкового представления элемент енума лежит через http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0194r2.html\r\n\r\n**mrgordonfreman, 9 января 2017, 18:47**\r\nСмысл тут не в том, чтобы просто получить строковое представление элемента как есть. С этим как раз должны справиться последние предложения по рефлексии.\r\nХочется иметь возможность дополнительно \"нагрузить\" какое-либо перечисление human-readable текстом.\r\nОдинаковые значения перечисления тут никак не влияют. Мы же имеем дело со strongly typed enum и A::a != A::c\r\n\r\n**Sir-VestniK, 10 января 2017, 5:56**\r\nmrgordonfreman, Вообще-то A::a == A::c == static_cast(1); На этапе исполнения данные два значения неотличимы. Аргумент val у функции foo в моём примере это просто int и только компилятор (не сильно жёстко, static_cast(100500) только в C++17 станет UB) проверяет что в этот int складывают только 1 (A::a, A::c) или 2 (A::b).\r\n\r\nА по поводу добавления доп информации, может хочется разрешить использовать в качестве underlying-type не только численные типы?\r\n```cpp\r\nstruct named_color {\r\n uint32 rgba;\r\n const char* name;\r\n};\r\nenum class fuxed_palette: named_color {\r\n red = {0xff000000, \"Red\"},\r\n green = {0x00ff0000, \"Green\"},\r\n...\r\n};\r\n```\r\nПомоему это решение способно дать куда больше чем просто добавление строковой метаинформации к элементам перечислений. Ещё в списках рассылки SG7 (подгруппа по рефлексии) несколько раз обсуждали возможность определять свои атрибуты и доступаться до пользовательских атрибутов навешанных на опреледения через статическую рефлексию. Но в первую техническую спецификацию ничего такого включать не хотят.\r\n\r\n**mrgordonfreman, 10 января 2017, 11:46**\r\nSir-VestniK, про A::a == A::c в рантайме все верно, я имел в виду что компилятор их может различить при желании, когда будет генерировать таблицы со строковой информацией. А вот когда будет решать обратную задачу - в рантайме по значению получить строковое представление, то тогда неопределенность возникнет.\r\nВ таком случае это скорее проблема пользователя, который завел две сущности с одним значением. Самому потом не отличить их будет. Беда в том, что язык это позволяет.\r\nМне нравится идея использовать в качестве underlying-type не только целочисленные, а хотя бы еще и POD-типы. Моим страданиям это поможет. Вот только реализовать это крайне проблематично будет) В след за этим придется доработать оператор switch, и разрешить как-нибудь задавать пользовательскую функцию сравнения элементов енума (например, когда вместо memcmp захочется сравнивать по какому-то одному уникальному полю структуры)\r\n\r\n**Sir-VestniK, 10 января 2017, 13:32**\r\nmrgordonfreman,\r\nЭто не беда что язык позваляет одинаковые значения разным элементам перечисления присваивать. Периодически это бывает очень полезно, например при версионировании форматов (например можно посмотреть как QDataStream::Version эту фичу использует)\r\n\r\nА switch на старте не требуется подстраивать\r\n```cpp\r\nfixed_palette palete_color = ...;\r\nswitch (palete_color.rgba) {\r\ncase fixed_palette::green.rgba: do_smth1(); break;\r\ncase fixed_palette::red.rgba: do_smth2(); break;\r\n...\r\n}\r\n```\r\n.rgba постоянно может и не очень удобно писать, и ограничения на enum underlying type и ограничения на значения в switch одновременно убрать будет сложней чем по шагам. В целом я обеими руками за использование пользовательских типов имеющих constexpr конструктор в качестве enum underlying type.\r\n\r\n**mrgordonfreman, 11 января 2017, 11:55**\r\nSir-VestniK, есть уже оформленный пропозал на эту тему? Наверняка этим кто-то уже занимался\r\n\r\n**Sir-VestniK, 11 января 2017, 12:05**\r\nmrgordonfreman, среди того что я читал в списке https://groups.google.com/a/isocpp.org/forum/#!forum/std-proposals такого не проскакивало, но там не всё и я подписался и регулярно стал его читать только последние месяца 4. Можно спросить там, за одно и собрать больше конструктивной критики.\r\n\r\n**yndx-antoshkka, 11 января 2017, 17:27**\r\nНе получится придумать решение, которое бы устраивало всех. Что делать если значение enum не равно ни одному из заданных значений:\r\n```cpp\r\ncolor с = static_cast(777);\r\ncolor с = red | blue;\r\n```\r\nСуществующий подход намного гибче и позволяет точно настраивать вывод:\r\n```cpp\r\nostream& operator<<(ostream& os, color c) {\r\n if (c&green) os << \"greeny\";\r\n switch(c) {\r\n case blue: return os << \"blue\";\r\n case red: return os << \"red color\";\r\n }\r\n\r\n return os << static_cast(c);\r\n}\r\n```\r\n\r\n**Sir-VestniK, 11 января 2017, 18:11**\r\nyndx-antoshkka, а как насчёт идеи из обсуждения выше, про возможность использовать любой тип значения которго можно создавать constexpr выражением в качестве underlying type для enum class?\r\n\r\nЭто бы закрывало и проблему mrgordonfreman'а и открывало бы множество новых возможностей. Например, если нужно взаимодействовать со скриптовыми языками, то возможность использовать string_view или хотя бы const char* в качестве значений элементов перечисления которое должно просовываться в скрипт было бы очень удобным.\r\n\r\n**mrgordonfreman, 12 января 2017, 9:23**\r\nyndx-antoshkka, для одного енума можно написать отдельную функцию вывода, но что делать когда таких енумов несколько? Приходится писать много однотипного кода. Иногда люди вообще std::map заводят для хранения строковых констант. Например, у нас в проекте элементы енума должны выводится кирилицей, поэтому элементарная рефлексия не поможет. В обсуждении сошлись на мысли использовать в качестве underlying типа, значения которого можно создавать constexpr выражением.\r\n\r\n**yndx-antoshkka, 20 января 2017, 11:48**\r\n\r\n> любой тип значения которго можно создавать constexpr выражением в качестве underlying type для enum class?\r\n\r\nЭто очень интересная мысль. Что если её расширить и требовать, чтобы только *значения* перечисления были constexpr выражениями и не накладывать никаких ограничений на сам класс:\r\n```cpp\r\nenum class my_string : std::string{}; // strong typedef, OK\r\nenum class alloved_values : std::string_view {\r\n hello = \"Hello\", // constexpr constructible. OK\r\n empty // constexpr default constructible. OK\r\n};\r\n\r\nДополнительно надо подумать про операторы:\r\n```cpp\r\nenum class my_int: int {};\r\nmy_int i = 10;\r\nmy_int j = 11;\r\ni += j; // currently not allowed\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800048195/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800053565", + "html_url": "https://github.com/cpp-ru/ideas/issues/97#issuecomment-800053565", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/97", + "id": 800053565, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDA1MzU2NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T08:17:42Z", + "updated_at": "2021-03-16T08:17:42Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 января 2017, 17:54**\r\nПодобные вещи в стандарте не прописываются. Единственное что можно сделать - завести feature request в GCC и CLANG, чтобы выдавались предупреждения в случае неверного использования std::memory_order. При этом стоит продумать какие комбинации \"сомнительны\".\r\n\r\nЕсли заведёте feature request - скиньте сюда пожалуйста ссылку.\r\n\r\n**konyuchenko.nikita, 11 января 2017, 5:13**\r\nyndx-antoshkka, А если изменить суть memory_order?\r\nВот примерно так:\r\n```\r\n1 #include \r\n2\r\n3 #define UNUSED(a) do {(void)(a);}while(false);\r\n4\r\n5 namespace my {\r\n6 struct memory_order_aquire{};\r\n7 struct memory_order_relaxed{};\r\n8 struct memory_order_consume{};\r\n9 struct memory_order_acquire{};\r\n10 struct memory_order_release{};\r\n11 struct memory_order_acq_rel{};\r\n12 struct memory_order_seq_cst{};\r\n13\r\n14 template \r\n15 void store(const Type& val, MemoryOrder&&);\r\n16\r\n17 template \r\n18 void store(const Type&, memory_order_acquire&&){\r\n>> 19 static_assert(false, \"memory_order_acquire is not supported for the store operation\");\r\n20 }\r\n21\r\n22 template \r\n23 void store(const Type&, memory_order_release&& ){\r\n24 std::cout << \"valid store\" << std::endl;\r\n25 }\r\n26\r\n27\r\n28 template \r\n29 struct atomic{\r\n30 template void store(const Type& value){\r\n31 my::store(value, MemoryOrder());\r\n32 }\r\n33 };\r\n34 }\r\n35\r\n36 int main() {\r\n37 using namespace my;\r\n38 atomic ai{};\r\n39 ai.store(10);\r\n40 ai.store(11);\r\n41 return 0;\r\n42 }\r\n```\r\n\r\n**konyuchenko.nikita, 11 января 2017, 5:17**\r\nyndx-antoshkka, Вот примерно чем закончилось общение с msvc:\r\nhttps://connect.microsoft.com/VisualStudio/feedback/details/812014/vs-2013-rtm-with-nov-ctp-neither-generates-instructions-nor-reports-a-compile-time-error\r\n\r\n**yndx-antoshkka, 11 января 2017, 17:32**\r\nМенять существующие интерфейсы - нельзя. Это гарантированно не пройдёт голосование.\r\n\r\n> ai.store(11);\r\n\r\nЛюди в комитете стараются избегать ситуаций, когда пользователю придётся писать template при вызове функций. В вашем случае:\r\n```cpp\r\ntemplate \r\nvoid foo(T& ai) {\r\n ai.template store(10);\r\n}\r\n```\r\n\r\n**Пётр К, 16 января 2017, 17:30**\r\nyndx-antoshkka, чем шаблоны плохи? Ведь, действительно, здесь лучше бы в шаблон\r\n\r\nХижинский пишет, что https://habrahabr.ru/post/197520/\r\n\"Единственное объяснение C++11 подхода, которое приходит мне на ум, — пресловутая совместимость с C. Ведь помимо класса std::atomic стандарт C++11 вводит свободные C-шные атомарные функции atomic_load, atomic_store и пр.\"\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800053565/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800069802", + "html_url": "https://github.com/cpp-ru/ideas/issues/97#issuecomment-800069802", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/97", + "id": 800069802, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDA2OTgwMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T08:43:32Z", + "updated_at": "2021-03-16T08:43:32Z", + "author_association": "MEMBER", + "body": "Завёл тикеты на компиляторы:\r\n* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99612\r\n* https://bugs.llvm.org/show_bug.cgi?id=49604", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800069802/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800070930", + "html_url": "https://github.com/cpp-ru/ideas/issues/98#issuecomment-800070930", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/98", + "id": 800070930, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDA3MDkzMA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T08:45:24Z", + "updated_at": "2021-03-16T08:45:24Z", + "author_association": "MEMBER", + "body": "**Игорь Гусаров 23 января 2020, 14:13**\r\n1. Обратная совместимость.\r\nЛюбое предложение, которое ломает существующий код (даже с самыми благими намерениями!), с большой вероятностью будет отклонено. Для выдвижения ломающих предложений нужно, чтобы был показан _колоссальный_ выигрыш от них. Боюсь, что в данном случае выигрыш звучит не очень убедительно: \"защититься от возможных ошибок кодирования, от которых и так можно защититься имеющимися в языке средствами\".\r\n\r\n2. Унификация.\r\nС точки зрения generic programming лучше, чтобы все типы вели себя по возможности единообразно. Например, есть предложение [P0146R1 Regular Void](http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0146r1.html). Оно нацелено на унификацию войда с остальными типами, чтобы в шаблонном коде можно было написать \"auto x = foo();\" или \"promise.set_value(foo());\" даже в случае, когда foo возвращает void. Это предложение рассматривается комитетом и уже дошло до стадии пробной реализации.\r\n\r\nА тут предлагается ухудшить единообразие типов, лишив группу типов возможности выступать в качестве аргумента функции.\r\n\r\n\r\n**Никита Колотов 26 января 2020, 21:40*\r\nИгорь Гусаров, Мне кажется, что вы как-то не так поняли смысл этого предложения. На единообразие типов оно влияет только положительно, так как направлено на отмену специального правила для интерпретации типов аргументов фунции и переход к единообразным правилам на этот счет для всех типов. Заметьте, что оно затрагивает написание сигнатуры функции, т.е. для выражений \"auto x = foo();\" или \"promise.set_value(foo());\" оно вообще не применяется.\r\n\r\n\r\n**Игорь Гусаров 27 января 2020, 11:53**\r\nНикита Колотов, возможно, я действительно как-то не так понял. Вы говорите о единообразном описании типов в стандарте?\r\n\r\nА я говорю уже о следующем шаге: как это предложение отразится на единообразии сценариев использования языка:\r\n```cpp\r\nusing T1 = int; // Built-in integer type\r\nusing T2 = MyStruct; // User-defined complete type\r\nusing T3 = void (*)(); // Pointer to function\r\nusing T4 = void (&)(); // Reference to function\r\nusing T5 = void (); // Function\r\nusing T6 = void; // Void\r\n\r\nvoid foo1(T1 arg); // 1\r\nvoid foo2(T2 arg); // 2\r\nvoid foo3(T3 arg); // 3\r\nvoid foo4(T4 arg); // 4\r\nvoid foo5(T5 arg); // 5\r\nvoid foo6(T6 arg); // 6\r\n```\r\nВ настоящий момент валидными декларациями являются строки 1-5.\r\n\r\n\r\nРассматриваемое предложение предлагает сделать строку 5 невалидной, тем самым уменьшая количество допустимых способов использования типа T5, и усложняя разработку обобщённого кода:\r\n```cpp\r\ntemplate \r\nstruct Processor\r\n{\r\n void Do(T arg);\r\n};\r\n\r\n// With the proposal in effect,\r\n// the code above would fail for T = T5.\r\n// Hence, need special implementation\r\n// for function types...\r\ntemplate <>\r\nstruct Processor\r\n{\r\n void Do(T5& arg);\r\n};\r\n```\r\nА приведённое для примера предложение по регуляризации войда напротив, нацелено на то, чтобы даже строку 6 тоже следать легальной.\r\n\r\n\r\n\r\n**Никита Колотов 28 января 2020, 0:20**\r\nИгорь Гусаров, сначала тут надо разобраться, действительно ли имеет место единообразие сценариев. Возьмем ваш пример и добавим проверку аргумента на соответствие заявленному типу:\r\n```cpp\r\n#include \r\n\r\nstruct MyStruct{};\r\nusing T1 = int; // Built-in integer type\r\nusing T2 = MyStruct; // User-defined complete type\r\nusing T3 = void (*)(); // Pointer to function\r\nusing T4 = void (&)(); // Reference to function\r\nusing T5 = void (); // Function\r\n\r\nvoid foo1(T1 arg){ static_assert(std::is_same_v); }// 1 ok\r\nvoid foo2(T2 arg){ static_assert(std::is_same_v); }// 2 ok\r\nvoid foo3(T3 arg){ static_assert(std::is_same_v); }// 3 ok\r\nvoid foo4(T4 arg){ static_assert(std::is_same_v); }// 4 ok\r\nvoid foo5(T5 arg){ static_assert(std::is_same_v); }// 5 err\r\n```\r\nварианты 1-4 работают, а [5 вариант внезапно вызовет ошибку](https://godbolt.org/z/yh8Dgb). Или вот немного видоизменненый пример, домонстрирующий применение const квалификатора:\r\n```cpp\r\nusing T1 = int *; // Pointer to built-in integer type\r\nusing T2 = int; // Built-in integer type\r\nusing T3 = void (*) ();// Pointer to function\r\nusing T4 = void (); // Function\r\n\r\nvoid foo1(T1 const arg){ arg = 0; }// 1 err\r\nvoid foo2(T2 const arg){ arg = 0; }// 2 err\r\nvoid foo3(T3 const arg){ arg = 0; }// 3 err\r\nvoid foo4(T4 const arg){ arg = 0; }// 4 ok\r\n```\r\nтеперь наоборот, [работает только вариант, принимающий Function](https://godbolt.org/z/usfDWQ). Еще один пример, попробуем вместо разных функций сделать перегрузки:\r\n```cpp\r\nusing T1 = int; // Built-in integer type\r\nusing T2 = void ();// Function\r\n\r\nvoid foo(T1 * arg){ }// 1 ok\r\nvoid foo(T1 & arg){ }// 2 ok\r\nvoid foo(T1 arg){ }// 3 ok\r\nvoid foo(T2 * arg){ }// 4 ok\r\nvoid foo(T2 & arg){ }// 5 ok\r\nvoid foo(T2 arg){ }// 6 err\r\n```\r\nи опять с вариантом, [принимающим просто Function не все в порядке](https://godbolt.org/z/EUuupR)...\r\n\r\nКак видите, особого единообразия не наблюдается. Причин две:\r\n\r\n1. функция не может быть типом аргумента функции\r\n\r\nЗаметьте, мое предложение не уменьшает количество допустимых способов использования типа T5 - на этот тип уже наложены ограничения.\r\n\r\n2. когда в объявлении параметров функции в качестве типа аргумента указывается функция, то тип аргумента подменяется на указатель на функцию\r\n\r\nИ вот мое предложение направлено на отмену этого второго правила (никак не затрагивая первое): раз уж функции не могут быть типом аргументов, то пусть не будет разрашено указывать их типом аргументов. Будет чуть более единообразно - типы аргументов всегда будут соответствовать объявленным.\r\n\r\n \r\n\r\n\r\n**Игорь Гусаров 28 января 2020, 19:42**\r\nНикита Колотов,\r\n\r\n1. Про \"функция не может быть типом аргумента функции\".\r\nМне кажется, в этом утверждении смешиваются понятия объекта и типа. Объект функции (её тело) действительно нельзя передать куда бы то ни было по значению, с этим я согласен. На объект ограничения есть. Но тип функции - сейчас можно передать, причём как раз благодаря специальным правилам. То есть на использование именно типа сейчас ограничений нет.\r\n\r\n2. Про пример с \"arg = 0;\"\r\nБоюсь, что поведение, которое демонстрирует этот пример, вызвано тем, что к уже определённому функциональному типу в принципе нельзя добавить const-квалификацию. Она игнорируется. Деклараторы \"T\" и \"const T\" для функций - это в принципе одно и то же, независимо от того, где встречается такой декларатор. Т.е. это свойство никак не связано с использованием функции в качестве аргумента, и соответственно, предлагаемый запрет никак не повлияет на данное свойство.\r\n\r\nПроиллюстрировать можно на специализации шаблона класса (так как тип в параметре шаблона всегда используется как он есть, сохраняя cv-квалификаторы и не деградируя до указателей):\r\n```cpp\r\nusing Test = void ();\r\n//using Test = int&; // References are also like that.\r\n\r\ntemplate \r\nstruct Probe;\r\n\r\n// Full specialization for T = Test.\r\ntemplate <>\r\nstruct Probe\r\n{\r\n};\r\n\r\n// Full specialization for T = const Test.\r\n// Ooops... error: Redefinition of Probe\r\n// Because const cannot be added\r\ntemplate <>\r\nstruct Probe\r\n{\r\n};\r\n```\r\nКак видим, отбрасывание квалификатора const для функционального типа никак не связано с передачей агрументов в функцию. Можно заметить, что такое же поведение свойственно ссылочным типам. И это в общем-то логично, так как функции по смыслу гораздо ближе к семантике ссылки, а не значения.\r\n\r\n3. Про примеры с is_same_v и с перегрузкой.\r\nВы правы, это неприятные особенности. К ним можно ещё добавить невозможность сделать копию аргумента в теле функции: T5 temp = arg;. Подобные проблемы с перегрузкой возникают и со ссылочными типами (перегрузка по T и T& в случае, когда T - ссылка). Сейчас подобных проблем можно избежать, если пользоваться std::function и std::array. Но я с удовольствием поддержу предложение, конструктивно улучшающее общую ситуацию, в частности, не ломающее существующий код и не запрещающее видимость передачи по значению, т.к. такая передача востребована в обобщённом коде.\r\n\r\n\r\n**Никита Колотов 29 января 2020, 23:14**\r\nИгорь Гусаров, 1. Не знаю, что вы подразумеваете \"тип функции - сейчас можно передать\". Вот в приведенном ранее примере с \"void foo5(T5 arg)\" тип T5 является функций, но не является типом аргмента. А правило разрешающее только видимость такой передачи является неконсистентным и только сбивает толку.\r\n\r\n2. Ваше объяснение отбрасывания const квалификатора является не совсем верным. В данной ситуации он в принципе не учитывается, даже если бы и имыл смыл приминительно к функции. Для массивов он имеет смысл, но также полностью игнорируется при замене типа. Но собственно механизм игнорирования тут не так важен, важно то, что аргумент всегда остается изменяемым.\r\n\r\n3 std::function не является равноценной заменой для простой передачи функций по указателю или по ссылке, хотя бы даже из-за оверхеда и невозможности использовать в constexpr.\r\n\r\n\r\n**Игорь Гусаров 30 января 2020, 15:40**\r\nНикита Колотов,\r\n1. Про \"Не знаю, что вы подразумеваете \"тип функции - сейчас можно передать\".\" - я имею в виду именно то, что написал в этом сообщении: что void foo5(T5 arg) является валидным объявлением функции. Т.е. что данный тип можно использовать как тип формального параметра. Это - уже сценарий. Он уже позволяет определить функцию и что-то в ней сделать. И единообразие этого конкретного сценария уже ценно.\r\n\r\nВы привели несколько других интересных сценариев, в которых в теле такой функции можно наблюдать некрасивые эфекты. Хорошо. Но зачем из-за этих сценариев запрещать упомянутый выше вполне себе полезный сценарий? Ведь не во всех функциях нужно проверять is_same и пытаться присвоить что-то аргументу...\r\n\r\n2. Про объяснение отбрасывания const.\r\nИзвините, если у меня не получилось пересказать смысл [[dcl.func].p7](http://eel.is/c++draft/dcl.fct#7). Я старался передать факт практически дословно: \"к уже определённому функциональному типу в принципе нельзя добавить const-квалификацию. Она игнорируется.\"\r\n\r\n3. Согласен, не равноценна. Но почему же Вы видите те недостатки, но не видите недостатков у запрета?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800070930/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800071985", + "html_url": "https://github.com/cpp-ru/ideas/issues/99#issuecomment-800071985", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/99", + "id": 800071985, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDA3MTk4NQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T08:47:16Z", + "updated_at": "2021-03-16T08:47:16Z", + "author_association": "MEMBER", + "body": "**Никита Колотов 24 декабря 2019, 22:21**\r\nС одной стороны, такой возможности действительно иногда явственно нехватает. Но если уж идти в этом направлении, то не ограничиваться полумерами, и добавлять сразу возможность помечать как [[deprecated]] также и внутрение типы, и поля классов и все прочее, что им можно помечать сейчас.\r\n\r\nС другой стороны, это уже достаточно большие изменения. Например, как оно может выглядеть в случае типа? По аналогии наверное как-то так:\r\n```cpp\r\nstruct foo\r\n{\r\n using bar = int;\r\n};\r\n\r\n[[deprecated]] foo::bar;\r\n```\r\nНо сейчас foo::bar; является невалидной конструкций и вообще это похоже скорее на недописанное объявление глобальной переменной. В случае какого-нибудь шаблона или заданного значения енумератора видимо будут не меньшие сложности. Также наверное придется добавлять какие-то дополнительные правила для доступа к private и protected членам в таких конструкциях. А язык и так уже усложнен сверх всякой меры.\r\n\r\nТакже практика показывает, что дублировать какие-то декларации из сторонних библиотек корректируя их интерфейс - дело неблагодарное и вместо этого проще и надежнее делать обертки.\r\n\r\n\r\n\r\n**Sergey Semushin 25 декабря 2019, 9:54**\r\nНикита Колотов, а на мой взгляд полумеры то, что есть сейчас. Ибо досчить того, чтоб \"A name declared non-deprecated may be redeclared deprecated.\" сработало можно примерно в половине случаев (свободные функции, глобальные переменные, неймспейсы, тайпдефы путём их повторения). Отсутствием полумер будет возможность эту фичу вообще запретить.\r\n\r\nДля повторной декларации классов/енумов однако разрешить [[deprecated]] наверно чуть проще, чем для членов класса ибо это не требует отдельных конструкций языка, а просто специальной лазейки для [[deprecated]] поскольку сейчас любые аттрибуты у класса компиляторы дают писать только у определения.\r\n\r\n\r\n**Никита Колотов 27 декабря 2019, 17:36**\r\nSergey Semushin, то, что есть сейчас, я бы охарактеризовал как стихийно сложившийся порядок, при котором может имется несколько отличающихся объявлений, дополняющих друг друга. Сомнительный, надо сказать, порядок.\r\n\r\nВообще-то сейчас [[deprecated]] для классов можно указывать при объявлении. т.е. пометить класс из внешней библиотеки как [[deprecated]] можно примерно так\r\n```cpp\r\n// foo_deprecation.hpp\r\nclass [[deprecated]] foo;\r\n\r\n// foo.hpp\r\nclass foo{};\r\n\r\n// main.cpp\r\n#include \"foo_deprecation.hpp\"\r\n#include \r\n\r\nint main()\r\n{\r\n foo f{}; // warning: 'foo' is deprecated\r\n}\r\n```\r\nА вот навешивать атрибуты уже после определения класса - это да, нельзя.\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800071985/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800072498", + "html_url": "https://github.com/cpp-ru/ideas/issues/100#issuecomment-800072498", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/100", + "id": 800072498, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDA3MjQ5OA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T08:48:05Z", + "updated_at": "2021-03-16T08:48:05Z", + "author_association": "MEMBER", + "body": "**Daniil Goncharov 17 декабря 2019, 16:18**\r\nhttps://isocpp.org/blog/2016/02/a-bit-of-background-for-the-operator-dot-proposal-bjarne-stroustrup\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800072498/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800076337", + "html_url": "https://github.com/cpp-ru/ideas/issues/101#issuecomment-800076337", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/101", + "id": 800076337, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDA3NjMzNw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T08:54:17Z", + "updated_at": "2021-03-16T08:54:17Z", + "author_association": "MEMBER", + "body": "**Никита Колотов 7 декабря 2019, 11:06**\r\nВ этом предложении никак не поясняется, какие эффекты должны быть у предлагаемой операции обмена, и какие преимущества должно принести встраивание ее в язык. Даже не понятно, предлагается ли такая операция как замена обычным swap или как нечто отличное.\r\n\r\nВ конце присутствует пример reallocate, однако он не особо проясняет ситуацию. Там написано \"we can omit T y{__movedout_tag} t; followed by y.~Y()\", но в приведенном примере этого же и не было. Или, может быть, там имеется в виду, что внутри цикла остается только y <~> current[i]; (то бишь только предлагаемая встроенная операция обмена)? За счет чего оно будет работать как copy/move elision? Ведь при copy/move elision оптимизация достигается за счет создания объекта сразу с использованием места, отведенного под конечный объект, а в этом случае на вход подаются уже созданные объекты, размещенные в собственной памяти.\r\n\r\n\r\n**Андрей Руссков 13 декабря 2019, 12:34**\r\nНикита Колотов, подразумевалось, что вы знаете что имеется в виду под \"релокацией\" и, соответственно, все её достоинства.\r\n\r\nПо сути своей, релокация - тривиальное копирование памяти и замена this в качестве замены операции move. Она оптимизирует move out рутину (например, для std::string это будет зануление указателя на data) и деструктор moved-out объекта (для std::string это будет проверка с попыткой delete ранее зануленного указателя на data).\r\n\r\n\r\n**Andrey 16 декабря 2019, 8:47**\r\nАндрей Руссков, я думаю, что Никита Колотов знает идею \"релокации\", при этом замечание, что предложению не хватает контекста совершенно справедливо. Что за \"callbacks_list\"из пункта 4, скажем?\r\n\r\nТопикстартер писал относительно [wg21.link/p1144](www.wg21.link/p1144) однако, как минимум из активных сейчас (или в недавнем прошлом?) предложений есть еще [wg21.link/p1029](www.wg21.link/p1029), а автор p1144 посвятил [целую статью](https://quuxplusone.github.io/blog/2018/09/28/trivially-relocatable-vs-destructive-movable/) разнице его предложения и destructive move ([wg21.link/n4158](www.wg21.link/n4158)).\r\n\r\nТак что мне кажется, если цель вывешивания предложения на этот сайт в том, чтобы получить feedback от остальных посетителей, стоит переписать предложение так, чтобы было понятно о чем идет речь и дать побольше контекста. Описать какие проблемы автор видит в конкурирующих предложениях и, соотвественно, как его идея помогает справиться с ними, при этом продолжив работать во всех остальных рассматриваемых use cases.\r\n\r\n\r\n**Никита Колотов 19 декабря 2019, 22:59**\r\nАндрей Руссков, Скажем так, под релокацией обычно имеется ввиду [relocation](https://en.wikipedia.org/wiki/Relocation_(computing)), а до четкого закрепеленного понятия релокации объектов в С++ еще далеко. Так что имеет смысл детально пояснять свойства предлагаемых операций релокации и обмена. Особенно обмена. Как я уже написал выше, из этого предложения не ясно, подразумевается ли тут операция обмена как swap, или как нечно отличное.\r\n\r\n\r\n\r\n**webreh 21 декабря 2019, 10:53**\r\nНикита Колотов, я соглашусь, что подразумевается операция обмена как swap, как только вы объясните, что такое swap.\r\n\r\n\r\n**webreh 21 декабря 2019, 11:06**\r\nAndrey, этот текст изначально написан как отзыв на 1144. Уже после написания текста была найден очень забавный вопрос о том, как вообще понимается MoveCtor (возможно, вы принимали участие в этом) и почему в действующем языке уже не существует разрушающее перемещение.\r\nКасательно 1029 - если я правильно читал, это попытка реализации reallocate из пункта 5, с заменой T{__movedout_tag} на T{}, причем только для тривиального случая.\r\n\r\n\r\n**Никита Колотов 22 декабря 2019, 9:10**\r\nwebreh, так вы сами в этом предложении описываете swap: \"1. swap should not be understood as a move construction...\". Так вот тут не ясно - описываемый swap - вы называете операцией обмена, или все-таки нет?\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800076337/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800077228", + "html_url": "https://github.com/cpp-ru/ideas/issues/102#issuecomment-800077228", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/102", + "id": 800077228, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDA3NzIyOA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T08:55:37Z", + "updated_at": "2021-03-16T08:55:37Z", + "author_association": "MEMBER", + "body": "**claprix 13 декабря 2019, 10:50**\r\nКстати, даже AMD64 ускоряется этим, потому что позволяет использовать более шустрые SIMD инструкции, которые двигают выравненные данные https://godbolt.org/z/U4eiu6\r\n\r\n\r\n**claprix 13 декабря 2019, 13:48**\r\nЕще пример. https://godbolt.org/z/4pgQwJ\r\n\r\n512 это выравнивание, которого требует O_DIRECT на линуксе. Еще mmap() все выравнивает по размеру страницы. Ну и потенциальные пользователи всего этого добра авторы какого-нибудь BTree, у которых в кодобазе с большой вероятностью могут оказаться довольно большие выравненные буферы.\r\n\r\n\r\n**Игорь Гусаров 29 января 2020, 16:03**\r\nНасколько я знаю, качественные реализации memcpy / memset / memcmp уже проверяют, выровнены ли переданные им указатели (и кратны ли длины), после чего переходят к наиболее оптимальному коду. Получается, что данное предложение позволяет сэкономить только на рантайм-определении фактического выравнивнивания?\r\n\r\n\r\n**claprix 16 февраля 2020, 0:23**\r\nИгорь Гусаров, вы говорите про реализацию libc. Насколько знаю, действительно, проверяются фичи процессора чтобы выбрать SIMD пожирнее. Проверка выравнивания это if(). Если мы какой-нибудь type punning делаем между int/float, у нас, наверное, этот if() займет больше времени, чем собственно операция. Но это я так, фантазирую.\r\n\r\nКонечно, предложение ничем не поможет реализациям libc. Но эти функции могут инлайниться разными компиляторами. И в этом случае компиляторы могут попытаться сгенерировать код получше, в зависимости от alignment и размера буфера.\r\n\r\n\r\n**claprix 25 февраля 2020, 21:27**\r\nТолько недавно нашел http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1007r3.pdf\r\n\r\nС его помощью реализовать мое предложение проще простого. Настолько просто, что я теперь не уверен, нужно ли оно вообще.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800077228/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800079026", + "html_url": "https://github.com/cpp-ru/ideas/issues/103#issuecomment-800079026", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/103", + "id": 800079026, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDA3OTAyNg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T08:58:28Z", + "updated_at": "2021-03-16T08:58:28Z", + "author_association": "MEMBER", + "body": "**pooh 26 ноября 2019, 16:20**\r\nP.S. По сути, множественность оператора () у нас уже есть из-за наличия auto, когда этот оператор становится шаблонным. Предлагаемое изменение обеспечивает полноту возможностей по перегрузке этого оператора.\r\n\r\n\r\n**Владимир Топунов 26 ноября 2019, 21:22**\r\nC++ pattern matching, по-моему лучше\r\n\r\nhttps://habr.com/ru/post/282630/\r\n\r\n\r\n**pooh 27 ноября 2019, 0:25**\r\nPattern matching решает ортогональную проблему, и на эту тему существует много различных подходов. Здесь же речь идет о том, что, в случае pattern matching, мы хотим иметь возможность захватывать контекст, причем один и тот же контекст для всех участвующих лямбд.\r\n\r\nОсновная фишка в том, что предлагаемое расширение не требует никаких изменений с точки зрения реализации лямбд компиляторами. Это своего рода синтаксический сахар, но не выразимый существующими средствами языка.\r\n\r\nИ, да, я в реальной жизни сталкиваюсь с описанными проблемами\r\n\r\n\r\n\r\n**Владимир Топунов 24 января 2020, 12:25**\r\npooh, ОК. Пугает усложнение синтаксиса лямбд. Захват контекста можно сделать так (если return type один и тот же)\r\n```cpp\r\nauto l = [a, b = std::move(b)] (auto x)\r\n{\r\n return match(x\r\n ,[&](int x) { return a.f(x); }\r\n ,[&](char* x) { return b.g(x); }\r\n );\r\n};\r\n``` \r\n\r\n \r\n\r\n\r\n**m0xf 28 ноября 2019, 5:18**\r\nЗадачу можно решить с помощью if constexpr внутри lambda-функции. \r\n\r\n\r\n**pooh 28 ноября 2019, 9:28**\r\nm0xf, в части случаев - да, можно использовать лямбду с auto и дальше сравнивать типы, но это не слишком элегантно и не работает, когда количество аргументов в одном и в другом случае разное (там тоже можно извратиться с auto..., но это уже совсем за гранью добра и зла). Плюс в этом случае не работает приведение типов при передаче параметров, этот тоже вызывает определенные сложности .\r\n\r\n\r\n**Daniil Goncharov 5 декабря 2019, 13:18**\r\nВозможно подойдет одно из следующих предложений?\r\nhttps://github.com/cplusplus/papers/issues/281\r\n\r\nhttps://github.com/cplusplus/papers/issues/527\r\n\r\n\r\n**pooh 10 декабря 2019, 12:01**\r\nНет, эти предложния по сути используют различные лямбды, каждая со своим списком захваченных переменных. А как раз основная суть моего предложения - разрешить своего рода \"мультилямбды\", имеющие один список захваченных переменных, но допускающие перегрузку для разных наборов параметров. С точки зрения реализации это потребует минимальных усилий.\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800079026/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800466333", + "html_url": "https://github.com/cpp-ru/ideas/issues/104#issuecomment-800466333", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/104", + "id": 800466333, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDQ2NjMzMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T17:34:06Z", + "updated_at": "2021-03-16T17:34:48Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 11 января 2017, 1:23**\r\nНаличие трэйта `std::type_name` не поможет для вывода сообщения в static_assert, поскольку сообщение должно быть литералом полученным после препроцессирования, а не compile time константой: http://en.cppreference.com/w/cpp/language/static_assert#Note\r\n\r\n**Andrey Davydov, 11 января 2017, 2:12**\r\nНо если хочется имя типа именно в compile time, то прямо сейчас уже есть библиотека `boost::typeindex` (авторства yndx-antoshkka, как я понимаю), правда, имя будет мангленное.\r\nГипотетический `std::type_name` является маленькой частью static reflection proposal.\r\n\r\n**konyuchenko.nikita, 11 января 2017, 5:12**\r\nAndrey Davydov, Стандарт действительно явно указывает что message это string literal. Только вот не понятно, в связи с чем такое ограничение и почему бы его не расширить до любого `constexpr` выражения. static_assert это keyword, а не кусок stl и его обработка в любом случае внутри компилятора.\r\n\r\n>> Гипотетический std::type_name является маленькой частью static reflection proposal.\r\n\r\nДа. Также в большинстве случаев, когда нужна такая конструкция, можно обойтись концептами.\r\n\r\n**yndx-antoshkka, 11 января 2017, 17:34**\r\nСтоит подождать концептов и статической рефлексии, прежде чем внедрять данное предложение. Возможно что рефлексия и концепты всё поправят.\r\n\r\n**Sir-VestniK, 11 января 2017, 8:22**\r\nНа самом деле конструкция в примере пишется так\r\n```cpp\r\ntemplate\r\nvoid method() = delete;\r\n\r\ntemplate<>\r\nvoid method() {impl;}\r\n```\r\nесли у кого-то это не работает, значит вы пользуетесь clang и наступаете на баги https://llvm.org/bugs/show_bug.cgi?id=17537 и https://llvm.org/bugs/show_bug.cgi?id=18539\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800466333/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800643647", + "html_url": "https://github.com/cpp-ru/ideas/issues/106#issuecomment-800643647", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/106", + "id": 800643647, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY0MzY0Nw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:03:57Z", + "updated_at": "2021-03-16T22:08:30Z", + "author_association": "MEMBER", + "body": "**Andrey 19 ноября 2019, 20:13**\r\nЭта идея кажется неплохим кандидатом для C++ в новой эпохе, если эпохи будут когда-нибудь приняты. Есть ряд вопросов.\r\n\r\n1. Почему компиляторы не дают warnings на `void test(int arr[10]);`? У них есть какие-то разумные причины -- если да, то какие, если нет, то почему бы не реализовать это для начала как warning?\r\n\r\n2. Как это должно работать в dependent коде?\r\n\r\nCase 1:\r\n```cpp\r\ntemplate\r\nvoid test(int arr[sizeof(T) - sizeof(int)]);\r\n```\r\nCase 2: \r\n```cpp\r\ntemplate\r\nvoid test(typename T::type);\r\n```\r\nЕсли T::type это массив, он должен декэиться или давать SFINAE-error или hard error?\r\n\r\n3. Стоит ли также запретить function type как параметр функии?\r\n\r\n4. Не жалко ли совместимости с C?\r\n\r\n\r\n**Никита Колотов 19 ноября 2019, 23:05**\r\nAndrey, 1. По аналогии с удалением триграфов, тут тоже вполне будет уместно разделить на две стадии - сначала объявление такого синтаксиса устаревшим, а затем уже полноценный запрет. Существующие компиляторы / статические анализаторы уже могут выдавать некоторые диагностики для подобных случаев, например [warning c26485](https://docs.microsoft.com/en-us/cpp/code-quality/C26485?view=msvc-160&viewFallbackFrom=vs-2019) в vc++ или [cppcoreguidelines-pro-bounds-array-to-pointer-decay в clang-tidy](https://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-pro-bounds-array-to-pointer-decay.html).\r\n\r\n2. Сase 1 - однозначно program ill-formed. А case 2 - SFINAE, сигнатура этой перегрузки просто не подходит, хотя среди прочих может найтись и подходящая.\r\n\r\nКстати с устранением этого правила вывода параметров шаблонов немного упростятся, особый пункт [temp.deduct.type] Except for reference and pointer types, a major array bound is not part of a function parameter type and cannot be deduced from an argument станет ненужным.\r\n\r\n3. Да, я хотел создать для этого отдельное предложение. Хотя с указателями на функции проблем меньше.\r\n\r\n4. Совместимость с С в этом плане и так только частичная: синтаксис с VLA и со `static` в С++ не поддерживается. А вообще было бы хорошо убрать аналогичное правило и из С.\r\n\r\n\r\n**Andrey 21 ноября 2019, 11:58**\r\nЯ привел Case 1, потому что сейчас выражение в размере массива участвует в SFINAE: https://gcc.godbolt.org/z/jg--nU (правда не для GCC).\r\n\r\nНе хотите все-таки начать с function type, я понимаю, что пользы от этого меньше, но с другой стороны это намного менее constroversial, т.е. можно будет посмотреть как в целом комитет по стандартизации реагирует на такого рода предложения, ломающие обратную совместимость?\r\n\r\n\r\n**Никита Колотов 23 ноября 2019, 15:41**\r\nAndrey, Мне представляется, что отношение комитета к такого рода предложениям известно, и оно в целом негативное. Вроде как даже против удаления триграфов были серьезные возражения, хотя они имели крайне малое распространнение, а содержащий их код потребовал бы только тривиального рефакторинга. А тут пользователям функций, принимающих массивы, придется основательно перебирать свой код.\r\n\r\n\r\n**Andrey 28 ноября 2019, 16:42**\r\nНикита Колотов, кстати запрет decay для function type поможет выдавать более осмысленные сообщение об ошибках в случае \"\"the most vexing parse\".\r\n```cpp\r\nint x(int()); // ошибка тут, а не там где мы пытаемся работать с x как с переменной типа int.\r\n```\r\n\r\n**Никита Колотов 27 декабря 2019, 20:25**\r\nAndrey, хороший совет! Кстати в случае с параметрами-массивами most vexing parse тоже может всплыть:\r\n```cpp\r\n#include \r\n#include \r\n\r\nint main(int, char** argv)\r\n{\r\n std::stringstream ss(std::string(argv[1]));\r\n}\r\n```\r\nargv тут распарсится как имя параметра-массива в объявлении функции ss\r\n\r\n\r\n**Никита Колотов 19 ноября 2019, 23:13**\r\nПо-каким-то причинам редактировать предложения нелязя, так что дополню тут. К п.5 можно придумать более вопиющий пример:\r\n```cppp\r\nusing items_t = int const [10];\r\n\r\nvoid test(items_t const items) // const ignored\r\n{\r\n items = 0; // wat\r\n}\r\n```\r\n\r\n**Никита Колотов 7 декабря 2019, 13:47**\r\nДополнение: Так как размер массива и само его присутствие не входят в сигнатуру функции, то между различными предварительными объявлениями функции и ее определением могут быть радикальные расхождения, создавая неразбериху. Например:\r\n```cpp\r\nvoid foo(int * arr);\r\nvoid foo(int arr[2]);\r\nvoid foo(int arr[142]);\r\nvoid foo(int arr[10]){}\r\n```\r\n\r\n**Игорь Гусаров 23 января 2020, 16:43**\r\n1. Кажется, std::array<> уже решает все описанные проблемы.\r\n\r\n2. Запрет на использование какого-то типа в качестве типа аргумента функции может больно ударить по обобщённому шаблонному коду, поскольку потребуется отдельно учитывать этот особый тип в отдельной перегрузке / специализации. Мне кажется, что это не очень хорошее следствие.\r\n\r\n\r\n**Никита Колотов 26 января 2020, 21:37**\r\nИгорь Гусаров, Опять же, вы явно неверно истолковали смысл этого предложения. Массивы (и функции, о чем идет речь [во второй части этого предложения](https://github.com/cpp-ru/ideas/issues/98)) ни в С, ни в С++ и так не могут быть типом аргумента функции. В этом плане ничего не меняется. Данные предложения направлены на отмену специальных правил толкования таких типов когда они фигурируют в объявлении функий.\r\n\r\n\r\n**makaleks 30 марта 2020, 1:10**\r\nПосле введения C++20 (конкретно - class non-template parameters) это предложение сделает невозможным использовать строковые литералы в constexpr-конструкторах. Конечно, в конструктор можно передать сразу std::array, но сейчас этот std::array не нужно инициализировать отдельно, а значит - фрагментировать код, делать его менее читаемым. Например, сейчас (в gcc) можно писать следующее, и мне это нравится:\r\n```cpp\r\n// Программа\r\n\r\nint main() {\r\n // Вместо этого\r\n constexpr auto mess = MyMessyClass<\"123e4567-e89b-12d3-a456-426655440000\">();\r\n // придётся использовать std::array и инициализироваться как-то так:\r\n // constexpr auto mess = MyMessyClass<\r\n // std::array{{\"123e4567-e89b-12d3-a456-426655440000\"}}\r\n // >();\r\n // Конечно, можно сократить размер с помощью алиасов, но новые сущности\r\n // не улучшат читаемость\r\n}\r\n\r\n// Библиотека\r\n\r\nclass Uuid {\r\n std::uint8_t data_[16] = {0};\r\npublic:\r\n // Станет невозможным, если запретить массив как аргумент\r\n constexpr Uuid (const char input[37]) {\r\n // ...\r\n }\r\n};\r\n\r\n// C++20\r\ntemplate \r\nclass UuidDefined;\r\n\r\nstruct SomeBaseInterface {\r\n virtual void f1 () = 0;\r\n virtual void f2 () = 0;\r\n};\r\n\r\nclass UuidDefined <\"123e4567-e89b-12d3-a456-426655440000\"> : public SomeBaseInterface {\r\n void f1 () {\r\n // ...\r\n }\r\n void f2 () {\r\n // ...\r\n }\r\n};\r\n\r\n// ...\r\n\r\ntemplate \r\nclass MyMessyClass {\r\n UuidDefined someProvider;\r\n static_assert_v(std::is_convertible*, SomeBaseInterface*>::value, \"someProvider must inherit SomeBaseInterface\")\r\n\r\n // И т.д.:\r\n // UuidDefined networkProvider;\r\n // UuidDefined guiProvider;\r\n // UuidDefined pluginProvider;\r\n};\r\n```\r\nНа другой недостаток - отбрасывать код на Си - уже указывали.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800643647/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800647478", + "html_url": "https://github.com/cpp-ru/ideas/issues/108#issuecomment-800647478", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/108", + "id": 800647478, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY0NzQ3OA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:11:50Z", + "updated_at": "2021-03-16T22:11:50Z", + "author_association": "MEMBER", + "body": "**Antervis 6 ноября 2019, 17:19**\r\nтак это же ничего не дает. Конструкторы по определению не должны возвращать значение, поэтому return foo(); в конструкторах не имеет смысла даже если foo() возвращает void\r\n\r\n\r\n**webreh 4 декабря 2019, 11:29**\r\nAntervis,\r\nпример 1\r\n```cpp\r\nif (condition) return InitPath1(); return InitPath2();\r\n```\r\nпример 2\r\n```cpp\r\nconst auto finish = [&] (int x) { value_ = x; };\r\n\r\nif (condition) return finish(42);\r\nreturn finish(0);\r\n```\r\n\r\n\r\n**Antervis 4 декабря 2019, 11:59**\r\nwebreh, это всего лишь синтаксический сахар над\r\n```cpp\r\nif (cond) {\r\n finish();\r\n return;\r\n}\r\n```\r\nпричем сахар для редкого юзкейса.\r\n\r\n\r\n**oficsu 29 июня 2020, 15:54**\r\nМне кажется, что данная идея в чём-то схожа с [этим предложения](http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0146r1.html) и вполне возможно, что могла бы стать его частью, кроме того, там уже затронут §6.6.3 The return statement:\r\n~~A return statement with an operand of type void shall be used only in a function whose return type is cv void~~\r\nОднако, я не уверен в том, как правильно интерпретировать данное изменение\r\n\r\n \r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800647478/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800648378", + "html_url": "https://github.com/cpp-ru/ideas/issues/109#issuecomment-800648378", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/109", + "id": 800648378, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY0ODM3OA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:13:49Z", + "updated_at": "2021-03-16T22:14:10Z", + "author_association": "MEMBER", + "body": "**Andrey 5 ноября 2019, 13:53**\r\nДля этого есть `return {};`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800648378/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800650145", + "html_url": "https://github.com/cpp-ru/ideas/issues/109#issuecomment-800650145", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/109", + "id": 800650145, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY1MDE0NQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:17:25Z", + "updated_at": "2021-03-16T22:17:25Z", + "author_association": "MEMBER", + "body": "Запрошенный поведение можно применять начиная с C++11, немного с иным синтаксисом.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800650145/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800651748", + "html_url": "https://github.com/cpp-ru/ideas/issues/110#issuecomment-800651748", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/110", + "id": 800651748, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY1MTc0OA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:20:44Z", + "updated_at": "2021-03-16T22:20:44Z", + "author_association": "MEMBER", + "body": "**Игорь Гусаров 24 января 2020, 19:14**\r\nЭтот дефект присутствует ещё со времён C++98. И он проявляется не только в type traits:\r\n```cpp\r\nstruct Enclose\r\n{\r\n struct Inner\r\n {\r\n Inner(int x = 3);\r\n };\r\n \r\n int probe[sizeof((Inner()))]; // Error!\r\n};\r\n```\r\n\r\n**Andrey 28 января 2020, 16:47**\r\nИгорь Гусаров, считать ли дефектом, то что ваш код не компилируется, дело вкуса, лично я не вижу в этом проблемы, компилятор честно говорит, почему так происходит. Проблема же с моей точки зрения в том, что так как type traits кэширует результат вычисления, то была ли инстанциация внутри Enclose, влияет на то, какой результат мы получаем снаружи от Enclose. Т.е. ситуация аналогична применению type traits к incomplete типу.\r\n\r\n\r\n**Игорь Гусаров 28 января 2020, 17:06**\r\nAndrey, то есть Вы хотите просто задокументировать нынешнее фактическое поведение? (точнее, неопределённость такого поведения)\r\n\r\nНе хотите попробовать исправить такое поведение, добившись того, чтобы инстанциация type traits что внутри, что вне Enclose давала бы одинаковый результат? Просто на первый взгляд кажется, что в невычисляемом контексте не важно конкретное значение default argument, важно только то, что он задан. Соответственно, нет веских причин дожидаться окончания определения класса Enclose чтобы правильно инстанцировать тесты из type traits.\r\n\r\n\r\n\r\n**Andrey 28 января 2020, 19:13**\r\nИгорь Гусаров, непонятно как обеспечивать корректность в таком случае:\r\n```cpp\r\nstruct Enclose\r\n{\r\n struct Inner\r\n {\r\n Inner(int x = f());\r\n };\r\n \r\n static_assert(std::is_nothrow_default_constructible_v);\r\n\r\n static int f() noexcept;\r\n};\r\n```\r\nНужно видеть, что `f()` объявлена как noexcept.\r\n\r\n\r\n**Andrey 28 января 2020, 19:21**\r\nИгорь Гусаров, что касается хочу ли я задокументировать текущее поведение, то я бы хотел для начала понять, соответствует ли поведение gcc и clang-а на том примере, что вы привели нынешнему стандарту, и если нет, то надо бы поправить стандарт. Я задавал вопрос (процитирован ниже) в CWG mailing list, но там мне пока не ответили. Не разобравшись с этим к type traits приступать смысла действительно нет.\r\n\r\nBoth Clang and GCC give compilation errors for this code (https://gcc.godbolt.org/z/7Bdgkt) at lines 1 and 2.\r\n ```cpp\r\nstruct A {\r\n struct B {\r\n int i = 0;\r\n };\r\n struct C {\r\n\r\n C(int = 0);\r\n };\r\n \r\n static inline B b { }; // 1\r\n static inline C c { }; // 2\r\n};\r\n ```\r\nI understand the reason for it, if my understanding is correct it's similar to http://wg21.link/p1286#existing-approach-is-bad-for-compilers.\r\nBut is there core wording explaining why this program shall be ill-formed?\r\n\r\n**Игорь Гусаров 28 января 2020, 20:08*\r\nAndrey, как обеспечивать корректность - надо думать...\r\n\r\nМне просто кажется, что решение, направленное на устранение некорректности, было бы более ценным, поскольку в более-менее сложном коде можно незаметно получить инстанциацию в самый неожиданный момент:\r\n```cpp\r\nstruct Enclose\r\n{\r\n struct Inner\r\n {\r\n Inner() noexcept(flag);\r\n };\r\n\r\n std::vector m_data;\r\n // Ooops... std::vector may check\r\n // if Inner is nothrow constructible\r\n // to select the fastest implementation.\r\n // Now lots of type traits got instantiated.\r\n\r\n static const bool flag = true;\r\n};\r\n```\r\nЭто очень большие грабли, которые могут молча (без диагностики!) сломать логику программы.\r\n\r\n\r\n**Andrey 29 января 2020, 10:56**\r\nИгорь Гусаров, что касается \"обеспечить корректность\", мне кажется это невозможно.\r\n\r\nА по поводу \"молча (без диагностики!) сломать логику программы\", я с вами совершенно согласен, это должно быть hard compiler error а не undefined behavior. Стандарт сейчас не запрещает вендорам (но и не требует) выдавать compiler error и по факту во многих случаях это делается для incomplete типов. http://cplusplus.github.io/LWG/lwg-defects.html#2797 как раз о том, чтобы потребовать диагностики в стандарте. Мое предложение в том, чтобы для nested классов с NSDMI, default arguments или noexcept-specification в конструкторах и операторах присваивания правила были как для incomplete типов.\r\n\r\n\r\n**Игорь Гусаров 31 января 2020, 15:07**\r\nAndrey, мне интересна эта поднятая Вами проблема. По-видимому, Вы и сами ей вплотную занимаетесь, но если моё участие будет не лишним - скажите, помогу чем смогу с поисками и формулировками. Igor.Gusarov@kaspersky.com\r\n\r\n\r\n**Игорь Гусаров 6 февраля 2020, 21:41**\r\nИнтересное наблюдение. Следующий пример был валидным вплоть до C++17. Потом в [[dcl.fct.default]/6](http://eel.is/c++draft/dcl.fct.default#6) добавили формулировку, что добавление дефолтного значения, которое превращает рядовой конструктор в какой-либо из специальных конструкторов после того, как класс был определён делает программу ill-formed:\r\n```cpp\r\nstruct Test\r\n{\r\n Test(int arg);\r\n};\r\n\r\n// Test is NOT default constructible at this point.\r\n\r\nTest::Test(int arg = 3)\r\n{\r\n}\r\n\r\n// Test is default constructible at this point.\r\n```\r\nХотя из тройки gcc / msvc / clang сейчас только clang выдаёт сообщение об ошибке. gcc/msvc молча компилируют приведённый пример.\r\n\r\nМожно пойти по тому же пути, и потребовать, чтобы любые попытки изменить фундаментальные свойства класса после его закрывающей фигурной скобочки делали программу ill-formed с соответствующей диагностикой.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800651748/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800653553", + "html_url": "https://github.com/cpp-ru/ideas/issues/113#issuecomment-800653553", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/113", + "id": 800653553, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY1MzU1Mw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:24:42Z", + "updated_at": "2021-03-16T22:24:58Z", + "author_association": "MEMBER", + "body": "**Игорь Гусаров 31 января 2020, 13:48**\r\n\r\nПроблема ведь касается не только std::apply, но и других свободных функций из std.\r\n\r\nЭту проблему уже поднимали, и было предложение [P0934R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0934r0.pdf). Надо поискать, к какому заключению там пришли.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800653553/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800654014", + "html_url": "https://github.com/cpp-ru/ideas/issues/114#issuecomment-800654014", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/114", + "id": 800654014, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY1NDAxNA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:25:37Z", + "updated_at": "2021-03-16T22:25:37Z", + "author_association": "MEMBER", + "body": "**Dimitriy Ryazantcev 8 декабря 2019, 16:31**\r\nСейчас в разработке более generic подход: Pattern Matching\r\n\r\nhttps://github.com/cplusplus/papers/issues/166\r\n\r\n\r\n**Dimitriy Ryazantcev 8 декабря 2019, 16:42**\r\n7.2 inspect rather than switch\r\n\r\nThis proposal introduces a new inspect statement rather than trying to extend the switch statement. [P0095R0] had proposed extending switch and received feedback to “leave switch alone” in Kona 2015.\r\n\r\nThe following are some of the reasons considered:\r\n\r\n— switch allows the case labels to appear anywhere, which hinders the goal of pattern matching in providing structured inspection.\r\n\r\n— The fall-through semantics of switch generally results in break being attached to every case, and is known to be error-prone.\r\n\r\n— switch is purposely restricted to integrals for guaranteed efficiency. The primary goal of pattern matching in this paper is expressiveness while being at least as efficient as the naively hand-written code.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800654014/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800654765", + "html_url": "https://github.com/cpp-ru/ideas/issues/115#issuecomment-800654765", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/115", + "id": 800654765, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY1NDc2NQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:27:20Z", + "updated_at": "2021-03-16T22:27:20Z", + "author_association": "MEMBER", + "body": "**Игорь Гусаров 31 января 2020, 14:25**\r\nКажется, это предложение упирает именно на отсутствие неявного приведения нового типа к базовому типу. В то время как дискуссия 2017 года предполагала сохранение такого приведения.\r\n\r\nНо если приведения нет, то как будут вычисляться выражения вида\r\n\r\nLogin l{\"nobody\"};\r\nComment c{\"This is account of user \"};\r\n\r\nc += l;\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800654765/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800655251", + "html_url": "https://github.com/cpp-ru/ideas/issues/42#issuecomment-800655251", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/42", + "id": 800655251, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY1NTI1MQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:28:24Z", + "updated_at": "2021-03-16T22:28:24Z", + "author_association": "MEMBER", + "body": "Дубликат https://github.com/cpp-ru/ideas/issues/115", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800655251/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800656341", + "html_url": "https://github.com/cpp-ru/ideas/issues/116#issuecomment-800656341", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/116", + "id": 800656341, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY1NjM0MQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:30:42Z", + "updated_at": "2021-03-16T22:30:42Z", + "author_association": "MEMBER", + "body": "**Sasha Sitnikov 2 сентября 2019, 14:00**\r\nХорошая идея! Чтобы не вводить лишнее слово, я бы предложил синтаксис: `using extern Type;`\r\n\r\n\r\n**Andrey 2 сентября 2019, 18:47**\r\n```cpp\r\n1. Это не правда, или я Вас не так понял, такой код -- валидный.\r\n\r\nstruct X;\r\nclass X {};\r\n```\r\n2. Компилятор должен уметь сравнивать типы\r\n```cpp\r\nextern_type A;\r\nstruct B;\r\n\r\ntemplate\r\nstruct X {};\r\n\r\nX x1; // #1\r\nX x2; // #2\r\n\r\nusing A = B;\r\nX x3; // #3\r\n// В точках #1, #2 и #3 это должна быть одна и та же инстанциация X. \r\n```\r\n\r\n**Antervis 5 сентября 2019, 12:08**\r\n> 2. Мы не можем сделать forward declaration для typedef и using алиаса типа. \r\n```cpp\r\nusing MyAlias = class MyType;\r\n ```\r\n\r\n\r\n**Никита Колотов 29 ноября 2019, 23:47**\r\nПочему \"вынуждены угадывать\"? Ведь всегда понятно, что предствляет собой целевой тип. Если брать конкретно struct и class, то предварительное объявление вообще-то не обязательно должно строго совпадать с определением:\r\n```cpp\r\nclass foo;\r\n\r\nvoid sdf(foo const &){}\r\n\r\nstruct foo{}; // OK\r\n\r\nint main()\r\n{\r\n foo f{};\r\n sdf(f); // OK\r\n}\r\n```\r\nХотя конечно имеет смысл всегда придерживаться строгого соответствия. Для vc++ это критично - в качестве префикса для декорированных имен там используется U для struct и V для class.\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800656341/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800657129", + "html_url": "https://github.com/cpp-ru/ideas/issues/117#issuecomment-800657129", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/117", + "id": 800657129, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY1NzEyOQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:32:04Z", + "updated_at": "2021-03-16T22:32:04Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 6 августа 2019, 21:26**\r\nКажется что всё работает, и это проблема в каком-то старом компиляторе: https://godbolt.org/z/saFyaI\r\n\r\n\r\n\r\n**Georgy Firsov 10 марта 2020, 22:52**\r\nMSVC 19.16 тоже переваривает: https://godbolt.org/z/GyFGVy\r\n\r\nТак что наверно наверно все наиболее распространенные компиляторы нормально такое поддерживают (не только CLand и GCC)\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800657129/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800657644", + "html_url": "https://github.com/cpp-ru/ideas/issues/118#issuecomment-800657644", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/118", + "id": 800657644, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY1NzY0NA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:33:17Z", + "updated_at": "2021-03-16T22:33:17Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 9 августа 2019, 11:39**\r\nВыглядит действительно хорошо, но есть очень большие проблемы. В данный момент выбор функции работает в обратную сторону:\r\n\r\n1) формируется список доступных перегрузок из текущего namespace и всех namespace аргументов (ADL)\r\n\r\n2) по типам аргументов выбирается лучшая перергрузка из списка из шага 1)\r\n\r\nТо есть ваше предложение несовместимо с текущей работаой C++.\r\n\r\nМожно несколько упростить верхнюю схему, например если namespace явно указан, то ADL не происходит. Это решит проблему с формированием списка на шаге 1), но как выбрать лучшую перергрузку на шаге 2) - не очень понятно, т.к. типы аргементов неизвестны до тех пор, пока мы не выберем функцию.\r\n\r\n\r\n**LevSch 9 августа 2019, 14:13**\r\nУпростить верхнюю схему это так\r\n\r\n`myspace::log(debug,\"Log1\");`\r\n\r\nвместо\r\n\r\n`log(debug,\"Log1\");`\r\n\r\n?\r\n\r\nТогда не вижу смысла. Так как в одном месте убрали буквы, а в другом добавили.\r\n\r\nЕсли функция одна, то неоднозначности, ведь, не может быть. Если так, то я согласен на одну (для начала).\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800657644/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800658254", + "html_url": "https://github.com/cpp-ru/ideas/issues/119#issuecomment-800658254", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/119", + "id": 800658254, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY1ODI1NA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:34:49Z", + "updated_at": "2021-03-16T22:34:49Z", + "author_association": "MEMBER", + "body": "**maxon 13 августа 2019, 20:08**\r\nА можно пример? Где именно здесь должен быть использован другой less<>? \r\nТакже непонятно, что тут за K. Если K приводимо к key_type, то неясно зачем шаблон. Если неприводимо, то вообще неясно что этот метод должен делать.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800658254/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800659764", + "html_url": "https://github.com/cpp-ru/ideas/issues/120#issuecomment-800659764", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/120", + "id": 800659764, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDY1OTc2NA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-16T22:38:35Z", + "updated_at": "2021-03-16T22:38:35Z", + "author_association": "MEMBER", + "body": "**Antervis 5 сентября 2019, 12:22**\r\nПогоди, ты хочешь ввести новое семейство функций в snake_case вместо существующих clibcase методов? Дерзко\r\n \r\nПо коду: раз уж в с++20 едут концепты, лучше сразу на них писать. А лишние static и const стоит убрать. И unsigned int для символьных констант не нужен.\r\n\r\n\r\n**Виктор Губин 5 сентября 2019, 22:02**\r\nAntervis, кейсы не принципиальны, врочем как и header name и будут-ли constexpr функции подменять оригинальные или дополонять их.\r\n\r\nСompile time ctype нужен на случай если мы допустим хотим проверить что в строке вроде \"https://stdcpp.ru/proposals/c61961b5-65e1-4a70-98aa-6fa67de8deb4\" нет пробелов, естесвенно если строка - литерал, то в compile time-ме.\r\n\r\n2. unsigned int нужен в прототипе, (char-ы - все знаковые, пока ряду компиляторов ключами не сообщили обратное). Берем скажем isdigit:\r\n\r\n(c - '0') < 10\r\nесли с - заковый берем - - /* '\\0' */ 0 - 48 = -48; -48 < 10 . C unsigned, 0xFFFF FFD0 > 0xA.\r\n\r\nАльтернтатива:\r\n\r\nc >= '0' && c <= '9'\r\nпри выключеной оптимизации (на дебаге) [разница вот](https://godbolt.org/z/rsdWtN).\r\n\r\n**Antervis 6 сентября 2019, 13:13**\r\nAntervis\r\nВиктор Губин, зато с включенной оптимизацией gcc и msvc справляются чуть [лучше](https://godbolt.org/z/bkN3po). Я бы сделал через [make_unsigned](https://godbolt.org/z/n7AZRz)\r\n\r\n\r\n**Виктор Губин 6 сентября 2019, 18:56**\r\nAntervis, [можно и так](https://godbolt.org/z/K3TzW6). MS VC++ сразу отказался со всем этим жить.\r\n\r\n\r\n\r\n\r\n**webreh 10 октября 2019, 1:37**\r\nМеня определенно напрягает реализация этих методов для случаев char8_t/char16_t/char32_t. Не очень приятно иметь функции, умеющие проверять половину кодпоинта да еще и отвечающую false на попытку спросить мнение, является ли символ U+FF10 (full width digit 0) собственно digit. \r\n\r\n\r\n\r\n\r\n**Виктор Губин 10 октября 2019, 16:17**\r\nwebreh, оригинальный isdigit и не должен понимать U+FF10 впрочем как и что либо кроме 0123456789 U+0030-U+0039 т.е. в приделах значений UNICODE Latin 1. Если выйти в полный диапазон UNICODE - то не понятно что делать с: Римскими, Сингальскими, Румми, Персидскими (Фарси) [٠١٢٣٤/۴٥/۵٦/۶٧۸٩] и прочими цыфрами. Логически - это все числа.\r\n\r\n\r\n**webreh 2 декабря 2019, 8:09**\r\nВиктор Губин, это все стандартизировано в Unicode. Вы предлагаете функцию isdigit, номинально принимающую кодировку Unicode, но соответствующую стандарту ASCII. Это просто абсурд и нарушение типизации.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800659764/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800856421", + "html_url": "https://github.com/cpp-ru/ideas/issues/119#issuecomment-800856421", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/119", + "id": 800856421, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDg1NjQyMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-17T07:19:08Z", + "updated_at": "2021-03-17T07:19:08Z", + "author_association": "MEMBER", + "body": "Речь идёт про добавление гетерогенного erase в контейнеры, чтобы иметь возможность удалять из контейнера по ключу другого типа.\r\n\r\nНапример, чтобы из `std::set v;` можно было удалить элемент через `v.erase(\"A long key to remove from container\")` без создания std::string и динамической аллокации", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800856421/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800865256", + "html_url": "https://github.com/cpp-ru/ideas/issues/105#issuecomment-800865256", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/105", + "id": 800865256, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDg2NTI1Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-17T07:35:08Z", + "updated_at": "2021-03-17T07:35:08Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 января 2017, 18:07**\r\n+1\r\n\r\nМожно пойти по пути наименьшего сопротивления, и завести library issue на это, благо подобная уже есть: http://cplusplus.github.io/LWG/lwg-active.html#2821\r\n\r\nХотите сами завести, или мне заняться?\r\n\r\n**Andrey Davydov, 10 января 2017, 23:57**\r\nyndx-antoshkka, Я не смог найти где можно создай новый library issue, если вы подскажите, то я попробую сам это сделать.\r\nМне кажется, что мое предложение несколько осмысленнее, чем issue на которое вы сослались. `std::launder`, так же как и `std::move`, `std::forward`, методы `size()` и `empty()` у контейнеров, и так далее (наверное, любую `constexpr` функцию), стоило бы пометить `[[pure]]` а не `[[discard]]`. Вызывать их игнорируя результат бессмысленно но не \"опасно\", а вот проигнорированный `std::thread` приведет к `std::terminate`.\r\n\r\n**yndx-antoshkka, 11 января 2017, 17:45**\r\nЕсть инструкция по созданию issue: https://isocpp.org/std/submit-issue Если возникнут вопросы - обращайтесь.\r\n\r\nИ да, ваше предложение намного более осмысленное :)\r\n\r\n**Andrey Davydov, 12 января 2017, 11:30**\r\nyndx-antoshkka, я выполнил шаг 1 данной инструкции, создав тему на std-discussion groups.google.com/a/isocpp.org/forum/embed/?place=forum/std-discussion&showsearch=true&showpopout=true&parenturl=https://isocpp.org/forums/iso-c-standard-discussion#!topic/std-discussion/dE1ubDI3--c\r\nНадеюсь дождаться какого-то полезного feedback'a оттуда.\r\n\r\n**yndx-antoshkka, 16 января 2017, 11:44**\r\nAndrey Davydov, обсуждение скатилось в лютую теорию. Предлагаю вам сделать следующее:\r\n* завести issue на `[[nodiscard]] std::async`\r\n* завести отдельный issue на `[[nodiscard]] std::thread`\r\n* если есть желание - написать proposal на добавление `[[nodiscard]]` к `*::empty()`, `make_shared()`, `make_unique()`...\r\n* если есть желание - продумать автоматическое помечание `constexpr` функций как `[[nodiscard]]` и тоже написать proposal\r\n\r\nПостараюсь форсировать рассмотрение первых двух пунктов на ближайшем заседании. Пожалуйста, отпишитесь о заведенных issue и желании писать proposal в этом обсуждении.\r\n\r\n**Andrey Davydov, 26 января 2017, 2:25**\r\nyndx-antoshkka, issue для std::async: http://cplusplus.github.io/LWG/lwg-active.html#2856\r\nответа на письмо про std::thread я пока жду, когда получу, отпишусь.\r\nС proposal'ом на добавление [[nodiscard]] к функциям empty() и size() я не совсем согласен, мне кажется, что [[nodiscard]] неточный (недостаточный) термин для pure-функций. Что Вы думаете по поводу идеи добавить атрибут pure для функций, из которого, в частности, будет следовать, что они являются nodiscard? И именно наличие [[pure]], по-моему, должно следовать из constexpr. Правда, под именем \"pure\" он точно не будет стандартизирован, так как по смыслу он ближе не к GNU-му `__attribute__((pure))`, а к __attribute__((const)).\r\nProposal на добавление [[nodiscard]] к make_unique и make_shared, по-моему не очень логичный, так как с одной стороны игнорирование результата make_unique и make_shared не так опасно как std::async, а с другой так же бессмысленно, как и для математических функций sin, cos, .., fopen, malloc и еще тысячи других. Тогда надо либо помечать всю стандартную библиотеку, либо ничего.\r\n\r\n**yndx-antoshkka, 26 января 2017, 13:03**\r\n\r\n> issue для std::async: cplusplus.github.io/LWG/lwg-active.html#2856\r\n\r\nСупер!\r\n\r\n> Что Вы думаете по поводу идеи добавить атрибут pure для функций, из которого, в частности, будет следовать, что они являются nodiscard?\r\n\r\nЯ не специалист по написанию оптимизаторов, но мне кажется что проблема data-flow в clang полностью решена и такой атрибут не даст никакого преимущества при оптимизации. Я выясню поподробнее в WG21.\r\n\r\n> И именно наличие [[pure]], по-моему, должно следовать из constexpr.\r\n\r\nВсеми руками за! Если constexpr функция не имеет выходных параметров то применять [[nodiscard]] автоматически. На это понадобится proposal.\r\n\r\n> Proposal на добавление [[nodiscard]] к make_unique и make_shared, по-моему не очень логичный, <...> так же бессмысленно, как и для математических функций sin, cos, .., fopen, malloc и еще тысячи других.\r\n\r\nМатематические функции скорее всего станут скоро constexpr, так что их помечать не придётся. make_unique/make_shared не попадают под pure функции, так как в них скрыт системный вызов. Помечать их, и множество других функций стандартной библиотеки, придётся вручную. Тут нужно выработать некий критерий, по которому определять, нужно ли помечать функцию как [[nodiscard]], пройтись по всей стандартной библиотеке отбирая функции с этим критерием, написать proposal.\r\n\r\n**Andrey Davydov, 26 января 2017, 14:31**\r\n\r\n> Математические функции скорее всего станут скоро constexpr\r\n\r\nА как проблему с errno решат?\r\n\r\n**yndx-antoshkka, 27 января 2017, 10:47**\r\nЗапись в errno будет делать вызов функции не constant expression:\r\n* если пользователь явно запросил constant expression ( constexpr float f = sqrt(-1.0f)) то будет ошибка компиляции\r\n* если пользователь явно не требует constant expression (float f = sqrt(-1.0f)) то на рантайме выставится errno\r\nТак сейчас уже реализовано в GCC и CLANG.\r\n\r\nЭто противоречит вашему предложению constexpr == [[pure]], но всё ещё хорошо ложится на предложение \"Если constexpr функция не имеет выходных параметров то применять [[nodiscard]] автоматически\"\r\n\r\n**Andrey Davydov, 27 января 2017, 12:00**\r\nyndx-antoshkka, Понятно, спасибо за объяснение. По поводу std::thread я получил такой ответ:\r\n2017-01-24 16:20 GMT+01:00 Andrey Davydov :\r\n> Section 30.3.2 [thread.thread.class]\r\n> Discussion:\r\n> Because destructor of the std::thread can call std::terminate (section\r\n> 30.3.2.3), result of any function returning std::thread must not be\r\n> discarded.\r\n\r\nHi Andrey, since this is a very general, broad statement, I find it\r\nhard to add an issue for this. My recommendation is to write a short\r\nproposal that explains the full impact change of this suggestion on\r\nthe current working draft and with Audience targeting Library Working\r\nGroup. If you have any questions in regard to writing up a proposal,\r\nplease contact me via the lwgchair address (It is really not so hard),\r\nbut here are some short examples:\r\n\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0340r0.html\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0014r0.pdf\r\n\r\nNote: The next mailing deadline is February 6th, 14:00 UTC. You need\r\nto allocate a document number from via by providing the following\r\nthree information pieces:\r\n\r\n1) Title\r\n2) Audience list\r\n3) Author list\r\n\r\nThanks,\r\n\r\n- Daniel\r\n\r\nТак что, с std::thread не удастся ограничиться issue и надо делать proposal.\r\n\r\n**yndx-antoshkka, 31 января 2017, 18:24**\r\nПри возникновении любых вопросов - обращайтесь, помогу. Если понадобится помощь с английским или с тем как начать писать proposal - обращайтесь.\r\n\r\n**Andrey Davydov, 31 января 2017, 20:11**\r\nyndx-antoshkka, Спасибо!\r\nЯ, наверное, только не в ближайшее время этим займусь.\r\n\r\n**yndx-antoshkka, 14 февраля 2017, 17:00**\r\nProposal на эту тему: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0600r0.pdf\r\n\r\nВ нём нехватает [[nodiscard]] для std::thread. Если хочется по быстрому добавить ещё куда-то nodiscard - скажите, на заседании озвучу.\r\n\r\n**Andrey Davydov, 14 февраля 2017, 20:16**\r\nyndx-antoshkka,\r\nНаверное, реально по-быстрому добавить nodiscard к *::empty(), об этом еще Sutter писал год назад: https://herbsutter.com/2016/03/11/trip-report-winter-iso-c-standards-meeting/\r\n\r\n**yndx-antoshkka, 9 марта 2017, 15:23**\r\nhttps://wg21.link/p0600r0 обсудили, но официально в С++17 принять не успели. Тему с std::thread не затрагивали на обсуждении.\r\n\r\nОднако большинство имплементаций в скором времени внедрят эту бумагу, даже не смотря на то, что она не является ещё частью стандарта. Боле того, имплементации имеют право добавлять `[[nodiscard]]` по своему усмотрению.\r\n\r\nИтого: В скором времени в черновик будущего С++20 включат https://wg21.link/p0600, имплеменетации начнут экспериментировать и добавлять `[[nodiscard]]`. Позже (через годик) можно уже будет написать бумагу, помечающую методы как `[[nodiscard]]`, исходя из \"лучших практик\" (например \"2 из 3 стандартных библиотек пометили этот метод как `[[nodiscard]]`, пользователям это нравится, давайте обяжем имплементации помчать этот метод\").\r\n\r\nА то тех пор - приглядываемся к кандидатам на [[nodiscard]], экспериментируем на своих классах...\r\n\r\n**yndx-antoshkka, 13 ноября 2017, 13:16**\r\nДобавили для `async()`, `malloc()`, `allocate()`, operator new в С++20\r\n\r\nАвторы начали работать над следующим предложением, по добавлению [[nodiscard]] к функциям.\r\n\r\nПопробуйте изложить свои мысли по добавлению nodiscard к классам в виде proposal. Вот мини инструкция по написанию: https://stdcpp.ru/podgotovka-predlozheniya-v-standart-c-instruktsiya\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800865256/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800931704", + "html_url": "https://github.com/cpp-ru/ideas/issues/105#issuecomment-800931704", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/105", + "id": 800931704, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDkzMTcwNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-17T09:26:52Z", + "updated_at": "2021-03-17T09:26:52Z", + "author_association": "MEMBER", + "body": "Итого: половина идеи оказалась в C++20, но часть классов всё ещё не помечена как `[[nodiscard]]`\r\n\r\nОстаётся добавить `[[nodiscard]]` к\r\n* std::thread\r\n* std::unique_lock\r\n* std::lock_guard\r\n* std::shared_lock\r\n* std::scoped_lock", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800931704/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800970116", + "html_url": "https://github.com/cpp-ru/ideas/issues/121#issuecomment-800970116", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/121", + "id": 800970116, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMDk3MDExNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-17T10:27:17Z", + "updated_at": "2021-03-17T10:27:17Z", + "author_association": "MEMBER", + "body": "**mrgordonfreman, 11 января 2017, 13:18**\r\nДумал свою реализацию написать, однако такое уже есть. Но вот почему не принимают...\r\n\r\n**yndx-antoshkka, 11 января 2017, 13:54**\r\nЕсть proposal поновее http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html но в C++17 decimal не будет.\r\n\r\nПохоже что не дошли руки у LEWG до обсуждения N3871, на ближайшей встрече узнаю подробности.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/800970116/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801017769", + "html_url": "https://github.com/cpp-ru/ideas/issues/122#issuecomment-801017769", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/122", + "id": 801017769, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMTAxNzc2OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-17T11:46:04Z", + "updated_at": "2021-03-17T11:46:04Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 12 января 2017, 20:48**\r\n#58 \r\n\r\n**dix75, 19 января 2017, 13:18**\r\nАдминистратору, нужно объеденить с предыдущем вариантом или удалить\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801017769/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801048706", + "html_url": "https://github.com/cpp-ru/ideas/issues/123#issuecomment-801048706", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/123", + "id": 801048706, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMTA0ODcwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-17T12:38:48Z", + "updated_at": "2021-03-17T12:38:48Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 16 января 2017, 11:30**\r\n\r\nА это не поломает существующий код?\r\n```cpp\r\ntemplate \r\nstruct Foo {\r\n Foo (T x) {}\r\n};\r\n\r\nstruct Bar {\r\n operator int() const { return 0; }\r\n};\r\n\r\n\r\ntemplate void foo(Foo const& x);\r\nvoid foo (int x);\r\n\r\n// ...\r\n\r\nint main() {\r\n Bar x;\r\n foo(x); // was OK, now ambiguous\r\n}\r\n\r\n```\r\n\r\n**ru.night.beast, 16 января 2017, 11:54**\r\nyndx-antoshkka, зависит от кого, как оформить.\r\nесли этот поиск вызывать только если текущие правила ничего не нашли, то не сломает.\r\n\r\nтут попутно еще своего рода пожелание возникло.\r\nесли правильно понял текущее предложение, то там для поиска используются все конструкторы. хорошо бы иметь возможность для некоторых конструкторов исключить их из поиска (через explicit или еще каким образом)\r\n\r\n**mrgordonfreman, 19 января 2017, 16:48**\r\nru.night.beast, Если текущие правила ничего не нашли, то может лучше оставить ошибку компиляции? В спорных случаях программа скомпилируется, но будет делать совсем не то, что хотел автор.\r\n\r\n**ru.night.beast, 19 января 2017, 22:26**\r\nmrgordonfreman, это как бы логичное развитие идеи.\r\nа так да, можно и для классов убрать (вдруг чего не то подставится)\r\n\r\n**yndx-antoshkka, 20 января 2017, 11:32**\r\n\r\n> если этот поиск вызывать только если текущие правила ничего не нашли, то не сломает.\r\n\r\nТогда получится неконсистентно:\r\n```cpp\r\ntemplate void foo (Foo const& x); // 1\r\ntemplate void foo (const T& x); // 2\r\n```\r\nЗдесь 1 более специализированный, и логично было бы выбрать его. По текущим правилам этого не произойдёт. С вашим дополнением - тоже. Выглядит очень странно, для пользователя С++ подобное поведение будет неприятным сюрпризом.\r\n\r\n> если правильно понял текущее предложение, то там для поиска используются все конструкторы. хорошо бы иметь возможность для некоторых конструкторов исключить их из поиска (через explicit или еще каким образом)\r\n\r\nЭта проблема решается через SFINAE или Concepts.\r\n\r\n**ru.night.beast, 20 января 2017, 11:53**\r\nyndx-antoshkka, при текущих правилах при передаче int выберется 2 :)\r\nно в целом ты прав, если использовать текущие правила когда формируется общий список и среди него выбирается наиболее специализированный, то предложение не будет работать.\r\nпоэтому и предлагаю вызывать только если основной поиск отвалился (что, в том числе, позволит сохранить скорость компиляции для случаев когда предложение не используется).\r\nэто даст доп. возможности для метапрограммирования (в том числе для частичного ограничения по параметрам):\r\n```cpp\r\ntemplate void foo(Fooconst & x);\r\ntemplate void foo(Barconst & x);\r\n```\r\n\r\n> Эта проблема решается через SFINAE или Concepts.\r\n\r\nэта проблема не решается через SFINAE или Concepts поскольку конструктор ничего не знает про то, как он вызван:\r\n```cpp\r\ntemplate\r\nstruct Foo{\r\n Foo(T x);\r\n Foo(int size);\r\n};\r\nFoo x(1.0); // OK\r\nFoo y(1); // сейчас ошибка\r\n```\r\n**yndx-antoshkka, 20 января 2017, 12:51**\r\nОпишите подробно, формально и по шагам как вы хотите модифицировать поиск функций и определение шаблонов.\r\n\r\n> Foo y(1); // сейчас ошибка\r\n\r\nЭта ошибка решается через explicit deduction guides\r\n\r\n**ru.night.beast, 20 января 2017, 14:17**\r\nyndx-antoshkka, формально вижу как-то так:\r\n1. применить стандартный поиск.\r\n2. если в п.1 ничего не найдено, то применить расширенный поиск.\r\nрасширенный поиск должен основываться на типах, которые не могут быть выведены из существующих параметров. для этого подготавливаем список функций, которые подходят по текущим параметрам, а для зависимых параметров пробуем применить правила ввода типов для классов. если вывод дает однозначный тип, то использовать его. если вывод дает несколько типов, то запомнить их. повторить процедуру для следующего зависимого типа. потом взять пересечение неоднозначных типов, и если оно дает единственный результат, то добавить функцию в список подходящих.\r\nв получившемся списке подходящих функций выбрать наиболее специализированный.\r\nкак то так.\r\n\r\n>Эта ошибка решается через explicit deduction guides\r\n\r\nнасколько понял, explicit deduction guides дополняет конструкторы, а не исключает существующие.\r\nто есть нет, не решается :)\r\n\r\n\r\n**yndx-antoshkka, 20 января 2017, 14:38**\r\n> 2.\r\n\r\nВыглядит как куча мороки, которая мало кому поможет а всем остальным навредит.\r\n\r\n> то есть нет, не решается :)\r\n\r\nПожалуйста, описывайте ваши мысли подробнее.\r\n\r\nОдин из этих deduction guide удовлетворит ваши требования?\r\n```cpp\r\ntemplate Foo(T) -> Foo< conditional_t, double, T>>;\r\ntemplate Foo(T) -> Foo< enable_if_t, T>>;\r\n```\r\n\r\n**ru.night.beast, 20 января 2017, 14:54**\r\nyndx-antoshkka, добавление этих deduction guide исключит конструктор Foo(int size) из поиска и сделает использование Foo x(1) компилируемым?\r\n\r\nсейчас список, из которого выбирается тип состоит Всех конструкторов класса + списка явный правил.\r\nхотелось бы иметь возможность убрать конкретный конструктор из списка, в котором происходит поиск.\r\n\r\n**yndx-antoshkka, 20 января 2017, 15:47**\r\n\r\n> добавление этих deduction guide исключит конструктор Foo(int size) из поиска и сделает использование Foo x(1) компилируемым?\r\n\r\nУ вас взаимоисключающие параграфы.\r\n\r\n**ru.night.beast, 20 января 2017, 16:00**\r\nyndx-antoshkka, я описал проблему. вы предложили ее решить с помощью explicit deduction guides. у меня возник вопрос, как ее можно решить с помощью deduction guides если они никак с этим конструктором не связаны.\r\n\r\n**yndx-antoshkka, 20 января 2017, 16:40**\r\nНашёл причину возникших взаимных недопониманий.\r\n\r\nВашу фразу\r\n> Foo y(1); // сейчас ошибка\r\nя интерпретировал как \"ошибка - определится неверный тип T\" а не как \"ошибка компиляции\".\r\n\r\nДругими словами, при вызове Foo x(1) вы хотите чтобы проинстанцировался тип Foo.\r\n\r\nТак вот, по умолчанию Foo и определится, никаких ошибок компиляции не будет: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html\r\n\r\n**ru.night.beast, 20 января 2017, 16:49**\r\n\r\n> Так вот, по умолчанию Foo и определится, никаких ошибок компиляции не будет\r\n\r\nэто точно? тогда вопрос снимается :)\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801048706/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801056646", + "html_url": "https://github.com/cpp-ru/ideas/issues/124#issuecomment-801056646", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/124", + "id": 801056646, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMTA1NjY0Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-17T12:52:10Z", + "updated_at": "2021-03-17T12:52:10Z", + "author_association": "MEMBER", + "body": "**ru.night.beast, 19 января 2017, 22:32**\r\nУ \"x\" и \"y\" в примере какой тип?\r\n\r\n**dix75, 20 января 2017, 11:06**\r\nru.night.beast,\r\nЗдесь закралась ошибка с x\r\nauto x = ptr ?? new int(33);\r\nВо втором случаи Person\r\n\r\n**ru.night.beast, 20 января 2017, 11:29**\r\ndix75, чет все равно не пойму. у ptr в обоих примерах одинаковый тип?\r\nпредположим, ptr имеет тип std::shared_ptr.\r\nопиши подробно, чего конкретно хочется.\r\n\r\n**yndx-antoshkka, 20 января 2017, 11:27**\r\nВыглядит страшновато. Мне больше по душе:\r\n```cpp\r\nint cool(Person* p) {\r\n int x = 55;\r\n if (p && p->ptr && p->ptr->sub)\r\n x = p->ptr->sub->toInt();\r\n return x;\r\n}\r\n```\r\nНа такой записи я не залипаю на 3 минуты в рассуждениях \"что это всё значит?\" и \"почему не написали через if?\"\r\n\r\nКомпилятор GCC имеет расширение похожее на вторую часть вашего предложения https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Conditionals.html\r\n\r\nНо оно не пользуется популярностью.\r\n\r\n**ru.night.beast, 20 января 2017, 11:34**\r\nyndx-antoshkka, для std::optional оператор ?: (с разыменованием), наверно, имел бы смысл.\r\n\r\nодна из причин непопулярности в том что расширение, а не часть языка.\r\n\r\n**dix75, 25 января 2017, 11:25**\r\nru.night.beast,\r\nвот именно, я многие фишки gcc не использую именно по этой причине.\r\n\r\n**dix75, 25 января 2017, 11:31**\r\nyndx-antoshkka,\r\n\r\n>> На такой записи я не залипаю на 3 минуты в рассуждениях \"что это всё значит?\"\r\n\r\nХм. странно, это только на первых порах. Тем более все новые вещи пропустить через себя приходится.\r\nболее понятный и простой пример\r\n```cpp\r\ntemplate\r\nvoid clear(T* ptr) {\r\n ptr?->doSMT();\r\n ptr?->clerar();\r\n delete ptr;\r\n}\r\n```\r\n\r\n**yndx-antoshkka, 25 января 2017, 11:51**\r\ndix75, вот так будет выглядеть тело функции если все предложения по синтаксическому сахару за ~год включить в стандарт:\r\n```cpp\r\nwhile (foo ~~ { @... }) {\r\n return {} unless foo != bar;\r\n foo += $&;\r\n} else {\r\n static decltype(return) var;\r\n var += @ + ...;\r\n g{hello}{word}[var]?->meow() ?? bark();\r\n var;\r\n}\r\n{}\r\n```\r\nВы уверены что вы этого хотите?\r\n\r\n**Nimius007, 22 марта 2017, 18:59**\r\nyndx-antoshkka, Да!\r\n\r\n**mrgordonfreman, 23 января 2017, 16:09**\r\nСомнительная красота. Как это будет выглядеть для базовых типов?\r\nВот такой пример\r\n```cpp\r\nint foo(int** m) {\r\n if (m != nullptr && *m != nullptr)\r\n return **m;\r\n return -1;\r\n}\r\n```\r\n\r\n**dix75, 25 января 2017, 11:25**\r\nmrgordonfreman,\r\nТак же как и здесь, старый синтаксис никто не отменяет.\r\n\r\n**dix75, 25 января 2017, 11:37**\r\nОчень часто мы по причине того что указатель никогда в функции не будет нулевым пишем так.\r\n```cpp\r\ntemplate\r\nvoid clear(T* ptr) {\r\n ptr->clear();\r\n delete ptr;\r\n}\r\n```\r\nно его можно будет обезопасить так\r\n```cpp\r\ntemplate\r\nvoid clear(T* ptr) {\r\n ptr?->clear();\r\n delete ptr;\r\n}\r\n```\r\nЧто значит если указатель не нулевой вызови его функцию-член clear.\r\nВыгода очевидна.\r\n\r\np.s. Ясное дело, что можно проверять указатель на nullptr, но не всегда мы это делаем, по разным причинам.\r\n\r\n**ru.night.beast, 25 января 2017, 22:05**\r\n\r\n> Выгода очевидна\r\n\r\nмне, например, не очевидна.\r\nконкретно в этом примере правильнее поставить assert или передавать ссылку.\r\nнет смысла ради такой ерунды усложнять синтаксис.\r\n\r\n**Antervis, 3 марта 2017, 7:01**\r\nВот так код ненамного длиннее и намного понятнее:\r\n```cpp\r\nreturn (p && p->ptr && p->ptr->sub) ? p->ptr->sub->toInt() : 55;\r\n```\r\n\r\n**Антон Рапетов, 17 марта 2017, 19:53**\r\nНаверное добавить новый оператор это дейстивительно так себе идея.\r\n\r\nМожно подумать о методах в классы умных указателей. Напирмер `ifPresent`. Основнове приемущество по сравнению с if реализацией - не требуется создавать временную переменную для кода вида: `getSome()->doSome();` Правда я не уверен что с `ifPresent` это будет выглядить лучше:\r\n`getSome().ifPresent(Some::doSome)`. И это ещё у `doSome` нету параметров. А то придётся писать\r\n```cpp\r\ngetSome().ifPresent([&] (auto *x) {x->doSome(val1, val2)});\r\n```\r\nНе сильно проще чем\r\n```cpp\r\nauto some = getSome();\r\nif (some) {\r\n some->doSome(val1, val2);\r\n}\r\n```\r\nВ итоге, если мы не хотим получить perl, нам придётся писать более многословные вещи, и это наверное нормально.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801056646/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801693472", + "html_url": "https://github.com/cpp-ru/ideas/issues/125#issuecomment-801693472", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/125", + "id": 801693472, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMTY5MzQ3Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-18T07:20:56Z", + "updated_at": "2021-03-18T07:20:56Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 25 января 2017, 16:50**\r\nНе до конца понимаю суть предложения. В данный момент переменные класса помеченного final будет звать виртуальные функции как встроенные (в обход всей виртуализации):\r\n```cpp\r\nstruct C final : B {\r\n virtual void doSMT() override final {}\r\n void clear() {}\r\n};\r\n\r\n\r\nint main()\r\n{\r\n C c;\r\n c.exec(); // same as c.C::exec();\r\n c.clear(); // same as c.C::clear();\r\n}\r\n```\r\n\r\n**dix75, 26 января 2017, 11:36**\r\nyndx-antoshkka,\r\n1. >> В данный момент переменные класса помеченного final будет звать виртуальные функции как встроенные (в обход всей виртуализации):\r\nГде такое написано в стандарте такого нет.(Не нашел, был бы признателен , если ткнули пальцем)\r\n2. Специально проверил asm для gcc.\r\n```cpp\r\nvtable for C:\r\n.quad 0\r\n.quad typeinfo for C\r\n.quad B::exec()\r\n.quad C::doSMT()\r\n.quad C::~C()\r\n.quad C::~C()\r\n```\r\nКонечно это не показатель.\r\n3. Хотелось бы видеть то, что для класса С (не будет созаваться виртуальная таблица и др., т.е. отсутствие дополнительных накладных расходов).\r\nА чистый класс, в котором для компилятора все известо (все вируальные функции-член и данные-член),\r\nОчень упрощенно (появляется некая разновидность POD типа).\r\n\r\n**yndx-antoshkka, 26 января 2017, 12:43**\r\n> 1.\r\nВ стандарте нет, но в нём редко прописываются оптимизации. В добавок данную оптимизацию не всегда можно произвести. Информация о том что GCC оптимизирует на основе final есть вот тут https://gcc.gnu.org/gcc-4.9/changes.html \"Devirtualization now takes into account anonymous name-spaces and the C++11 final keyword.\"\r\n\r\n> 2.\r\n> 3.\r\nЕсли pinned должен ещё убирать таблицу виртуальных функций из базовых классов и всё их содержимое переносить внутрь класса С... тогда это очень интересное предложение, но возникает множество вопросов:\r\n1. Если тело классов A и B объявлено в отдельном cpp файле, то у нас нет возможности при генерации кода для C сообщить в другую единицу трансляции о том, что все виртуальные вызовы внутри A и B надо девиртуализировать и вызывать функции класса C\r\n2. Сломается dynamic_cast и catch(A&). При этом для некоторых случаев будет срабатывать, а для некоторых - не будет. Вообще не понятно, как компилятору с таким работать, когда класс A может быть классом с vtable или без него одновременно.\r\n\r\n**ru.night.beast, 27 января 2017, 12:00**\r\nyndx-antoshkka> 3\r\nпроще всего сделать так, чтобы компилятор воспринимал класс С как отдельный класс без базы. останутся проблемы 1, но по крайней мере 2 решится.\r\n\r\nну и возникает вопрос в практической нужности всего этого.\r\nкак понимаю, это что-то вроде желания иметь mixin в классе.\r\n\r\n**ru.night.beast, 28 января 2017, 13:21**\r\nтут подумалось что если все сделать через агрегирование с автоматической генерацией функций, то с 1 и 2 не должно быть проблем.\r\n\r\n**dix75, 30 января 2017, 11:58**\r\nyndx-antoshkka,\r\n1. Возможность оптимизации основанную на разбрасывании кода в различных единицах трансляции думаю производители компиляторов лучше ответят на этот вопрос.\r\n2. dynamic_cast сломается , думаю здесь больше сломается. такие вещи и не предпологаются использовать, в любом случаи это будет неопределенное поведение и каждый в праве выбирать, что ему нужно.\r\n3. Лучше дать компилятору право выбирать, т.е сделать это ключевое слово как рекомендацию компилятору на выполнение данного действия\r\n\r\n**dix75, 30 января 2017, 12:04**\r\nru.night.beast,\r\nПрактическая значимость, в отсутствии дополнительных накладных расходов (виртуальная таблица и др).\r\nОчень часто базовые классы создаются как интерфейсы(только для переопределения определенных методов) и их использование не предпологается в виртуальности.\r\n\r\n**yndx-antoshkka, 30 января 2017, 19:11**\r\nКак верно заметил ru.night.beast@, если при таком pinned наследовании pinned класс воспринимать как класс без наследования - тогда организовать подобное можно. Базовые классы перестанут быть доступными и кастования от базового класса к pinned классу тоже будет приводить к ошибке компиляции.\r\n\r\nВсё ещё непонятно, как решать проблему 1). Многие компиляторы не подразумевают кодогенерацию во время линковки, или подобная кодогенерация существенно замедлит линковку, даже в отладочной сборке. Разработчики компиляторов будут против.\r\n\r\nЕсть идеи как перенести кодогенерацию на этап компиляции?\r\n\r\n**ru.night.beast, 2 марта 2017, 10:01**\r\nОбсуждение похожего предложения\r\nhttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/05c474b6-b2e6-4b4f-817b-e3e0bf376a75%40isocpp.org?utm_medium=email&utm_source=footer\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801693472/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801694470", + "html_url": "https://github.com/cpp-ru/ideas/issues/126#issuecomment-801694470", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/126", + "id": 801694470, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMTY5NDQ3MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-18T07:23:00Z", + "updated_at": "2021-03-18T07:23:00Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 25 января 2017, 16:54**\r\nРаспишу поподробнее суть предложения:\r\n\r\nКомитет был против того, чтобы начать генерировать операторы сравнения по умолчанию и против того, чтобы генерировать операторы сравнения с помощью конструкций вида bool operator<(const foo&, const foo&) = default;. Тогда в кулуарах родилась идея:\r\n\r\nСделать operator<=>() или «operator spaceship», возвращающий сразу значения less, equal, greater;\r\nПри наличии этого оператора — генерировать все операторы сравнения;\r\n\r\n**dix75, 26 января 2017, 11:17**\r\nyndx-antoshkka,\r\nНу это я как бы знаю. А proposal есть?\r\n\r\n**yndx-antoshkka, 26 января 2017, 12:45**\r\nПока proposal нет. Если к концу 2017 года не появится - можно будет попробовать написать.\r\n\r\n**yndx-antoshkka, 30 января 2017, 16:05**\r\nГерб Саттер начал прорабатывать идею с operator<=>\r\n\r\n**dix75, 10 февраля 2017, 13:25**\r\nyndx-antoshkka,\r\nОтлично, будет что обсудить\r\n\r\n**yndx-antoshkka, 14 февраля 2017, 16:57**\r\nProposal доступен по ссылке http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0515r0.pdf\r\n\r\nЕсли есть какие комментарии, замечания - пишите сюда, на заседании спрошу/передам.\r\n\r\n**yndx-antoshkka, 13 ноября 2017, 13:10**\r\nОператор spaceship приняли в С++20", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801694470/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801696111", + "html_url": "https://github.com/cpp-ru/ideas/issues/127#issuecomment-801696111", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/127", + "id": 801696111, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMTY5NjExMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-18T07:26:25Z", + "updated_at": "2021-03-18T07:26:25Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 30 января 2017, 18:52**\r\nВ данный момент обсуждаются близкие идеи:\r\n1) `std::scope_exit`, `std::scope_success`, `std::scope_fail` http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0052r2.pdf\r\n2) анонимные переменные (что-то наподобие `lock_guard(mutex_) { /* your code goes here */ }`\r\n\r\nПункт 1) - более функциональный, пункт 2) - красивее по синтаксису и не привязан к try {}\r\n\r\nfinally хорошо смотрится в языках где нет деструкторов или время их вызова не гарантировано. В C++ принято описывать логику в деструкторах. При этом ограничения у finally будут такие же как и у деструкторов, но о деструкторах все уже в курсе:\r\n```cpp\r\nstruct foo {\r\n ~foo() { throw 3; } // bad! many people know that!\r\n};\r\n\r\n// ...\r\n\r\ntry {\r\n throw 1; // throws\r\n} finally {\r\n throw 2; // std::terminate, surprise!\r\n}\r\n```\r\n\r\n**dix75, 31 января 2017, 11:46**\r\nyndx-antoshkka,\r\nСпасибо во многом согласен, но в C++ на сколько я помню все-таки добавили Garbage Collector хоть и опционально, в этом случае время вызова деструктора как раз не определено.\r\n\r\n**Михаил Мальцев, 30 января 2017, 21:17**\r\nВ C++ намеренно нет finally:\r\nhttp://www.stroustrup.com/bs_faq2.html#finally\r\n\r\n**dix75, 31 января 2017, 11:39**\r\nМихаил Мальцев,\r\nВсе не так однозначно в С++/CLI finally есть..\r\n\r\n**В, 3 марта 2017, 12:01**\r\nМихаил Мальцев, а в Core Guidelines тот же Страуструп предлагает finally :-)\r\n\r\n**yndx-antoshkka, 4 марта 2017, 8:30**\r\njaroslavleff, не верьте ему, он троллит :)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801696111/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801697369", + "html_url": "https://github.com/cpp-ru/ideas/issues/128#issuecomment-801697369", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/128", + "id": 801697369, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMTY5NzM2OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-18T07:28:56Z", + "updated_at": "2021-03-18T07:28:56Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 30 января 2017, 18:32**\r\nВы имеете в виду нечто наподобие polymorphic_cast http://www.boost.org/doc/libs/1_63_0/libs/conversion/cast.htm ?\r\n\r\n**dix75, 31 января 2017, 11:33**\r\nyndx-antoshkka,\r\nВозможно, но отталкивался от safe_cast от С++/CLI\r\n\r\n**yndx-antoshkka, 31 января 2017, 18:21**\r\nЕсли делать не как конструкцию языка, а как функцию в STL - проблем быть не должно.\r\n\r\nВаши дальнейшие шаги:\r\n* описать идею на английском на https://groups.google.com/a/isocpp.org/forum/?fromgroups#!forum/std-proposals и дождаться отзывов\r\n* написать пропозал\r\n\r\nПри возникновении любых вопросов - обращайтесь, помогу. Если понадобится помощь с английским, с тем как начать писать proposal или с описанием идеи на std-proposals - тоже обращайтесь.\r\n\r\n**mrgordonfreman, 31 января 2017, 18:05**\r\nЯ за, но только если реализовать не в виде конструкции языка, а где-нибудь в STL (немного шаблонной магии + dynamic_cast)\r\n\r\n**Дмитрий, 7 февраля 2017, 19:21**\r\nВ общем-то, проблема решается правильной расстановкой звёздочек и апмерсандов при динамик_касте.\r\n\r\n**dix75, 10 февраля 2017, 13:24**\r\ndmitriy@izvolov.ru,\r\nДа, это правда. и в случае приведения к ссылке можно получить исключение.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801697369/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801701970", + "html_url": "https://github.com/cpp-ru/ideas/issues/129#issuecomment-801701970", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/129", + "id": 801701970, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMTcwMTk3MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-18T07:37:04Z", + "updated_at": "2021-03-18T07:37:04Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 30 января 2017, 19:31**\r\nРаспишите пожалуйста подробнее, какого эффекта вы желаете добиться? Если вам нужно просто хранить функции/функторы, то кажется что std::function вам должен подойти. Если вам нужен future, а сам результат не нужен - то возможно std::packaged_task уже делает всё необходимое.\r\n\r\n**Sir-VestniK, 30 января 2017, 20:31**\r\nyndx-antoshkka, `std::funcition` может хранить только `CopyConstructable` и `CopyAssignable` функциональные объекты, так что он не подходит под `MoveConstructable`, `MoveAssignable` тип std::packaged_task.\r\n\r\n`std::packaged_task` аллоцирует дополнительный shared state и синхронизует доступ к нему при вызове operator() в то время как в реальности этого не требуется.\r\n\r\nПример того что хочется иметь возможность делать:\r\n\r\n* Допустим у нас есть вот такая очередь или ей подобная: https://github.com/VestniK/portable_concurrency/blob/master/test/closable_queue.h\r\n* есть пул соединений с базой, пул потоков висящий на этой очереди и глобальный std::atomic сигнализирующий о необходимости завершить приложение.\r\n* хочется без лишних самописных type-erasure, доп аллокаций и ненужной синхронизации на дополнительном shared state писать подобные функции:\r\n```cpp\r\ntemplate\r\nauto enque_task(closable_queue&, sql::connection&)>>& queue, F&& f) {\r\n using R = std::result_of_t&, sql::connection&)>;\r\n std::packaged_task task{std::forward(f)};\r\n auto res = task.get_future();\r\n queue.emplace(std::move(task));\r\n return res;\r\n}\r\n```\r\nнаружу ушёл `std::future` знающий тип результата, а в функции разгребающие очередь ушли упакованные задачи. Сделть подобное только через интерфейс `std::packaged_task` эффективно невозможно, так как shared state который он оборачивает невидим никоим образом через API стандартной библиотеки.\r\n\r\n\r\n**Sir-VestniK, 30 января 2017, 20:35**\r\nSir-VestniK, перформатирую фрагмент кода, так как он абсолютно нечитабелен\r\n```cpp\r\nusing task_signature = std::ignore_t(std::atomic&, sql::connection&);\r\n\r\ntemplate\r\nauto enque_task(\r\n closable_queue>& queue,\r\n F&& f)\r\n{\r\n using R = std::result_of_t&, sql::connection&)>;\r\n std::packaged_task task{std::forward(f)};\r\n auto res = task.get_future();\r\n queue.emplace(std::move(task));\r\n return res;\r\n}\r\n```\r\n\r\n**yndx-antoshkka, 30 января 2017, 21:15**\r\nЕсли я вас верно понял, то вашу проблему более-менее можно решить через std::promise:\r\n```cpp\r\nusing task_signature = void(std::atomic&, sql::connection&);\r\n\r\ntemplate\r\nauto enque_task(closable_queue>& queue, F&& f) {\r\n using R = std::result_of_t&, sql::connection&)>;\r\n std::promise p;\r\n auto res = p.get_future();\r\n queue.emplace(\r\n [f = std::forward(f), p = std::move(p)](std::atomic& b, sql::connection& c) {\r\n p.set_value(f(b, c));\r\n }\r\n );\r\n return res;\r\n}\r\n```\r\nНо останется недостаток в виде возможной динамической аллокации внутри std::function. Или F у вас ещё и не копируемый? Или вы ещё и от shared_state хотите избавиться?\r\n\r\n**Sir-VestniK, 1 февраля 2017, 7:22**\r\nyndx-antoshkka, как и `packaged_task`, promise является `MoveOnly` типом и лямдба в которую мы захватили его через move тоже лишилась конструктора копирования.\r\n\r\nВсе типы являющиеся пишущими владельцами shared-state некопируемы. Исключением может являться shared_future полученный через std::async(std::launch::deferred,...).share() его можно скопировать в разные потоки и тот кто первый скажет get позовёт захваченный функтор, а все следующие будут дожитаться его завершения и только получат результат. Но с таким подходом предсказать поток в котором позовётся функция крайне сложно и ненароком можно надолго занять IO либо GUI поток, а этого делать как правило никогда не хочется.\r\n\r\nФунктор отдаваемый на асинхронное исполнение тоже часто бывает некопируемым. Я отдал критичный ресурс на владение задаче которая с ним работает и передаст его мне обратно либо разрушит по завершению, разумеется ресурс будет некопируемым и сам функтор тоже.\r\n\r\nВ результате пишется либо вышивание крестиком в виде: сложим promise либо packaged_task в shared_ptr, его захватим в лямбду, которую сложим в std::function а внутри лямбды позовём. Либо пишется универсальный type_erasure для MoveOnly функторов который гарантирует одноразовый вызов функции... стоп, но это же packaged_task, только с перламутровыми пуговицами в виде отсутствия знания о возвращаемом результате.\r\n\r\nПроблема с packaged_task в том, что он параметризован типом возвращаемого значения функтора и исключительно для метода get_future, который может быть позван только один раз, после чего повторный вызов будет бросать исключение future_error с кодом future_already_retreived. При этом тот кто будет вызывать созданную задачу ничего знать о типе возвращаемого значения знать, как правило, не хочет и не может.\r\n\r\nЧего хочется: специализации packaged_task которая больше не знает о типе вовращаемого значения и просто через move конструктор от packaged_task с произвольным типом результата функтора забирает себе во владение пишущую ссылку на shared-state задачи. После чего экземпляр такого packaed_task может быть отдан исполнителю которому важна только сигнатура задачи.\r\n\r\nУже в двух последних проектах на околосамописных future по мотивам std::future с данной проблемой сталкивался. Хочется, чтобы вместе с future::then в стандарт (насколько я понимаю уже не раньше чем в C++20) пришёл и метод решения данной проблемы.\r\n\r\n**yndx-antoshkka, 1 февраля 2017, 12:37**\r\nАга. То есть вам нужно что-то наподобие\r\n```cpp\r\ntemplate \r\nclass packaged_task_base {\r\n void operator()(Args... args);\r\n};\r\n\r\n\r\ntemplate \r\nclass packaged_task: public packaged_task_base {\r\n future get_furute();\r\n};\r\n```\r\nМне идея очень нравится! Вы готовы заняться написанием proposal? По идее он будет достаточно небольшой.\r\n\r\n**Sir-VestniK, 2 февраля 2017, 7:45**\r\nyndx-antoshkka, Да, на выходных начну писать документ в своей реализации Concurrency TS на гитхабе, там же сделаю прототип.\r\n\r\n**Sir-VestniK, 5 февраля 2017, 20:03**\r\nyndx-antoshkka, начал работу над proposal здесь: https://github.com/VestniK/portable_concurrency/blob/result-erased-task-proposal/proposal/proposal.tex когда законченый черновой вариант будет готов отпишусь комментарием в данном обсуждении ещё раз.\r\n\r\n**Sir-VestniK, 19 февраля 2017, 14:19**\r\nyndx-antoshkka, Написал текст предложения. LaTeX исходник по ссылке выше, PDF версия: https://yadi.sk/i/Mn7hi_ax3EFmkm\r\n\r\n**yndx-antoshkka, 5 марта 2017, 2:22**\r\nВыглядит хорошо. Пара комментариев:\r\n* Надо добавить свой email для обратной связи в proposal.\r\n* Есть пара опечаток (в том числе в заголовках)\r\n* Опишите на английском вашу идею в рассылке std-proposals@isocpp.org (тема письма должна начинаться с [std-proposals]) и приглядывайтесь к коментариям\r\n\r\n**yndx-antoshkka, 27 марта 2017, 16:16**\r\nSir-VestniK, помимо выше озвученного, надо еще добыть официальный номер для своего proposal. Как будете готовы - пишите, помогу.\r\n\r\n**Sir-VestniK, 6 апреля 2017, 22:34**\r\nyndx-antoshkka, Извиняюсь, что пропал. Было много семейных хлопот связанных с рождением первого ребёнка в семье :)\r\n\r\nПо результатам обсуждения на std-proposals https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/doVBK_QOsyY пришли к выводу, что данное предложение решает задачу которая может быть решена посредством std::unique_function (N4543). При этом unique_function является более общим решением и лучше ориентироваться на него.\r\n\r\n**yndx-antoshkka, 7 апреля 2017, 13:02**\r\nSir-VestniK, мои поздравления!\r\n\r\nНу а по поводу proposal - если у вас есть какие-то пожелания по N4543, пишите их сюда. Я передам остальным людям в комитете.\r\n\r\n**Sir-VestniK, 7 апреля 2017, 15:48**\r\nyndx-antoshkka, я хочу написать в своём репозитории в отдельной ветке реализацию unique_function с гарантией отсутствия двойного разрушения информации о типе при работе с packaged_task. Такая гарантия уже даётся при работе с указателями на функции и std::function в самом N4543. Добавив такое трбование и на packaged_task можно добиться, чтобы unique_function максимально эффективно работал со всеми обёртками над функциональными объектами предоставляемыми стандартной библиотекой.\r\n\r\nРеализацией займусь месяца через полтора. Сначала хочу добить when_any и when_all, чтобы иметь минимальную реализацию ConcurrencyTS на которой можно будет писать proof-of-concept'ы.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801701970/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801703006", + "html_url": "https://github.com/cpp-ru/ideas/issues/129#issuecomment-801703006", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/129", + "id": 801703006, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMTcwMzAwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-18T07:39:04Z", + "updated_at": "2021-03-18T07:39:04Z", + "author_association": "MEMBER", + "body": "Функционал предложения покрывается `std::function_ref` http://wg21l.ink/p0792 , который окажется ориентировочно в C++23", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801703006/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801705433", + "html_url": "https://github.com/cpp-ru/ideas/issues/130#issuecomment-801705433", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/130", + "id": 801705433, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMTcwNTQzMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-18T07:43:35Z", + "updated_at": "2021-03-18T07:43:35Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 9 февраля 2017, 21:42**\r\nА для чего может быть полезно определять свой класс в уже существующем namespace?\r\nЗачем определять функцию (скажем, чтобы, находилась по ADL) или специализировать класс (std::hash, к примеру) я понимаю.\r\nПредлагаете ли Вы также разрешать объявлять класс? А объявлять и/или определять функции и переменные, объявлять typedef'ы и typealias'ы?\r\nВ случае nested namespace definition внутренние namespace автоматически создаются, если они не были к тому моменты известны компилятору, Вы предлагаете делать то же самое? Но если в случае namespace квалификатор обязан быть namespace, то для всего остального это не так.\r\nКажется, что такая фича приведет к существенному усложнению языка, позволив пользователю сократить всего O(1) слов/букв (в отличие от nested namespace definition, где экономиться O(количество вложенных namespace).\r\n\r\n**romanslonpp, 10 февраля 2017, 6:50**\r\nAndrey Davydov, Что значит в существующий? Мы определяем класс внутри неймспейса - существует он, либо нет - неважно.\r\n\r\nЯ не особо понимаю смысла в ваших рассуждениях. Естественно ответ на все вопросы - да т.к. это просто сахар.\r\n\r\nПо поводу \"усложнения\" - я так же понимаю как, чем и что конкретно это усложнит. С++ уже давно не язык про простоту. Это даст возможность удобней писать и читать код, а то, что для этого придётся изучить на одну фичу больше - это не есть проблема.\r\n\r\nЭто не сокращает буквы - это в первую очередь сокращает лапшу, как это делает и nested namespace definition. Лапша в данном случае это бессмысленная вложенность. Да и подсчёт неверен т.к. это более частый юзкейс нежели nested namespace definition. Если взять реальную вложенность 2-3неймспейса, то эти на 1-2 вложения больше никак не перекрывают то, что засунуть что-то в detail требуется ой как более часто. А это только один из юзкейсов.\r\n\r\n**Andrey Davydov, 10 февраля 2017, 12:58**\r\nromanslonpp,\r\n\r\n> Что значит в существующий?\r\n\r\nЭто цитата из Вашего предложения.\r\n\r\n> По поводу \"усложнения\" - я так же понимаю как, чем и что конкретно это усложнит.\r\n\r\nНаверное, я нечетко выразился. Я имел в виде неоднозначность как уже написал @mrgordonfreman комментарием ниже. Приведу еще пару примеров не с классами.\r\n```cpp\r\nsize_t A::counter_ = 0; // это статическое поле класса или глобальная переменная?\r\nvoid B::foo() {} // это функция-член или свободная функция?\r\n```\r\nСейчас, если при определении класса/функции/переменной используется qualified name, то соответствующий класс/функция/переменная должны были ранее быть объявлены, а значит, точно должен резолвитья name qualifier. Вы же предлагаете снять это ограничение, сказав, что если квалификатор не резолвиться, то будем считать его namespace'ом. Это, мне кажется, как при отсутствии типа предполагать int -- не очень хорошая идея, от которой отказались.\r\n\r\n**mrgordonfreman, 10 февраля 2017, 11:06**\r\nТакая запись уже используется для определения вложенных классов.\r\n```cpp\r\nstruct A { struct B; };\r\nstruct A::B {};\r\n```\r\nЕсли еще \"нагрузить\" это неймспейсами, то получим ambiguity problem. Что может скрываться за записью class A::B::C {} ?\r\n1) namespace A { namespace B{ class C; } }\r\n2) namespace A { class B { class C; } }\r\n3) class A { class B { class C; } }\r\n\r\n**dix75, 10 февраля 2017, 13:13**\r\nmrgordonfreman,\r\n1. Не хочу вас обидеть, но автор в начале своего предположения написал\r\n\"В C++17 наконец-то добавили возможность не писать так:\", это и говорит о вложенности.\r\n\r\n2. Никакой неоднозначности нет.\r\n\r\n**yndx-antoshkka, 10 февраля 2017, 13:38**\r\nС одной стороны, идея интересная, так как позволит подобные записи:\r\n```cpp\r\nnamespace detail {\r\n inline boost::filesystem::path program_location_impl(boost::system::error_code& ec);\r\n} // namespace detail\r\n```\r\nСократить до:\r\n```cpp\r\ninline boost::filesystem::path detail::program_location_impl(boost::system::error_code& ec);\r\n```\r\nС другой стороны, читаемость становится сильно хуже: уже не видно с первого взгляда, что функция не часть публичного API.\r\n\r\nНеразрешимых технических проблем при реализации подобного механизма в компиляторах я не вижу.\r\n\r\nОпишите более подробно вашу идею:\r\n* можно ли писать `class A::B::C {}` если namespace A и B раньше не были определены\r\n* будет ли эта техника работать для функций/enum/переменных\r\n* поможет ли этот синтаксис если захочется сущность объявлять в анонимном namespace\r\n\r\n**dix75, 4 марта 2017, 16:41**\r\nyndx-antoshkka, Идея действительно интересная,но нужно обсуждать.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801705433/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801707158", + "html_url": "https://github.com/cpp-ru/ideas/issues/131#issuecomment-801707158", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/131", + "id": 801707158, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMTcwNzE1OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-18T07:46:43Z", + "updated_at": "2021-03-18T07:46:43Z", + "author_association": "MEMBER", + "body": "**develoit, 15 февраля 2017, 6:59**\r\n```cpp\r\nif (!empty(banned_users)) {\r\n //...\r\n}\r\n```\r\nи ведь понятней)\r\nостается только ждать запила в стандарт x.f() <-> f(x)\r\n\r\n**ya.imdex, 21 февраля 2017, 16:52**\r\n```cpp\r\nif (banned_users.non_empty()) { ... }\r\n```\r\nБудет еще понятнее\r\n\r\n**burannah, 24 февраля 2017, 18:25**\r\nРазве std::size() не достаточно ?\r\n\r\n**dix75, 4 марта 2017, 16:38**\r\nburannah, не достаточно, эта операция может быть дорогостоящая (например), operator bool() был с константным временем для всех.\r\nХотя я против идеи.\r\n\r\n**burannah, 27 марта 2017, 14:14**\r\ndix75, ну хотелось бы заметить, что со времён С++11 size() имеет константную сложность для строк и всех контейнеров (у кого он есть). Используешь forward_list - будь готов вызывать empty().\r\n\r\n**В, 3 марта 2017, 11:59**\r\nНе понимаю минусующих.\r\nА особенно тех, кто говорит: \"А что, XYZ недостаточно?\"\r\nЕсли вас послушать, для всего достаточно C и void*. Остальное для слабаков.\r\n\r\n**Сергей Иванов, 21 апреля 2017, 17:13**\r\nПредставим себе следующий рефактор: заменяем std::vector на std::shared_ptr>. Ну, захотелось нам этот вектор куда-то передать по ссылке, бывает. Дальше автоматически заменяем 'banned_users.' на 'banned_users->'. Проверяем - компилируется. Пошли дальше разрабывать. А баг потом тестеры найдут. Может быть.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/801707158/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802804186", + "html_url": "https://github.com/cpp-ru/ideas/issues/132#issuecomment-802804186", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/132", + "id": 802804186, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjgwNDE4Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T12:38:12Z", + "updated_at": "2021-03-19T12:38:46Z", + "author_association": "MEMBER", + "body": "**mrgordonfreman, 26 февраля 2017, 16:50**\r\nВроде модули должны решить эту проблему - детали реализации просто не будут помечаться как интерфейс модуля\r\n\r\n**ya.imdex, 27 февраля 2017, 15:06**\r\nТекущие реализации модулей не затрагивают пространства имен. Речь в них идет только о module private типах.\r\n\r\n**yndx-antoshkka, 1 марта 2017, 23:06**\r\nПредлагаю расширить ещё и на namespace:\r\n```cpp\r\nnamespace boost { private namespace detail { /* ... */ }}\r\n```\r\nКак вам предложение?\r\n\r\n**Игорь, 31 октября 2017, 19:11**\r\nyndx-antoshkka, только за. Отличная идея.\r\n\r\n**yndx-antoshkka, 31 октября 2017, 21:07**\r\nПопробуйте начать писать proposal по инструкции https://cpp-ru.github.io/instruction\r\n\r\n**ya.imdex, 2 марта 2017, 21:55**\r\nyndx-antoshkka, впринципе подобный механизм может (и скорее всего должен) работать для всех возможных объявлений внутри пространства имен.\r\n\r\n**mr.obvious, 12 июля 2017, 15:07**\r\nТак недолго и до конструкторов неймспейса.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802804186/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802805898", + "html_url": "https://github.com/cpp-ru/ideas/issues/133#issuecomment-802805898", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/133", + "id": 802805898, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjgwNTg5OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T12:41:01Z", + "updated_at": "2021-03-19T12:41:01Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 4 марта 2017, 22:38**\r\nЭти предложения гарантированно будут рассмотрены и скорее всего их примут в стандарт (после нескольких итераций). Не вижу чем мы можем тут помочь.\r\n\r\n**borisbn, 21 апреля 2017, 17:53**\r\n\r\n> хотя она кажется несколько усложненной и \"раздутой\"\r\n\r\nНесколько ? Когда `date::year()` возвращает `int`, а `date::month()` - класс типа month_type ? Когда мне каждый раз приходится вспоминать название календаря, по которому уже несколько веков живёт весь мир (gregorian)? Когда для перевода в строку в моём формате нужно как минимум 5 строк кода с функциями/классами типа `posix_time::time_input_facet` и `istringstream::imbue` ? Лучше бы Qt-шный вариант выбрали..\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802805898/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802807441", + "html_url": "https://github.com/cpp-ru/ideas/issues/133#issuecomment-802807441", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/133", + "id": 802807441, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjgwNzQ0MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T12:44:04Z", + "updated_at": "2021-03-19T12:44:04Z", + "author_association": "MEMBER", + "body": "Всё стало частью C++20 http://eel.is/c++draft/time", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802807441/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802808716", + "html_url": "https://github.com/cpp-ru/ideas/issues/134#issuecomment-802808716", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/134", + "id": 802808716, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjgwODcxNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T12:46:25Z", + "updated_at": "2021-03-19T12:46:25Z", + "author_association": "MEMBER", + "body": "**Antervis, 8 марта 2017, 19:06**\r\nВозможно, тогда стоит добавить метод `integral_t to_integral() const noexcept;`, где `integral_t` определен как беззнаковый целочисленный тип минимального достаточного размера, чтобы вместить все биты, или `unsigned long long`.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802808716/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802810207", + "html_url": "https://github.com/cpp-ru/ideas/issues/135#issuecomment-802810207", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/135", + "id": 802810207, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjgxMDIwNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T12:49:22Z", + "updated_at": "2021-03-19T12:49:22Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 4 марта 2017, 12:44**\r\nМожет быть тогда лучше адаптировать С99 designated initializers? На это есть proposal http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0329r0.pdf (я не знаю его судьбу).\r\nОсновной контраргумент, как я понимаю, в том что это потенциально приводит к не полностью инициализированным объектам (в Вашем примере, все поля имеют значения по умолчанию, но обычно это не так). Возможно Вас заинтересует обсуждение на stackoverflow: http://stackoverflow.com/questions/18731707/why-does-c11-not-support-designated-initializer-list-as-c99\r\n\r\n**dix75, 4 марта 2017, 15:38**\r\nAndrey Davydov, \"это потенциально приводит к не полностью инициализированным объектам\"\r\nЭта ситуация характерна для С++ в общем случае, в отличии от С# , поэтому не вижу здесь проблемы.\r\n\r\n**Andrey Davydov, 4 марта 2017, 15:52**\r\ndix75, Не совсем так, в C++ есть удобные способы инициализировать поля: конструкторы, aggregate initalization, zero initialization. Давайте рассмотрим следующую ситуацию:\r\n```cpp\r\nstruct X\r\n{\r\n int a, b;\r\n};\r\n\r\nX x0; // x0.a, x0.b are not initialized\r\nX x1 { 1, 2 }; // x1.a, x1.b are initialized\r\nX x2 {}; // x2.a, x2.b are zero initialized\r\nX x3 { .a = 5 }; // x3.a is initialized, x3.b is not initialized (C99)\r\n```\r\nМне не нравится, что x3.b не будет инициализировано, в то время как поля x2 будут.\r\n\r\n**dix75, 4 марта 2017, 16:22**\r\nAndrey Davydov,\r\nчто не совсем, так?\r\nЯ в своем посте говорю, что сейчас существует возможность инициализовать некоторые и не инициализировать другие.\r\n```cpp\r\nstruct X\r\n{\r\n int a = 10;\r\n int* y;\r\n};\r\nX x;\r\n```\r\nЧастично инициализованный объект.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802810207/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802812213", + "html_url": "https://github.com/cpp-ru/ideas/issues/135#issuecomment-802812213", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/135", + "id": 802812213, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjgxMjIxMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T12:53:14Z", + "updated_at": "2021-03-19T12:53:14Z", + "author_association": "MEMBER", + "body": "[Designated initializers для агрегатов](http://eel.is/c++draft/dcl.init.aggr) приняли в C++20\r\n\r\nСинтаксис чуть отличатеся от предложенного, функционал такой же", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802812213/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802981796", + "html_url": "https://github.com/cpp-ru/ideas/issues/136#issuecomment-802981796", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/136", + "id": 802981796, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjk4MTc5Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T17:07:01Z", + "updated_at": "2021-03-19T17:08:12Z", + "author_association": "MEMBER", + "body": "**mrgordonfreman, 4 марта 2017, 12:32**\r\nМожно пойти дальше и добавить в std::initializer_list все const-методы из std::array (rbegin, rend, empty, front, back).\r\nСейчас обращение по индексу можно так сделать\r\n```cpp\r\nvoid foo(std::initializer_list init) {\r\n for (size_t i = 0; i < init.size(); i += 2)\r\n std::cout << *(init.begin() + i) << ' ';\r\n std::cout << std::endl;\r\n}\r\n```\r\nМожете привести пример, когда вместо initializer_list пришлось использовать другие контенйнеры?\r\n\r\n**dix75, 4 марта 2017, 15:57**\r\nmrgordonfreman, Согласно стандарту begin() + index не гарантирует правильное поведение (не оговорено, что используются random access iterator) , но если посмотреть внимательно то стандарт также говорит, что\r\n```\r\nconstexpr const E* end() const noexcept; Returns:\r\nbegin() + size()\r\n```\r\nлогично предположить, что должно работать правильно, но для более правильного поведения, все же лучше использовать std::advance, std::distance и др.\r\n\r\n**dix75, 4 марта 2017, 16:04**\r\nmrgordonfreman, Самое большое ограничение это не возможность копирования\r\n18.9.2 Copying an initializer list does not copy the underlying elements.\r\nВ этом случае приходится использовать vector, хотя это и избыточно\r\n\r\n**dix75, 4 марта 2017, 16:10**\r\nmrgordonfreman,\r\n```cpp\r\nstruct Cool {\r\n std::initializer_list list_;\r\n\r\n Cool(std::initializer_list list)\r\n : Cool(\"\", list){} // UB (undefined behavior)\r\n\r\n Cool(std::string str, std::initializer_list list)\r\n : list_(list){} // UB\r\n};\r\n```\r\n\r\n**yndx-antoshkka, 4 марта 2017, 22:41**\r\nГотов помочь с написанием proposal.\r\n\r\n**EVGVir, 25 сентября 2017, 17:38**\r\nОчень странно, что этого нет в текущей реализации. Ведь по определению initializer_list это легковесная прокси для доступа к *массиву* объектов.\r\n\r\n**yndx-antoshkka, 27 сентября 2017, 11:44**\r\nПоявилась мини инструкция по написанию предложений https://stdcpp.ru/podgotovka-predlozheniya-v-standart-c-instruktsiya\r\n\r\nПопробуйте написать proposal на ваше предложение (не забудьте обсудить идею в англ. группе)\r\n\r\n**Антон Бикинеев, 26 января 2018, 16:49**\r\n> 1. Обход листа циклом for each иногда не является достаточным решением.\r\nА не приведете юз-кейз, когда operator[] действительно для initializer_list действительно нужен?\r\n\r\n**Daniil Goncharov, 18 ноября 2019, 17:00**\r\nТекст прополза можно посмотреть здесь, версия в pdf: https://github.com/Neargye/initializer_list-operator_square_bracket-proposal/blob/master/papers/P1990R0.pdf\r\n\r\nНайденные ошибки и улучшения можно отсылать в issues или pr https://github.com/Neargye/initializer_list-operator_square_bracket-proposal.\r\n\r\n**yndx-antoshkka, 21 июля 2020, 9:41**\r\nВ комитете идея публикуется под номером https://wg21.link/P1990\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802981796/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802984282", + "html_url": "https://github.com/cpp-ru/ideas/issues/136#issuecomment-802984282", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/136", + "id": 802984282, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjk4NDI4Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T17:11:24Z", + "updated_at": "2021-03-19T17:11:24Z", + "author_association": "MEMBER", + "body": "Мужденародный комитет холодно встретил https://wg21.link/P1990\r\nГоворят что недостаточно мотивации", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802984282/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802985150", + "html_url": "https://github.com/cpp-ru/ideas/issues/2#issuecomment-802985150", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/2", + "id": 802985150, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjk4NTE1MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T17:12:56Z", + "updated_at": "2021-03-19T17:12:56Z", + "author_association": "MEMBER", + "body": "Комитет холодно встретил предложение из-за огромных различий в работе динамических библиотек на разных платформах.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802985150/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802985793", + "html_url": "https://github.com/cpp-ru/ideas/issues/1#issuecomment-802985793", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/1", + "id": 802985793, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjk4NTc5Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T17:14:05Z", + "updated_at": "2021-03-19T17:14:05Z", + "author_association": "MEMBER", + "body": "Комитет холодно встретил предложение из-за огромных различий в работе динамических библиотек на разных платформах.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802985793/reactions", + "total_count": 2, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 2, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802987686", + "html_url": "https://github.com/cpp-ru/ideas/issues/137#issuecomment-802987686", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/137", + "id": 802987686, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjk4NzY4Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T17:17:08Z", + "updated_at": "2021-03-19T17:17:08Z", + "author_association": "MEMBER", + "body": "**ru.night.beast, 4 марта 2017, 11:20**\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4165\r\nhttps://isocpp.org/blog/2016/02/a-bit-of-background-for-the-unified-call-proposal\r\n\r\n**dix75, 4 марта 2017, 15:31**\r\nМне больше по душе С# подход (Extension methods)\r\npublic static bool IsNumeric(this string s) {}\r\nНу в общем я за идею, думаю Майкрософт будет продвигать эту идею\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802987686/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802990335", + "html_url": "https://github.com/cpp-ru/ideas/issues/35#issuecomment-802990335", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/35", + "id": 802990335, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjk5MDMzNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T17:21:31Z", + "updated_at": "2021-03-19T17:21:31Z", + "author_association": "MEMBER", + "body": "Дубликат #30 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802990335/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802990650", + "html_url": "https://github.com/cpp-ru/ideas/issues/137#issuecomment-802990650", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/137", + "id": 802990650, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMjk5MDY1MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-19T17:22:01Z", + "updated_at": "2021-03-19T17:22:01Z", + "author_association": "MEMBER", + "body": "Дубликат #30", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/802990650/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803266144", + "html_url": "https://github.com/cpp-ru/ideas/issues/100#issuecomment-803266144", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/100", + "id": 803266144, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzI2NjE0NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T07:33:37Z", + "updated_at": "2021-03-20T07:33:37Z", + "author_association": "MEMBER", + "body": "Идеей занимались Bjarne Stroustrup и Herb Sutter: https://wg21.link/p0251\r\nВозникли проблемы с описанием работы, идея на пузе", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803266144/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803266315", + "html_url": "https://github.com/cpp-ru/ideas/issues/37#issuecomment-803266315", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/37", + "id": 803266315, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzI2NjMxNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T07:35:14Z", + "updated_at": "2021-03-20T07:35:14Z", + "author_association": "MEMBER", + "body": "Фактически, это несколько другой синтаксис для \"оператора точка\". Мне подобный синтаксис нравится больше. Пенесу обсуждение в #100 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803266315/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803266367", + "html_url": "https://github.com/cpp-ru/ideas/issues/100#issuecomment-803266367", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/100", + "id": 803266367, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzI2NjM2Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T07:35:44Z", + "updated_at": "2021-03-20T07:35:44Z", + "author_association": "MEMBER", + "body": "_Автор идеи:_ **Максим Некипелов**\r\n\r\nДобавить оператор, который будет перенаправлять поле на другой объект, в случае если компилятор не нашел поля в данном объекте через оператор точки.\r\n\r\nВ некоторых ситуациях для удобства нужно перегрузить точку, но это выглядело бы очень странно и не понятно как работало.\r\n\r\nПредлагаю добавить новый оператор redirect, который будет переадресовывать поле на другой объект, если компилятор его не нашел в действующем. Пример:\r\n```cpp\r\n#include \r\n\r\nstruct Vector\r\n{\r\n float X = 0.f;\r\n};\r\n\r\ntemplate\r\nstruct Property\r\n{\r\n T Get() const { { }; }\r\n\r\n redirect Get;\r\n};\r\n\r\nint main()\r\n{\r\n Property property;\r\n std::cout << property.X << std::endl; // поле X не было найдено внутри Property, поэтому компилятор начинает его искать в Vector, если находит неявно преображает обращение в property.Get().X\r\n}\r\n ```\r\nНа получение указателя поля:\r\n```cpp\r\n&Property::X\r\n```\r\nЭто распространяться не должно. Будет выдаваться ошибка.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803266367/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803266806", + "html_url": "https://github.com/cpp-ru/ideas/issues/30#issuecomment-803266806", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/30", + "id": 803266806, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzI2NjgwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T07:39:34Z", + "updated_at": "2021-03-20T07:39:34Z", + "author_association": "MEMBER", + "body": "Точнее, Bjarne Stroustrup и Herb Sutter занимаются UFCS / \"оператор точка\" https://wg21.link/p0251 , см обсуждение в #100\r\n\r\nПредложение **только** на методы расширения, без дополнительных сложностей с оператором точка, лишено множества проблем, обнаруженных в комитете. Можно попробовать взяться, но будет очень тяжело.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803266806/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803271545", + "html_url": "https://github.com/cpp-ru/ideas/issues/138#issuecomment-803271545", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/138", + "id": 803271545, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzI3MTU0NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T08:26:20Z", + "updated_at": "2021-03-20T08:26:20Z", + "author_association": "MEMBER", + "body": "**develoit, 9 марта 2017, 15:22**\r\nдичь какая-то)\r\nчто мешает добавить\r\n```cpp\r\nstatis Length zero() { return Length{0}; }\r\n```\r\nи сравнивать длину с длиной?\r\n```cpp\r\nauto a = Length::meters(5);\r\nstd::cout << (a < Length::zero()) << std::endl;\r\n```\r\nа вообще лучше для различных мер сделать аналогично std::chrono::duration<>\r\n\r\n**mikhail.matrosov, 14 марта 2017, 13:19**\r\ndeveloit, так более многословно. Для математика такая запись - дичь. Чтобы воспринять \"0\" нужно меньше ментальных усилий, чем \"Length::zero()\".\r\n\r\n**Сергей Вахреев, 9 марта 2017, 16:20**\r\nИмхо плохая идея. Если не нравится писать Length::meters(0), то можно сделать user-defined literal для всех мер. И код строго типизирован, и выглядит коротко и понятно\r\n\r\n**mikhail.matrosov, 14 марта 2017, 13:20**\r\nСергей Вахреев, для user-defined literal придётся указывать суффикс всегда.\r\n\r\n**Antervis, 13 марта 2017, 10:08**\r\nможно сделать через user-defined literals, но будет не 0, а что-то вроде 0_m.\r\n\r\n**mikhail.matrosov, 14 марта 2017, 13:17**\r\nAntervis, именно, нужно будет писать суффикс.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803271545/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803282008", + "html_url": "https://github.com/cpp-ru/ideas/issues/139#issuecomment-803282008", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/139", + "id": 803282008, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzI4MjAwOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T09:56:30Z", + "updated_at": "2021-03-20T09:56:30Z", + "author_association": "MEMBER", + "body": "**mrgordonfreman, 9 марта 2017, 15:57**\r\nПриведенный вариант не работает, если в tuple будет несколько одинаковых типов. Лучше делать через индексы\r\n```cpp\r\ntemplate\r\nvoid visit_impl(T&& t, V&& v, std::index_sequence)\r\n{\r\n (..., v(std::get(t)));\r\n}\r\n\r\ntemplate\r\nvoid visit(T&& t, V&& v)\r\n{\r\n visit_impl(std::forward(t), std::forward(v),\r\n std::make_index_sequence::type>::value>());\r\n}\r\n```\r\n\r\n**Сергей Вахреев, 9 марта 2017, 16:11**\r\nА почему бы просто не использовать std::apply и folding expressions, которые есть в 17 стандарте?\r\n```cpp\r\nstd::apply([] (auto&&... value) { ((std::cout << value), ...); },\r\nstd::make_tuple(100, \"500\", '!'));\r\n```\r\n\r\n**yndx-antoshkka, 9 марта 2017, 18:43**\r\nНа заседании в Коне 2017 решили продумывать идею с циклами по гетерогенным контейнерам. Что-то наподобие:\r\n```cpp\r\nfor constexpr(auto v: std::make_tuple(100, \"500\", '!')) {\r\n std::cout << v;\r\n}\r\n```\r\n\r\nБонусом получим итерацию по variadic template:\r\n```cpp\r\ntemplate \r\nvoid foo(const Args&... args) {\r\n for constexpr(auto v: args...) {\r\n std::cout << v;\r\n }\r\n}\r\n```\r\nТак что торопиться с написанием proposal для `std::visit` пока не стоит.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803282008/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803282934", + "html_url": "https://github.com/cpp-ru/ideas/issues/140#issuecomment-803282934", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/140", + "id": 803282934, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzI4MjkzNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T10:02:08Z", + "updated_at": "2021-03-20T10:02:08Z", + "author_association": "MEMBER", + "body": "**nenomius, 10 марта 2017, 14:32**\r\nhttp://wg21.link/p0553\r\n\r\n**h4tred, 27 марта 2017, 12:41**\r\nnenomius, не всё определяется только играми с битами. Есть ещё SIMD. К примеру.\r\n\r\n**h4tred, 27 марта 2017, 12:41**\r\nПлюс всякие SIMD.\r\n\r\n**yndx-antoshkka, 21 октября 2019, 18:59**\r\nДобавлено в C++20 http://eel.is/c++draft/bit\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803282934/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803313683", + "html_url": "https://github.com/cpp-ru/ideas/issues/141#issuecomment-803313683", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/141", + "id": 803313683, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzMxMzY4Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T12:52:17Z", + "updated_at": "2021-03-20T12:52:17Z", + "author_association": "MEMBER", + "body": "**Сергей Вахреев, 13 марта 2017, 13:14**\r\nВроде for constexpr хотят внедрить для итерации по variadic templates...\r\nБыло бы почти красиво, если бы лямбды поддерживали template параметры: https://godbolt.org/g/yojZLK\r\nТогда можно было бы использовать if constexpr и другие compile time фичи. Хотя при -О3 компилятор идёт внутрь лямбд и оптимизирует код так же, как и при constexpr if в подобной реализации: https://godbolt.org/g/RSXOe8\r\n\r\nНикто не подскажет, что с этим proposal: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0428r0.pdf ?\r\n\r\n**Сергей Вахреев, 13 марта 2017, 13:40**\r\nС расширением templated lambdas от gcc: https://godbolt.org/g/sKvMQS (по вышеприведенному proposal)\r\nВыбираемый диапазон индексов можно сделать по подобию boost::hana\r\n\r\n**Михаил Мальцев, 13 марта 2017, 20:28**\r\nСергей Вахреев,\r\n\r\n> Никто не подскажет, что с этим proposal\r\n\r\nВ Иссакуа его одобрили в EWG. В Коне у CWG возникла пара замечаний, которые предстоит исправить.\r\n\r\n**Игорь, 21 марта 2017, 14:33**\r\nСергей Вахреев, лямбды всё уже поддерживают, в чём у вас проблема?\r\nhttp://melpon.org/wandbox/permlink/jGbRr6PnePbZQAhz\r\n\r\n**Игорь, 21 марта 2017, 14:37**\r\nМихаил Мальцев, печально, что одобрили. Мало зубодробительного контекстно-зависимой грамматики - давайте ещё усложним и накрутим лямбды :(\r\nВоистину, каждый, предлагающий изменение в C++, для начала должен пожертвовать почку.\r\n\r\n**Сергей Вахреев, 21 марта 2017, 15:45**\r\nИгорь, у меня никаких проблем нет. Просто не додумался / потратил мало времени на эксперименты / не знал. Выберите понравившийся вариант сами.\r\n\r\n**Михаил Мальцев, 13 марта 2017, 20:22**\r\nУже есть аналогичное предложение \"Tuple-based for loops\": http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0589r0.pdf\r\n\r\n**Сергей Тиунов, 19 июня 2017, 19:15**\r\nМихаил Мальцев, согласен, предложение аналогичное в том плане, что варианты взаимозаменяемы:\r\n```cpp\r\nauto indices = std::make_tuple(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);\r\nfor (auto i : indices) { ... }\r\n\r\nconstexpr int size = std::tuple_size::value;\r\nfor constexpr (int i = 0; i < size; i++) { auto elem = std::get(tup); ... }\r\n```\r\nОднако мне кажется, что for constexpr в большинстве практических приложений будет удобнее, тогда как tuple-based for loop мне кажется удобным только вместе с рефлексией (например, напечатать все поля структуры).\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803313683/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803314517", + "html_url": "https://github.com/cpp-ru/ideas/issues/139#issuecomment-803314517", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/139", + "id": 803314517, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzMxNDUxNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T12:56:57Z", + "updated_at": "2021-03-20T12:56:57Z", + "author_association": "MEMBER", + "body": "Есть предожение https://wg21.link/p0589 на эту тему", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803314517/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803315765", + "html_url": "https://github.com/cpp-ru/ideas/issues/141#issuecomment-803315765", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/141", + "id": 803315765, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzMxNTc2NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T13:06:21Z", + "updated_at": "2021-03-20T13:06:21Z", + "author_association": "MEMBER", + "body": "Подгруппа SG7: Reflection занята проработкой этой идеию Синтаксис у них несколько отличатеся `for...` https://wg21.link/p1717r0", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803315765/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803317406", + "html_url": "https://github.com/cpp-ru/ideas/issues/142#issuecomment-803317406", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/142", + "id": 803317406, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzMxNzQwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T13:16:30Z", + "updated_at": "2021-03-20T13:16:30Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 21 марта 2017, 16:09**\r\nИдея огонь!\r\n\r\nНадо набрать больше примеров где это может дать\r\n* хороший прирост производительности в библиотеке (std::vector>, std::deque, ещё больше примеров нужно!)\r\n* прирост производительности в ядре языка:\r\n ```cpp\r\nvoid foo(shared_ptr& out)\r\n auto s = make_shared(42);\r\n // ...\r\n out = s; // не вызывать деструктор а требовать memcpy\r\n}\r\n```\r\n\r\nЯ пока попробую найти предыдущие обсуждения подобных идей.\r\n\r\n**Andrey Davydov, 22 марта 2017, 0:45**\r\nyndx-antoshkka, из стандартных фукнций можно специализировать\r\n(*) std::swap\r\n(*) std::swap_ranges for contiguous ranges\r\nкак следствие можно выиграть в *sort*, inplace_merge, unique, rotate, remove*, partition, nth_element, make_heap, ...\r\nТо же работает, когда выполняется swap пустого и непустого optional'а и variant'ов с разными текущими значениями индексов.\r\nА насчет ядра языка я не понял, разве можно требовать от компилятора выполнения таких оптимизаций? Ведь тогда уже сейчас можно потребовать для функции foo из твоего примера выполнять move assignment а не copy assignment. Неужели по стандарту компилятор обязан это делать?\r\n\r\n**Andrey Davydov, 22 марта 2017, 1:29**\r\nyndx-antoshkka, можно в духе guaranteed copy elision потребовать оптимизацию для функции, возвращающей relocatable тип, если не выполнился copy elision. Это сработает, скажем, для такой функции.\r\n```cpp\r\nstd::vector bar(bool c)\r\n{\r\n std::vector xs = { 1, 2, 3}, ys = { 4, 5, 6 };\r\n if (c)\r\n return xs;\r\n else\r\n return ys;\r\n}\r\n```\r\n\r\n**yndx-antoshkka, 22 марта 2017, 13:08**\r\nКомпилятор делать такое пока не обязан.\r\n\r\nДобавление нового type trait - это proposalы которые касаются как групп занимающихся ядром языка, так и групп развивающих стандартную библиотеку. Нужно убедить сразу две группы, что такой type trait будет полезен. Поэтому и стоит поискать примеры как для стандартной библиотеки, так и для ядра языка.\r\n\r\nИтак, сможете перевести вашу идею на английский и описать её с кучей примеров на std-proposals@isocpp.org ? Если да - скиньте сюда ссылку на обсуждение.\r\n\r\n**Andrey Davydov, 27 марта 2017, 9:39**\r\nyndx-antoshkka, оказалось, что обсуждение такой идеи на std-proposals@isocpp.org уже было, правда в несколько неожиданном треде: https://groups.google.com/a/isocpp.org/d/msg/std-proposals/Y6gjtmVyzBo/NyWaMPamzXEJ\r\nКроме того, выяснилось, что помимо Folly под разными именами свойство is_relocatable можно определять в BDE (IsBitwiseMoveable), EASTL (has_trivial_relocate), Qt (Q_MOVABLE_TYPE).\r\n\r\n**yndx-antoshkka, 27 марта 2017, 16:12**\r\nAndrey Davydov, предлагаю еще раз написать в рассылку про std::is_relocatable, так как прошлое ообсуждение закончилось ничем.\r\n\r\nНу и начинать писать proposal :)\r\n\r\n**Andrey Davydov, 28 марта 2017, 10:36**\r\nyndx-antoshkka, я создал обсуждение: https://groups.google.com/a/isocpp.org/d/msg/std-proposals/4Wwpi4EUGlg/or77NGalBwAJ\r\nНадеюсь, что мой кривой английский не станет непреодолимым препятствием и мне напишут что-нибудь конструктивное.\r\n\r\n**yndx-antoshkka, 5 апреля 2017, 13:17**\r\nПереписка получилась очень конструктивной:\r\n* выяснили, что компиляторы могут делать такую оптимизацию автоматически\r\n* нашли и сразу поправили недочёт оптимизации в GCC (7 версия с флагом -std=c++17 будет лучше оптимизировать деструкторы)\r\n\r\nОтдельно от переписки:\r\n- Завёл тикет на добавление аналогичной оптимизации деструкторов в CLANG: https://bugs.llvm.org//show_bug.cgi?id=32522\r\n- Завёл тикеты на более агрессивные оптимизации смежных циклов, чтобы unitialized_move + destroy превращались в подобие memcpy для GCC https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80317 и для CLANG https://bugs.llvm.org//show_bug.cgi?id=32523\r\n\r\nЕсли тикеты примут и реализуют - предложенная в обсуждении оптимизация is_relocatable заработает на двух популярных компиляторах из коробки. Весь пользовательский код станет быстрее без каких-либо дополнительных телодвижений.\r\n\r\n**Antervis, 23 марта 2017, 7:09**\r\nА что станет с невалидным объектом после того, как из него будет сделан relocate? Деструктор вызывать, получается, нельзя, то есть relocate операция доступна либо только из временного объекта (причем у категории такого объекта требования строже rvalue); либо делать этот объект inaccessible, как-то так:\r\n```cpp\r\nint x = 5;\r\ny = std::relocate(x);\r\n++x; // error - x is not defined\r\n```\r\nНо для подобных случаев компилятор может заменить код на вызов деструктора и конструктора прямо в целевом объекте.\r\n\r\nВозможно, стоит начать с trivially_movable? Т.е. trait'a типа, для которого T a = std::move(b); может быть заменен на memcpy(&a,&b,sizeof(a)); new (&b) T(); где второй вызов может быть удален компилятором, если переменная b дальше не используется?\r\n\r\n**Andrey Davydov, 23 марта 2017, 20:14**\r\nAntervis, я не предлагаю функцию std::relocate, которая бы заставляла компилятор не вызывать у объектов с automatic storage duration деструктор. В тех примерах, что я приводил -- буффер vector'а, optional, variant декструктор вызывается вручную, т.е. алгоритм перемещения элементов vector'а следующий: если объект relocatable, то побитно копируем память объекта на новое место и не вызываем деструктор на старом, иначе вызываем move- или copy- конструктор на новом месте и затем деструктор на старом месте. Т.е. никакого нового механизма со стороны компилятора для релокации не нужно и не предлагается.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803317406/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803318050", + "html_url": "https://github.com/cpp-ru/ideas/issues/143#issuecomment-803318050", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/143", + "id": 803318050, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzMxODA1MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T13:21:09Z", + "updated_at": "2021-03-20T13:21:09Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 22 марта 2017, 12:21**\r\nНужен прототип. При том желательно, чтобы прототип приняли в Boost - данные методы много кому нужны и стоит собрать как можно больше отзывов из разных областей применения.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803318050/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803318513", + "html_url": "https://github.com/cpp-ru/ideas/issues/144#issuecomment-803318513", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/144", + "id": 803318513, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzMxODUxMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T13:24:46Z", + "updated_at": "2021-03-20T13:24:46Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 22 марта 2017, 13:19**\r\nНа сколько я понимаю, смысл директивы #pragma ровно в том, что она дается на откуп компиляторам и стандарт никак не может ее регулировать.\r\nТо что вы хотите проверять частично возможно уже сейчас:\r\n```cpp\r\nstatic_assert(std::is_invocable_v);\r\nstatic_assert(std::is_abstract_v);\r\n```\r\nПро линковку стандарт C++ не знает ничего, поэтому кажется что стандартизировать проверку ошибок линковки, к сожалению, невозможно.\r\n\r\n**Дмитрий, 22 марта 2017, 13:30**\r\nИдея отличная, при тестировании метафункций было бы огромное подспорье.\r\nТолько нужно получше продумать.\r\nМне бы хотелось иметь возможность проверять произвольное выражение, или даже блок кода:\r\nstatic_assert(compiles(expression));\r\n\r\n**yndx-antoshkka, 5 ноября 2019, 12:48**\r\nВ C++20 для этого всё есть:\r\n```cpp\r\ntemplate \r\nvoid test_impl() {\r\n assert(requires (SomeTypeOnlyForUnsignedTypes a) {\r\n a.size();\r\n });\r\n}\r\n```\r\nОно даже уже работает на некоторых компиляторах https://godbolt.org/z/2y7zao\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803318513/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803335590", + "html_url": "https://github.com/cpp-ru/ideas/issues/145#issuecomment-803335590", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/145", + "id": 803335590, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzMzNTU5MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T13:55:33Z", + "updated_at": "2021-03-20T13:55:33Z", + "author_association": "MEMBER", + "body": "**mezastel, 26 марта 2017, 11:34**\r\nПлюсую. Потокобезопасные контейнеры прекрасно показали себя в .NET, так почему же не в С++?\r\n\r\n**yndx-antoshkka, 27 марта 2017, 12:17**\r\nmezastel, в данном случае я только за :)\r\n\r\nДругое дело, что это на 10 порядков сложнее чем кажется. Длительное время уже идёт обсуждение потокобезопасной очереди, возможно что к C++20 примут: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0260r1.html\r\n\r\nДругим предложением РГ21 уже занимается https://stdcpp.ru/proposals/fbd2bd33-c003-4475-a251-7c41b7d1c998 вместе с человеком из Intel. Пока что пытаемся придти к интерфейсу, который всех удовлетворит.\r\n\r\nЕсли вы хотите другие потокобезопасные контейнеры - пишите прототип. Как будет прототип - могу помочь с proposal.\r\n\r\n**maksimus1210, 3 апреля 2017, 16:51**\r\nyndx-antoshkka, Можно ли получить простой пример прототипа, что бы на его основе создать желаемое? Я не гуру в С++, но пишу на нём уже давно, привык к библиотекам Qt и к их стилю, а стиль BOOST и STL для меня - ад! Но для общего блага постараюсь сделать прототип в стиле STL.\r\n\r\n**yndx-antoshkka, 3 апреля 2017, 17:35**\r\nmaksimus1210, а какой контейнер вы хотите? Можно делать в стиле Qt - главное показать что оно работает и функционально.\r\n\r\n**maksimus1210, 3 апреля 2017, 18:17**\r\nyndx-antoshkka, загрузил 3 контейнера на github, если нужно будет пояснения, то могу дописать комментарии.\r\nhttps://github.com/maksimus1210/containers\r\n\r\n**yndx-antoshkka, 3 апреля 2017, 18:43**\r\nmaksimus1210, на queue уже есть предложение, очень надуюсь что будет в C++20.\r\n\r\nring_buffer имеет недочёты в реализации:\r\n* clear() нельзя вызывать конкурентно с другими методами\r\n* size(), readCount() и writeCount() не имеют смысла в могопоточных контейнерах так как результатом невозможно воспользоваться - он становится неактуальным к моменту использования\r\n* underflow переменных m_bytesForWrite и m_bytesForRead при одновременном заходе нескольких потоков в read/write\r\n* отсутствие RAII - deadlock в случае исключений\r\n* у меня очень много замечаний по производительности, но сначала надо исправить вышестоящие пункты.\r\n\r\nP.S.: я предупреждал, что это сложнее чем кажется\r\n\r\n**maksimus1210, 3 апреля 2017, 19:07**\r\nyndx-antoshkka, Эти контейнеры писались к конкретному случаю из двух потоков, когда один поток наполняет, а другой забирает.\r\n\r\n**yndx-antoshkka, 3 апреля 2017, 19:11**\r\nmaksimus1210, как вы понимаете - пользователи стандартной библиотеки будут использовать этот контейнер на различных конфигурациях, с различным количеством потоков. Нужен прототип, который хорошо работает во всех случаях.\r\n\r\n**maksimus1210, 27 июля 2017, 20:35**\r\nyndx-antoshkka, Недавно решил вернуться в тему и вплотную заняться решением, я написал многопоточную минималистичную очередь QueueConcurrent используя только STL: https://github.com/maksimus1210/containers/blob/master/queueconcurrent.h\r\nМне понравился пример приведённый на этом сайте в новостях : https://stdcpp.ru/blog/poslednie-novosti-o-razvitii-c\r\nсобственно от него и оттолкнулся, хочется услышать экспертное мнение, что бы довести класс до юзабельного уровня, после чего приступить к реализации кольцевого буфера.\r\n\r\n**maksimus1210, 27 июля 2017, 21:00**\r\nПо ходу дела возник вопрос, если для того, чтобы добавить элемент в контейнер оператором переноса добавили метод emplace, то для того что бы извлечь его от туда также оператором переноса - нет ничего, во всяком случае в std::list и std::queue их нет, может эту тему также стоит отправить в предложения?\r\n\r\n**yndx-antoshkka, 7 августа 2017, 17:58**\r\nmaksimus1210, тяжёлую тему вы выбрали :)\r\n\r\nПосмотрите существующее предложение на concurrent queue open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0260r1.html Оно уже обсуждается длительное время и несколько более масштабно (умеет иногда lock free, value_pop(), предлагает обёртки над существующими очередями и т.д.). Попробуйте разобраться в предложенном подходе, и предложить здесь свои дополнения/исправления.\r\n\r\n**maksimus1210, 21 августа 2017, 15:13**\r\nyndx-antoshkka, Тема действительно тяжёлая, в моих проектах используется передача потоковых данных из одного потока в другой, на обработку, и обратно. Для реализации использую очередь и кольцевой буфер. Смотрел реализацию кольцевого буфера в boost - совсем не то, что мне нужно, поэтому приходится писать свои велосипеды. Спасибо за ссылку, буду изучать.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803335590/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803338346", + "html_url": "https://github.com/cpp-ru/ideas/issues/146#issuecomment-803338346", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/146", + "id": 803338346, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzMzODM0Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T13:57:11Z", + "updated_at": "2021-03-20T13:57:11Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 23 марта 2017, 8:10**\r\nУже принят Ranges TS (http://en.cppreference.com/w/cpp/experimental/ranges) и в нем среди прочего есть адаптор reversed.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803338346/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803371740", + "html_url": "https://github.com/cpp-ru/ideas/issues/147#issuecomment-803371740", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/147", + "id": 803371740, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzM3MTc0MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T15:06:17Z", + "updated_at": "2021-03-20T15:06:17Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 24 марта 2017, 12:27**\r\nНедавно появился вот такой трюк:\r\n```cpp\r\nenum class UserId: int {};\r\nenum class RoleId: int{};\r\n```\r\nДостаточно ли его для ваших нужд?\r\n\r\n**ru.night.beast, 24 марта 2017, 13:17**\r\nyndx-antoshkka, а если тип не интегральный? например UUID\r\n\r\n**ya.imdex, 25 марта 2017, 1:36**\r\nyndx-antoshkka, это что-то из разряда #define private public, конечно можно извращаться, но зачем? И, как заметил ru.night.beast, работать это будет для очень ограниченного числа типов.\r\n\r\n**smertigdon, 5 июня 2017, 18:22**\r\nyndx-antoshkka, по-моему, самым элегантным решением проблемы будет разрешение писать код:\r\n```cpp\r\nenum class UserId : AnyType {};\r\n```\r\n\r\n**develoit, 24 марта 2017, 14:50**\r\nзачем плодить лишние сущности из-за своей лени или глупости?\r\n```cpp\r\nstruct UserId { int value; };\r\nstruct RoleId { int value; };\r\n\r\noption findUserById(UserId id);\r\n\r\nfindUserById(RoleId{1}); // compile error\r\nfindUserById(0); // compile error\r\nfindUserById(UserId{42}); // Ok\r\n```\r\n\r\n**Andrey Davydov, 24 марта 2017, 19:24**\r\ndeveloit, это совсем не то же самое. Для Ваших структур UserId, RoleId не специализирован std::hash, не определены операторы сравнения и куча других полезных операций доступных для оборачиваемого типа.\r\n\r\n**ya.imdex, 25 марта 2017, 1:40**\r\ndeveloit, пример с int вышел не очень удачным. Если взять std::string, то получится, что каждый метод и оператор нужно продублировать. Поэтому и хочется чтобы весь этот бойлерплейт взял на себя компилятор.\r\n\r\n**ru.night.beast, 25 марта 2017, 10:37**\r\nya.imdex, неявное преобразование к базовому типу (как при наследовании) нужно ?\r\nесли нет, то как быть со всеми функциями, определенными вне класса?\r\n\r\n**ya.imdex, 25 марта 2017, 15:48**\r\nru.night.beast, неявное преобразование безусловно необходимо, но есть тонкий момент: оно не будет работать для вызовов с использованием ADL, т.к. новый тип может быть объявлен в другом пространстве имен. Эту проблему можно решить заставив компилятор также выполнять ADL для исходного типа (с использованием неявного преобразования) в случае неудачи для конкретного типа.\r\n\r\n**ru.night.beast, 25 марта 2017, 19:03**\r\nya.imdex, если для реализации использовать механизмы наследования, то адл будет работать.\r\n\r\n**ya.imdex, 25 марта 2017, 19:16**\r\nru.night.beast, наследование не будет работать для final типов.\r\n\r\n**ru.night.beast, 25 марта 2017, 19:22**\r\nya.imdex, это если пытаться своими силами делать. у компилятора же таких ограничений нет.\r\n\r\n**ya.imdex, 25 марта 2017, 19:32**\r\nru.night.beast, если говорить о деталях реализации, то компилятор может и не создавать новый тип, а просто использовать исходный.\r\n\r\n**Павел, 25 марта 2017, 18:48**\r\nЗачем нагромождать синтаксис языка, если можно просто включить такую тривиальную проверку в (локальные) Guidelines?\r\n\r\n**ya.imdex, 25 марта 2017, 19:16**\r\nПавел Корозевцев, какую именно проверку?\r\n\r\n**Павел, 25 марта 2017, 20:04**\r\nya.imdex, извиняюсь. Подумал чуть больше об этом и понял, что не такая уж и тривиальная получается. Но всё-таки теоретически можно попросить clang-tidy проверить, не пытаемся ли мы использовать переменную, объявленную как UserId, использовать в качестве RoleId. И тут речь не о приведении типа в общем вида, а именно о приведении между типами, лежащими под определениями typedef'ов.\r\nВообще, я бы хотел донести мысль о том, что некоторые предложения, обсуждаемые на этом сайте, вполне могут быть реализованы с использованием инструментов вроде clang-tidy. Вовсе не нужно придумывать proposal для каждой новой фичи. Особенно это касается вот таких compile-time \"проверок от дураков\". Компилятор не должен всё делать за нас.\r\n\r\n**Павел, 25 марта 2017, 20:06**\r\nА вот в Guidelines такое предложить было бы уместнее, имхо.\r\n\r\n**ya.imdex, 25 марта 2017, 20:28**\r\nПавел Корозевцев, для всяких статических анализаторов все равно нужно будет как-то указывать: строгий typedef или нет. К тому же статических анализаторов много, кто-то использует один, кто-то другой, и навязывать один конкретный - плохая идея.\r\n>Компилятор не должен всё делать за нас.\r\nЭто и есть основная задача компилятора - делать за разработчика грязную работу, а особенно компилятора языка со статической типизацией.\r\n\r\n>А вот в Guidelines такое предложить было бы уместнее, имхо.\r\nКак это спасет разработчика от ошибок? Также как и, например, рекомендация не разыменовывать нулевой указатель - никак.\r\n\r\n**ru.night.beast, 25 марта 2017, 23:12**\r\nПавел Корозевцев> Вовсе не нужно придумывать proposal для каждой новой фичи. Особенно это касается вот таких compile-time \"проверок от дураков\". Компилятор не должен всё делать за нас.\r\n\r\nвообще то проверка типов -- это как раз область ответственности компилятора а не кодинг стандартов. к тому же, это не просто compile-time проверка. должен быть создан свой тип, чтобы линкер мог отличить функции использующие UserId от RoleId.\r\n\r\n**mrgordonfreman, 26 марта 2017, 0:31**\r\nНе вижу смысла усложнять язык избыточными сущностями. Эта задача достаточно просто решается следующим образом\r\n\r\nОдин раз описываем класс-обертку со всеми необходимыми конструкторами и операторами сравнения, примерно так\r\n```cpp\r\ntemplate\r\nclass strong_type {\r\nT data_;\r\npublic:\r\n// ...\r\ntemplate\r\nexplicit strong_type(U&& u): data_(std::forward(u)) {}\r\n// ...\r\noperator T () const noexcept { return data_; }\r\n// ...\r\n};\r\n```\r\nИ дальше использовать таким образом\r\n```cpp\r\nusing UserId = strong_type;\r\nusing RoleId = strong_type;\r\n\r\nvoid foo(UserId id);\r\nvoid bar(RoleId id);\r\n\r\nfoo(10); // compilation error\r\nfoo(UserId{10});\r\nfoo(RoleId{10}); // compilation error\r\n```\r\n\r\n**ya.imdex, 26 марта 2017, 0:39**\r\nmrgordonfreman,\r\n```cpp\r\nusing Id = strong_type;\r\nId id(\"blah\");\r\nid.empty(); // ошибка, а хочется иметь весь набор методов\r\n```\r\n\r\n**mrgordonfreman, 26 марта 2017, 1:06**\r\nya.imdex,\r\nДобавим в класс более умные операторы приведения типов\r\n```cpp\r\noperator T const& () const noexcept { return data_; }\r\noperator T& () noexcept { return data_; }\r\n```\r\nИ тогда через приведение к ссылке на строку получаем все методы\r\n```cpp\r\nusing Id = strong_type;\r\nId id(\"blah\");\r\nstatic_cast(id).empty(); // now it's ok\r\n```\r\nНе обязательно же для каждого вызова метода выполнять приведение типов, достаточно в начале функции получить ссылку на значение и работать уже с ней. Основная задача - получение строго интерфейса - решена.\r\nЕсли нужно больше сахара, то можно перегрузить оператор ->\r\n```cpp\r\nT* operator -> () noexcept { return &data_; }\r\nT const* operator -> () const noexcept { return &data_; }\r\n\r\nId id(\"blah\");\r\nid->empty(); // now it's ok\r\n```\r\nА если нужно еще больше сахара, то есть пропозал на перегрузку dot operator\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4173.pdf\r\nВсе, что можно решить в бибилотеках, должно быть решено в бибилотеках.\r\n\r\n**ViTech, 13 апреля 2017, 17:41**\r\nmrgordonfreman, т.е. какие-то Tag'и ещё таскать нужно?\r\n\r\nЕсть подозрения, что определять все возможные конструкторы для всех возможных классов, оборачиваемых в strong_type, будет затруднительно, мягко говоря. Как будет выглядеть strong_type, который бы нормально тот же std::string обернул? Чтобы хотя бы такой код работал:\r\n```cpp\r\n#include \r\n#include \r\n\r\nusing namespace std;\r\n\r\n#if 0\r\nusing UserId = string;\r\nusing RoleId = string;\r\n#else\r\nusing UserId = strong_type< class UserIdTag, string >;\r\nusing RoleId = strong_type< class RoleIdTag, string >;\r\n#endif\r\n\r\nvoid printUserId( const UserId & id )\r\n{ cout << \"UserId = \" << id << endl; }\r\n\r\nvoid printRoleId( const RoleId & id )\r\n{ cout << \"RoleId = \" << id << endl; }\r\n\r\nint main (int, char * [])\r\n{\r\nUserId user_id = \"UserId\";\r\nRoleId role_id = \"RoleId\";\r\n\r\nprintUserId( user_id );\r\nprintRoleId( role_id );\r\n\r\nreturn 0;\r\n}\r\n```\r\nЕщё нужно учитывать, что одни классы имеют конструктор по умолчанию, а другие не имеют. В некоторых классах определённые конструкторы удалены. Кроме конструкторов надо ещё операторы присваивания писать, и.т.п.\r\n\r\n**ilnurkh, 5 апреля 2017, 13:15**\r\nМне кажется вы хотите operator. (оператор точка) который сейчас прорабатывается и к сожалению не вошёл в cpp17\r\n\r\n**ViTech, 13 апреля 2017, 18:06**\r\nЕсли новый тип обладает всеми свойствами исходного типа, то это больше всего похоже на наследование, чем на какую-то обёртку с композицией. Думаю, в этом направлении и надо решать задачу. На текущий момент реализовать можно как-то так:\r\n```cpp\r\nclass UserId : public string\r\n{\r\npublic:\r\nusing string::string;\r\nusing string::operator=;\r\n// using всё остальное;\r\n};\r\nclass RoleId : public string\r\n{\r\npublic:\r\nusing string::string;\r\nusing string::operator=;\r\n// using всё остальное;\r\n};\r\n```\r\nНо каждый раз такую простыню расписывать не интересно. Суть остаётся одна: указать родительский класс и по умолчанию использовать все его конструкторы, операторы и т.п, :\r\n```cpp\r\nclass UserId : public string {using all};\r\nclass RoleId : public string {using all};\r\n```\r\nКлючевые слова typedef и using используются для объявления псевдонимов. Так лучше и оставить, чтобы не вносить путаницу, где псевдоним, а где новый тип. Новые типы объявляются с помощью class/struct и им подобным. Тогда форма объявления может быть какой-нибудь такой:\r\n```cpp\r\nclass UserId : using string;\r\nclass RoleId : using string;\r\n```\r\nПри этом можно using классы с final, не вижу причин, по которым это стоило бы запретить.\r\n\r\n**ramzesxi, 27 декабря 2017, 14:15**\r\nПоддерживаю идею.\r\nВозможный синтаксис:\r\n```cpp\r\nexplicit using UserId = uint32_t;\r\n```\r\n\r\n**LevSch, 8 августа 2019, 17:24**\r\nПриведу пример из моей практики, где это может быть полезно:\r\n```cpp\r\ntypedef std::vector ByteBuffer;\r\n\r\nvoid sandbox()\r\n{\r\n ByteBuffer somaData;\r\n saveToDatabase(somaData);\r\n}\r\n```\r\nsaveToDatabase не может узнать как хранить в базе данных: в виде блоба либо в виде таблицы - по байту на строку.\r\n\r\nС этой штукой функция смогла бы.\r\n\r\n**Клеванец Игорь, 12 сентября 2019, 23:18**\r\nПолучилось отправить документ в комитет по стандартизации?\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803371740/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803372870", + "html_url": "https://github.com/cpp-ru/ideas/issues/148#issuecomment-803372870", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/148", + "id": 803372870, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzM3Mjg3MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T15:11:22Z", + "updated_at": "2021-03-20T15:11:22Z", + "author_association": "MEMBER", + "body": "**Дмитрий, 24 марта 2017, 19:56**\r\nДействительно, иногда очень хочется иметь возможность пробрасывания (он же perfect forwarding) для *this, чтобы не реализовывать по три метода для класса:\r\n```cpp\r\nmethod () &\r\nmethod () const &\r\nmethod () &&\r\n```\r\nНо в представленном виде мне предложение не нравится. Нужно как-то по-другому.\r\n\r\n**Andrey Davydov, 25 марта 2017, 15:27**\r\ndmitriy@izvolov.ru, у меня есть безумная идея расширить const так чтобы он мог применяться к expression'у аналогично noexcept, const без параметров эквивалентен const(true). Тогда, скажем, определение оператора [] у класса vector могло бы выглядеть так:\r\n```cpp\r\ntemplate\r\nstruct add_const_if;\r\n\r\ntemplate\r\nstruct add_const_if : std::add_const {};\r\n\r\ntemplate\r\nstruct add_const_if\r\n{\r\n using type = T;\r\n};\r\n\r\ntemplate\r\nclass vector\r\n{\r\n template\r\n typename add_const_if::type& operator[] (size_t) const(constness);\r\n};\r\n````\r\nЕстественно, шаблонный аргумент constness должен автоматически выводиться при вызове. Заметим, что необходимый механизм в компиляторе уже есть. Это хорошо видно если рассмотреть свободную функцию:\r\ntemplate\r\ntypename add_const_if>::type & at(Vec &, size_t);\r\n\r\nvoid foo(vector & xs, vector const & ys)\r\n{\r\nat(xs, 0); // Vec -> vector\r\nat(ys, 1); // Vec -> vector const\r\n};\r\nработает уже сейчас, а значит, и для такой функции\r\ntemplate\r\ntypename add_const_if::type & at(vector const(constness) &, size_t);\r\nвывод шаблонных аргументов возможен.\r\n\r\n**Дмитрий, 25 марта 2017, 15:37**\r\nAndrey Davydov,\r\nПо-прежнему сомнительно.\r\nВо-первых, не упомянут вариант с `&&`.\r\nВо-вторых, помимо `const` ещё есть `volatile`.\r\n\r\n**ilnurkh, 27 марта 2017, 9:30**\r\ndmitriy@izvolov.ru, ну можно сделать и volatile(bool)\r\n\r\n**Andrey Davydov, 27 марта 2017, 23:20**\r\ndmitriy@izvolov.ru,\r\n\r\n> Во-первых, не упомянут вариант с `&&`\r\n\r\nМожете привести пример, когда было бы полезно сделать функцию шаблонной по ref qualifier'у?\r\n\r\n> Во-вторых, помимо `const` ещё есть `volatile`\r\n\r\nАналогично, не могу придумать, когда может быть полезным метод шаблонный по volatile/non-volatile?\r\n\r\n**Олег Ляттэ, 28 марта 2017, 9:50**\r\nAndrey Davydov, vector::operator[] вроде бы неплохой пример и для &&, и для volatile.\r\n\r\nПример для &&:\r\n```cpp\r\nstd::vector f();\r\nauto s = f()[0]; // move-initialize s from element 0\r\n```\r\nПример для volatile:\r\n```cpp\r\nvoid f(long& s); // 1\r\nvoid f(volatile long& s); // 2\r\n\r\nvolatile std::vector vec;\r\nf(vec[0]); // calls 2\r\n```\r\n\r\n**Andrey Davydov, 28 марта 2017, 10:06**\r\nОлег Ляттэ, что касается &&, то для того чтобы f()[0] имело тип string &&, надо чтобы в теле `vector::operator[] (size_t i) &&` было явно написано std::move(i-й элемент). Как Вы предлагаете сделать это если operator[] будет шаблонным?\r\nПример же с volatile, на мой взгляд, совершенно некорректен -- то что сам объект вектора является volatile никак не связано с волатильностью его элементов.\r\n\r\n**Олег Ляттэ, 31 марта 2017, 10:03**\r\nAndrey Davydov, для возврата && можно использовать static_cast - эффект будет не хуже, чем от std::move. Нужно только вывести референс нужного вида.\r\n\r\nКвалификатор volatile имеет то же поведение, что и const. Отличается только их смысловое действие. Не даром они в стандарте часто упоминаются вместе (cv-qualifiers). Если const vector добавляет const к выдаваемым референсам на элементы, то по логике volatile vector должен делать то же самое, т.е. распространять действие своих квалификаторов на элементы.\r\n\r\n**smertigdon, 5 июня 2017, 18:17**\r\nAndrey Davydov, очень крутое предложение, сам недавно думал в точности о такой же реализации: операторы const(bool) и volatile(bool). Оформите в отдельное предложение, а то так и затеряется в комментариях.\r\n\r\n**Andrey Davydov, 8 июня 2017, 9:30**\r\nsmertigdon, я не просто так написал, что это идея безумная, и как ее доработать до proposal'а я пока не представляю.\r\nВо-первых, как было обсуждено выше, с формальной точки зрения квалификаторы const и volatile равноправны, но, по-моему, с точки зрения пользователя volatile(bool) бессмысленен. Видели ли Вы когда-нибудь функции перегруженные по volatile qualifier?\r\nВо-вторых, с выводом шаблонного bool параметра тоже будут проблемы. К примеру, для noexcept сейчас это не работает: https://godbolt.org/g/6XAwy9 Clang 4.0 не компилирует, GCC 7.1 падает с internal compiler error.\r\nВ третьих, такое изменение, как мне кажется, принесет не очень много практической пользы, но очень сильно усложнит язык. Лично я, как человек которому придется поддерживать это в IDE, не очень-то этого хочу.\r\nЕсли Вы напишите proposal я буду только за, но я не верю, что комитет по стандартизации примет подобное раньше 2045 года.\r\n\r\n**smertigdon, 19 июня 2017, 20:36**\r\nAndrey Davydov, перегрузка по volatile(bool) может не часто используется, однако для function trait'ов, например, приходится писать по 4 перегрузки. Добавится noexcept и станет 8.\r\nС выводом будут проблемы - почему? То, что сейчас компилятор падает, так это просто его недоработка, реальных проблем я не вижу. Хотя просто не думал об этом достаточно подробно, возможно есть подводные камни.\r\nПо поводу IDE - сейчас есть достаточно других проблем для них (всякие auto..., SFINAE, рекурсивные шаблоны, constexpr для intellisense), но сам я не разрабатывал IDE и не могу утверждать.\r\nЧтобы дорабатывать до proposal'а нужно услышать мнение хотя бы нескольких человек, а пока что это просто беседа в комментариях :)\r\nЯ вновь вернулся к этому комментарию, так как увидел очередное предложение на эту тему: stdcpp.ru/proposals/b02ce2fb-5e59-4f15-b21c-a2cb8e25aaa0\r\n\r\n**Andrey Davydov, 15 ноября 2017, 13:42**\r\nsmertigdon, нашел очень-очень похожий proposal: https://github.com/atomgalaxy/isocpp-template-this/blob/master/template-this.pdf\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803372870/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803373077", + "html_url": "https://github.com/cpp-ru/ideas/issues/148#issuecomment-803373077", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/148", + "id": 803373077, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzM3MzA3Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-20T15:12:50Z", + "updated_at": "2021-03-20T15:12:50Z", + "author_association": "MEMBER", + "body": "Есть очень похожее предложение https://wg21.link/p0847r6 , его рассматривают в комитете", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803373077/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803524569", + "html_url": "https://github.com/cpp-ru/ideas/issues/115#issuecomment-803524569", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/115", + "id": 803524569, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzUyNDU2OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-21T07:17:37Z", + "updated_at": "2021-03-21T07:17:37Z", + "author_association": "MEMBER", + "body": "Закрыто в пользу аналогичного предложения #147", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/803524569/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804271902", + "html_url": "https://github.com/cpp-ru/ideas/issues/149#issuecomment-804271902", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/149", + "id": 804271902, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDI3MTkwMg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-22T17:56:04Z", + "updated_at": "2021-03-22T17:56:04Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 6 августа 2019, 21:28**\r\nПредложение интересное, но... как лямбда должна сама догадаться, делать ей захват по ссылке или по копии?\r\n\r\n\r\n**Antervis 7 августа 2019, 15:10**\r\nЗахват по ссылке по умолчанию -> много потенциальных UB по невнимательности.\r\nЗахват по значению по умолчанию -> проседание производительности по умолчанию.\r\n\r\nИ то и другое плохо.\r\n\r\n\r\n**Alexander 4 сентября 2019, 23:41**\r\nЛучше explicit чем implicit в данном случае, имхо.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804271902/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804275458", + "html_url": "https://github.com/cpp-ru/ideas/issues/150#issuecomment-804275458", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/150", + "id": 804275458, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDI3NTQ1OA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-22T18:01:25Z", + "updated_at": "2021-03-22T18:01:25Z", + "author_association": "MEMBER", + "body": "**Владислав Петров 2 августа 2019, 18:49**\r\nсемантика switch не подразумевает ничего кроме jmp по, простите, lbl. Тогда уж new keyword типа typedswitch, match? \r\n\r\n\r\n**Walery 10 августа 2019, 16:00**\r\nНе хотелось бы видеть новые ключенвые слова. Пусть компилятор в зависимости от типов сам решает, что использовать в конкретном случае.\r\n\r\n\r\n**Виктор Губин 2 августа 2019, 20:42**\r\nСудя по всему введут новый оператор inspect.\r\n```cpp\r\ninspect (s) {\r\n \"foo\": std::cout << \"got foo\";\r\n \"bar\": std::cout << \"got bar\";\r\n _: std::cout << \"don't care\";\r\n}\r\n```\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1371r0.pdf\r\n\r\nИМХО новый оператор гораздо выглядит гораздо удобнее.\r\n\r\n**valera_ee 3 августа 2019, 9:43**\r\nПоявление новых ключевых слов усложняет язык, на мой взгляд лучше расширить функциональность текущего оператора, так в голове надо меньше держать.\r\n\r\nМне понравился оператор swith в языке Swift, очень функциональный, после него возвращаясь на С++ ипытываешь \"функциональное голодание\".\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804275458/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804280187", + "html_url": "https://github.com/cpp-ru/ideas/issues/151#issuecomment-804280187", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/151", + "id": 804280187, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDI4MDE4Nw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-22T18:07:34Z", + "updated_at": "2021-03-22T18:07:34Z", + "author_association": "MEMBER", + "body": "**al-mission-2016 24 июля 2019, 6:56**\r\nУ всех этих контейнеров уже есть count( const Key& ) -> size_t;\r\n: )\r\noperator[] всё-же предназначен для доступа или модификации.\r\n\r\n\r\n**Nate Reinar Windwood 24 июля 2019, 10:43**\r\nal-mission-2016, unordered_set, например, это по сути отображение T -> bool, так что это можно считать доступом к элементу. Тот факт, что элементы с value = false вообще не хранятся, а для true хранятся только ключи — деталь реализации, не имеющая отношения к семантике.\r\n\r\n\r\n**Sasha Sitnikov 24 июля 2019, 13:28**\r\nNate Reinar Windwood, если говорить в таких терминах, то это отображение T -> T, что очень важно, т.к. из равенства элементов с точки зрения set не следует их эквивалентность.\r\n\r\n\r\n**Nate Reinar Windwood 24 июля 2019, 19:27**\r\nSasha Sitnikov, конкретно unordered_map — это вообще хэш-таблица, эквивалентность тут ни при чем. В set нас, напротив, не интересует равенство, вместо него одинаковыми считаются эквивалентные элементы. Равенство и эквивалентность в одном контейнере не пересекаются, так что неважно, что откуда следует или нет.\r\n\r\n\r\n**Sasha Sitnikov 24 июля 2019, 19:37**\r\nNate Reinar Windwood, собственно, важно именно потому, что при поиске элемента в set может потребоваться не только узнать, присутствует ли он в контейнере, но и достать этот самый элемент, если он там есть.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804280187/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804294590", + "html_url": "https://github.com/cpp-ru/ideas/issues/152#issuecomment-804294590", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/152", + "id": 804294590, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDI5NDU5MA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-22T18:28:58Z", + "updated_at": "2021-03-22T18:29:15Z", + "author_association": "MEMBER", + "body": "**Sasha Sitnikov 27 мая 2019, 15:39**\r\nPattern matching уже предложили\r\n\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1371r0.pdf\r\n\r\n\r\n**Игорь Шаповал 27 мая 2019, 15:56**\r\nВ предложении хотят добавить паттерны через inspect. Предлагаю добавить отдельно к switch statement также switch expression.\r\n\r\n\r\n**Maxim Kapitonov 30 октября 2019, 11:19**\r\nа зачем : на -> менять?\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804294590/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804295986", + "html_url": "https://github.com/cpp-ru/ideas/issues/153#issuecomment-804295986", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/153", + "id": 804295986, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDI5NTk4Ng==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-22T18:31:01Z", + "updated_at": "2021-03-22T18:32:02Z", + "author_association": "MEMBER", + "body": "**al-mission-2016 25 июня 2019, 4:24**\r\nЛюбопытно, но ненужно. Есть же уже божественное: goto CONTINUE_FROM_HERE;\r\n\r\n\r\n**Юрий Николаев 25 июня 2019, 12:24**\r\n```cpp\r\nfor (int i = 0; i < 10; i++)\r\n{\r\n\tswitch (i)\r\n\t{\r\n\t\tcase 1:\r\n\t\t{\r\n\t\t\tfor (int j = 0; j < 10; j++)\r\n\t\t\t{\r\n\t\t\t\tswitch (j)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (some1)\r\n\t\t\t\t\t\t\tbreak 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// <- continue from here?\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n\t// <- or continue from here?\r\n}\r\n// <- or continue from here?\r\n```\r\nКуда же должны попасть в данной ситуации?\r\n\r\nНе, перегружать break идея плохая.\r\n\r\n\r\n**Игорь Савенков 25 июня 2019, 14:06**\r\nЮрий Николаев, я предполагаю, что такой синтаксис break 2 должен работать исключительно для циклов. Т.е. выход будет в самую последнюю точку \"continue from here\" игнорируя все switch.\r\n\r\nКак бы да, получается несколько запутанный код, но надо понимать, что человек пишущий подобную глубину вложения, комбинируя циклы и switch - сам себе злобный буратино.\r\n\r\nАльтернатива - новый оператор exitloop 2, например, хотя это overhead для такого частного случая\r\n\r\n\r\n**Igor Baidiuk 2 июля 2019, 13:34**\r\nКак по мне, если уж делать - то через метки на блоках и labeled break/continue. Получается GOTO без кучи проблем GOTO.\r\n\r\n\r\n**Григорий Скурко 12 июля 2019, 11:51**\r\nНапрашивается такую логику/пример выделить в функцию и делать return\r\n\r\nЕсли уровней много и нужно между ними скакать - тоже самое - с подобным break тяжело будет код понимать\r\n\r\n\r\n**NeoProgramming 19 июля 2019, 21:19**\r\nДля этого лучшее решение - именованные блоки. То есть любой блок (if, while, for, switch...) может иметь опциональное имя, которое пишется после круглых скобок и перед телом блока, и которое можно использовать в break.\r\n```cpp\r\nif(x>0) checkX {\r\n while(i != 100) MyLoop1 {\r\n switch(c) SelectAction {\r\n //... \r\n break checkX;\r\n //...\r\n }\r\n }\r\n}\r\n```\r\nНо я такое даже не предлагаю - слишком радикальное изменение в языке, никто на это не пойдет.\r\n\r\n\r\n**valera_ee 3 августа 2019, 11:08**\r\nПодобное сделано в языке Swift, но синтаксис у них для этого напоминает goto в c++\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804295986/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804298165", + "html_url": "https://github.com/cpp-ru/ideas/issues/154#issuecomment-804298165", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/154", + "id": 804298165, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDI5ODE2NQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-22T18:34:18Z", + "updated_at": "2021-03-22T18:34:18Z", + "author_association": "MEMBER", + "body": "**Andrey Derkach 29 июля 2019, 18:13**\r\nВ C# данная фича выглядит интереснее:\r\n\r\nfoo(x: 30, y: 20, z: 10)\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804298165/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804299075", + "html_url": "https://github.com/cpp-ru/ideas/issues/154#issuecomment-804299075", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/154", + "id": 804299075, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDI5OTA3NQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-22T18:35:42Z", + "updated_at": "2021-03-22T18:35:42Z", + "author_association": "MEMBER", + "body": "Дубликат https://github.com/cpp-ru/ideas/issues/10", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804299075/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804307444", + "html_url": "https://github.com/cpp-ru/ideas/issues/155#issuecomment-804307444", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/155", + "id": 804307444, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDMwNzQ0NA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-22T18:47:24Z", + "updated_at": "2021-03-22T18:47:24Z", + "author_association": "MEMBER", + "body": "**Andrey 30 мая 2019, 22:42**\r\nhttp://wg21.link/p1219\r\n\r\n\r\n**Antervis 31 мая 2019, 16:09**\r\nAndrey, предлагаемое мной решение более универсальное\r\n\r\n\r\n**Andrey 31 мая 2019, 22:04**\r\nAntervis, я с первой попытки не понял, что именно Вы предлагаете, думал, что Вы хотите, чтобы в функцию парамерты приходили уже фиксированного типа. Но тогда это выражается как\r\n```cpp\r\nvoid foo(ConvertibleTo auto...);\r\n```\r\nи соответственно \r\n```cpp\r\ntemplate\r\n requires((ConvertibleTo || Same) && ...)\r\nauto join(Args...);\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804307444/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804308742", + "html_url": "https://github.com/cpp-ru/ideas/issues/156#issuecomment-804308742", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/156", + "id": 804308742, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDMwODc0Mg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-22T18:49:29Z", + "updated_at": "2021-03-22T18:49:29Z", + "author_association": "MEMBER", + "body": "**Andrey 30 мая 2019, 23:00**\r\nНе повезло Вам с редактором, коли не показывает ошибку, мой вот показывает: https://ibb.co/5nhYPhX\r\n\r\nПо этой логике надо все функии emplace... тоже ограничить.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804308742/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804309851", + "html_url": "https://github.com/cpp-ru/ideas/issues/157#issuecomment-804309851", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/157", + "id": 804309851, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDMwOTg1MQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-22T18:51:23Z", + "updated_at": "2021-03-22T18:51:35Z", + "author_association": "MEMBER", + "body": "**Sasha Sitnikov 27 мая 2019, 15:44**\r\n```cpp\r\nint length(const std::string& s) = s.size();\r\n```\r\nВ таком виде не получится, ибо неоднозначность возникает с pure virtual methods:\r\n```cpp\r\nclass Class {\r\n virtual int foo() = 0;\r\n};\r\n```\r\n\r\n**Sasha Sitnikov 27 мая 2019, 15:51**\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0573r2.html\r\n\r\nЗдесь предлагается использовать =>\r\n```cpp\r\n[](auto&& a, auto&& b) { return a.id() < b.id(); } // C++14\r\n[](a, b) => a.id() < b.id() // this proposal\r\n```\r\n\r\n**Игорь Шаповал 27 мая 2019, 16:00**\r\nВ каком состоянии [p0573r2](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0573r2.html)? Есть ли какие-то сздвижения для включения в С++23?\r\n\r\n\r\n**Andrey 27 мая 2019, 23:04**\r\nИгорь Шаповал, https://www.reddit.com/r/cpp/comments/bcowjq/status_of_p0573/?utm_medium=android_app&utm_source=share\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804309851/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804311260", + "html_url": "https://github.com/cpp-ru/ideas/issues/158#issuecomment-804311260", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/158", + "id": 804311260, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDMxMTI2MA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-22T18:53:38Z", + "updated_at": "2021-03-22T18:53:38Z", + "author_association": "MEMBER", + "body": "**languagelawyer 5 июня 2019, 15:19**\r\nhttps://stdcpp.ru/search?type=proposal&text=tuple%20operator\r\n\r\n\r\n**Antervis 6 июня 2019, 11:11**\r\nдля этого нужна семантика compile-time аргументов для runtime функций. \r\n\r\n\r\n**riad 7 июня 2019, 22:23**\r\nAntervis, для предлагаемого решения не нужна -- идея в том, чтобы закодировать число в тип, который уже известен на этапе компиляции\r\n\r\n\r\n**Antervis1 0 июня 2019, 12:00**\r\nriad, тогда даже не получится написать что-то вроде t[cond ? 0 : 1];\r\n\r\n\r\n**Антон 17 июня 2019, 18:53**\r\nКак вариант для обсуждения -- добавление мембера\r\n```cpp\r\ntuple<...>::get()\r\n```\r\nили\r\n```cpp\r\ntuple<...>::at()\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804311260/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804985870", + "html_url": "https://github.com/cpp-ru/ideas/issues/159#issuecomment-804985870", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/159", + "id": 804985870, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDk4NTg3MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T15:13:46Z", + "updated_at": "2021-03-23T15:17:45Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 27 марта 2017, 12:23**\r\nПросто запретить - не получится, люди уже пользуются тем что std::basic_string можно преобразовать к std::string_view.\r\n\r\nНужно найти другой способ, обезопасить себя и пользователей от подобных ошибок.\r\n\r\n\r\n**h4tred, 27 марта 2017, 15:03**\r\nyndx-antoshkka, у меня год назад как-то так выродилось: https://htrd.su/wiki/zhurnal/2016/04/29/std_string_view_i_vremennye_obekty, может кто подскажет - какие подводные камни?\r\n\r\n\r\n**Andrey Davydov, 27 марта 2017, 15:32**\r\nh4tred, подводный камень в том, что Ваш способ запрещает вызов get_schema(get_url()), но проблема-то не в нем а в сохранении его результата в переменную. При этом такая конструкция if (get_schema(get_url()) == \"http\") ... совершенно корректна и часто используется на практике. Ровно это обсуждалось по ссылкам из моего комментария ниже.\r\n\r\n\r\n**h4tred, 27 марта 2017, 15:56**\r\nAndrey Davydov, спасибо!\r\n\r\n\r\n**Andrey Davydov, 27 марта 2017, 14:47**\r\nЯ поднимал аналогичный вопрос касательно boost::string_ref в списке рассылки boost: http://boost.2283326.n4.nabble.com/utility-string-ref-construction-from-rvalue-reference-to-string-td4665864.html, и как мне совершенно справедливо указали это сломает важнейший use-case когда string конвертируется в string_view для передачи аргумента в функцию.\r\nКак ни странно мэнтейнер boost::string_ref Marshall Clow решил-таки запретить конструирование string_ref от string &&, что привело к поломке кучи кода: http://boost.2283326.n4.nabble.com/Constructing-string-ref-from-rvalue-string-td4692417.html\r\nВидимо, в C++ не хватает чисто языковых средств, чтобы отличить совершенно корректный случай конструирования string_view при вычислении аргумента функции от всего остального. Остается надеется на внешние tool'ы, скажем, clang-tidy уже умеет отлавливать такого рода ошибки (http://clang.llvm.org/extra/clang-tidy/checks/misc-dangling-handle.html), и, возможно, вскоре научатся некоторые IDE.\r\n\r\n\r\n**yndx-antoshkka, 21 июля 2020, 14:17**\r\nAndrey Davydov, хотелось бы конечно иметь нужные языковые средства, дабы можно было обходиться без сторонних инструментов. Но как их добавить в C++ - не представляю", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804985870/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804990485", + "html_url": "https://github.com/cpp-ru/ideas/issues/160#issuecomment-804990485", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/160", + "id": 804990485, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDk5MDQ4NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T15:19:14Z", + "updated_at": "2021-03-23T15:19:14Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 27 марта 2017, 15:21**\r\nЯ не понял, что именно вы предлагаете. Опишите решение, как вы его видите.\r\n\r\n\r\n**h4tred, 27 марта 2017, 15:48**\r\nyndx-antoshkka, это: http://cpp.sh/7lfyt, но так поступать, насколько я знаю/понимаю, не корректно. Хотя и работает на шланге/gcc/msvc/icc.\r\n\r\n\r\n**yndx-antoshkka, 27 марта 2017, 16:05**\r\nh4tred, замените uint8_t на std::byte, а memory_alias(buf) на reinterpret_cast(buf)\r\n\r\nНикаких проблем с алиасингом std::byte* и Foo* не возникнет, по Стандарту С++ компилятор должен полагать что std::byte* (как и unsigned char*, как и char*) могут алиаситься со всеми типами данных.\r\n\r\n\r\n**h4tred, 28 марта 2017, 9:06**\r\nyndx-antoshkka, стоп, в char* да - могут, но обратно же нет: http://stackoverflow.com/questions/23848188/strict-aliasing-rule-and-char-pointers\r\n\r\n\r\n**yndx-antoshkka, 28 марта 2017, 16:07**\r\nВы правы, и правда не может. Судя по networking TS и стандарту ожидается что вы будете поступать наоборот. Будете создавать объект нужного вам типа, и в него читать байты http://cpp.sh/53hin\r\n\r\nЭто может быть неудобно в ряде случаев. Можно попробовать разрешить кастовать в обратную сторону. Но у меня нет информации о том, как это повлияет на производительность кода.\r\n\r\nХотите попробовать написать подобное предложение, чтобы разрешить делать reinterpret_cast(buf) на уровне языка?\r\n\r\n\r\n**h4tred, 30 марта 2017, 6:21**\r\nyndx-antoshkka,\r\n\r\n> Судя по networking TS\r\n\r\nпри этом в самих Беркли-сокетах такое широко используется, когда структура, sockaddr может быть sockaddr_in/sockaddr_in6/in_addr/in6_addr. Тут приходится ещё и кастить даже не между Foo и char*, но и между Foo/Bar. Причём (где-то видел, но не могу найти подтверждения сейчас) для такого случая есть лазейка: типа если первые поля несовместимых структур совпадают, то обращаться к ним можно\r\n\r\n> Хотите попробовать написать подобное предложение, чтобы разрешить делать reinterpret_cast(buf) на уровне языка?\r\n\r\nТут бы решить что лучше. Вариант с Union работает на всех компиляторах. Возможно просто его узаконить (type-punning), но мне бы пришлась по душе отдельная команда, вроде той, что я предложил: да бы было явно видно намерения программиста и он осознаёт последствия своего выбора (в том числе о возможных накладных расходах в случае отсутствия выравнивания). Есть ещё в GCC атрибут __may_alias__, который вроде бы частично призван решать проблему (но, судя по всему, работает только для C-компилятора). Плюс поголовно предлагают использовать memcpy, типа оно хорошо оптимизируется. Но проблема в том, что при оптимизации по тактам/командам, у нас возникают две копии данных. Когда у тебя 128кб памяти всего - каждый байт ценен, часто даже в ущерб быстродействию.\r\n\r\nОставлю тут парочку ссылок:\r\n* http://blog.regehr.org/archives/959\r\n* http://blog.regehr.org/archives/1307\r\n\r\nПредложение написать можно. Но я в формальном языке не силён (да и вообще не айс :)). Если есть какие-то \"рыбы\", набор правил и рекомендаций, было бы неплохо их получить. В любом случае - попытка не пытка.\r\n\r\n\r\n**mrgordonfreman, 28 марта 2017, 12:52**\r\nТут имеется в виду проблема, когда sizeof(Foo) > sizeof(id) + sizeof(a) + sizeof(b) и при кастовании указателя на данные к Foo можем не в те байты писать?\r\n\r\n\r\n**h4tred, 28 марта 2017, 14:23**\r\nmrgordonfreman, может. потому и явная операция приведения, сродни reiterpret_cast: в противовес old C-cast - искать проще по коду и для разбираться - почему так . Плюс есть всякие #pragma pack/__attribute__((packed)), которые убирают падинги в структурах. Во всякой эмбедщины, когда мало ресурсов, так удобно делать.\r\n\r\n\r\n**mrgordonfreman, 28 марта 2017, 15:49**\r\nh4tred, а как должна работать эта операция, если на структуру явно задано ненулевое выравнивание?\r\n\r\n\r\n**h4tred, 30 марта 2017, 6:32**\r\nmrgordonfreman, не единичное, вы хотели сказать :) потому я за явную операцию, что бы было ясно видно намерения разработчика. Но обычная ситуация такая: адрес буффера выровнен по границе, которая больше и/или кратна структурам (у меня это 16 байт /требования железа/, тогда как для структур используется 4). Структура пакованная, что вносит дополнительный оверхед при доступе к полям, но я готов на эту плату. По косвенным данным я понимаю какие данные в буффере и привожу к нужному типу. По выравниванию (стартового адреса структуры) тут нарушений нет.\r\n\r\nА вот когда могут идти одна за другой много структур - такое случалось у меня значительно реже и обычно сводилось к форме C-наследования, когда нужная струтура содержит в начале общую подструктуру (подобно структуре, описывающей адрес в беркли-сокет - см выше ответы) - тут тоже нарушения нет: сначала кастуем к Base, проверяем нужные поля и потом приводим к нужной структуре, например Bar, которая содержит первым полем - Base. Или массив: тут уже компилятор видит, что тип данных пакованный и плотно располагает его в памяти, соответственно, есть неоптимальность при доступе.\r\n\r\nЕщё временами такой трансфер осуществляется внутри какого-то железа, где точно известны параметры выравнивания и просто не делается паковка на струтуры и преобразование в буффер и обратно происходит вообще без каких-то последствий в плане производительности.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804990485/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804992667", + "html_url": "https://github.com/cpp-ru/ideas/issues/161#issuecomment-804992667", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/161", + "id": 804992667, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDk5MjY2Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T15:21:43Z", + "updated_at": "2021-03-23T15:23:10Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 27 марта 2017, 23:44**\r\nРовно того, что Вы хотите, можно достичь следующим способом:\r\n```cpp\r\n#include \r\n#include \r\n#include \r\n\r\nusing TestType = std::variant;\r\n\r\ntemplate\r\nauto overload(Functors &&... functors)\r\n{\r\n struct Result : Functors...\r\n {\r\n Result(Functors &&... functors)\r\n : Functors(std::forward(functors))...\r\n {};\r\n using Functors::operator()...;\r\n };\r\n return Result(std::forward(functors)...);\r\n};\r\n\r\nint main()\r\n{\r\n TestType v1{1};\r\n TestType v2{0.123};\r\n TestType v3{\"Hello World!\"};\r\n\r\n auto visitor = overload(\r\n [] (auto && val) {std::cout << val << std::endl;},\r\n [] (const std::string& val) {std::cout << \"String: \" << val << std::endl;}\r\n );\r\n\r\n std::visit(visitor, v1);\r\n std::visit(visitor, v2);\r\n std::visit(visitor, v3);\r\n}\r\n```\r\nProposal на overload уже существует (https://github.com/viboes/tags/blob/master/doc/proposals/overload/P0051R2.md). В какой еще ситуации может быть полезен локальный шаблонный класс?\r\n\r\n**Сергей Садовников, 28 марта 2017, 11:25**\r\nAndrey Davydov, ИМХО, это больше похоже на костыль для обхода как раз описанного мною ограничения в языке - когда полиморфное поведение локального класса поиметь хочется, а нельзя. При некотором удобстве (обработчики можно задавать лямбдами) я тут вижу и ряд недостатков:,\r\n\r\n1. Лямбды не шарят между собой общий стейт, если только не описать этот стейт в скоупе функции. Но тогда инстанс такого overload'а может работать _исключительно_ в скоупе функции. В std::function его не запихнешь, в потоке не отстрелишь. То есть сделать стейтфул-функтор, не привязанный к контексту вызова, таким образом нельзя.**\r\n\r\n2. У каждой лямбды своя собственная копия списка захвата. В каких то случаях на это можно забить, а в других - выльется в перерасход памяти., 3. Нет явно заданного типа параметра шаблонного вызова. Для игр с if constexpr/enable_if (буде такие понадобятся) придётся прибегать к decltype + decay_t.**\r\n\r\n4. Возможно могут быть проблемы с поиском нужной перегрузки среди нескольких. Я с этим сталкивался при таком вот способе разворачивания иерархии. Но это надо проверить.\r\n\r\nА применение таких классов (из очевидных) - привязанные к контексту вызова visitor'ы с доступом в приватную часть класса, в методе которого локальный класс-визитор определяется. Чтобы достичь такого же поведения от класса-визитора, определённого вне скоупа метода, надо заводить дружеские отношения, а значит - \"светить\" такие визиторы в определении класса, что не всегда приемлемо. По сути - полиморфные лямбды, вид в профиль, просто явно определяемые разработчиком.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/804992667/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805024139", + "html_url": "https://github.com/cpp-ru/ideas/issues/162#issuecomment-805024139", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/162", + "id": 805024139, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTAyNDEzOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:00:47Z", + "updated_at": "2021-03-23T16:00:47Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 28 марта 2017, 18:39**\r\nПункт а) характерен не только для ranges а для итераторов в целом. Уже сейчас можно задать итератору свой reference тип, и итератор начнёт себя вести как прокси:\r\n```cpp\r\nstruct write_trough_iterator {\r\n using value_type = int;\r\n using reference = std::reference_wrapper;\r\n ...\r\n};\r\n```\r\nБолее того, в стандарте есть не очень красивый кусок, где уже так происходит:\r\n```cpp\r\n#include \r\n#include \r\n#include \r\n\r\nint main() {\r\n std::vector v = {true, true};\r\n std::copy(v.cbegin(), v.cend(), std::ostream_iterator(std::cout));\r\n for (auto val: v) val = false; // Surprise\r\n std::copy(v.cbegin(), v.cend(), std::ostream_iterator(std::cout));\r\n}\r\n```\r\nК счастью, насколько мне известно, текущее предложение по ranges не добавляет новых proxy итераторов http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4651.pdf\r\n\r\n\r\n**d-yaroshev, 28 марта 2017, 22:03**\r\nyndx-antoshkka,\r\n\r\nВсе правда.\r\n\r\nНасколько я понимаю, vector не удовлетворяет Container, значит что сейчас алгоритмы не обязаны с ним работать. Ну, мб алгоритмы из стандартной библиотеки. У своих алгоритмов я точно пишу requires ForwardIterator и рассчитываю на то ссылки настоящие.\r\n\r\nТем не менее - предложения Eric Niebler про прокси итераторы и common_reference уже есть\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0022r0.html\r\n\r\n\r\n**yndx-antoshkka, 29 марта 2017, 13:33**\r\nПункт б) актуален только для прокси итераторов/рейнжей (в остальных случаях auto& и const auto& выглядят более вменяемо). И да, лично я бы такую магию вне Хогвартса особо не использовал.\r\n\r\n\r\n**d-yaroshev, 18 июня 2017, 4:06**\r\nyndx-antoshkka, прокси итераторы, видимо, идут в нашу жизнь. Хотелось бы чтобы с ними было легко работать.\r\n\r\n\r\n**yndx-antoshkka, 29 марта 2017, 13:36**\r\nЗа structure binding в пункте в) прослежу (в Стандарте С++ должно работать).\r\n\r\nМожете скинуть сообщения компилятора, которые возникают в пункте в) с предикатом? Похоже на баг в ranges.\r\n\r\n\r\n**d-yaroshev, 18 июня 2017, 4:04**\r\nyndx-antoshkka, извиняюсь что долго не отвечал.\r\n\r\nЯ жаловался на это Эрику, он сказал что ничего не сделаешь: https://github.com/ericniebler/range-v3/issues/545", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805024139/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805044768", + "html_url": "https://github.com/cpp-ru/ideas/issues/163#issuecomment-805044768", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/163", + "id": 805044768, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA0NDc2OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:27:06Z", + "updated_at": "2021-03-23T16:27:06Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 29 марта 2017, 13:28**\r\nЗдесь позарез нужна имплементация в одном из компиляторов, прежде чем начинать обсуждать подобное. Иначе - никак.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805044768/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805045913", + "html_url": "https://github.com/cpp-ru/ideas/issues/164#issuecomment-805045913", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/164", + "id": 805045913, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA0NTkxMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:28:40Z", + "updated_at": "2021-03-23T16:28:40Z", + "author_association": "MEMBER", + "body": "**ru.night.beast, 29 марта 2017, 14:00**\r\nеще хотелось бы иметь централизованное хранилище пакетов, по типу cpan, ctan etc.\r\nтогда бы часть стандартной библиотеки можно было бы переместить туда.\r\n\r\n\r\n**mrgordonfreman, 29 марта 2017, 16:53**\r\nru.night.beast,\r\nТакие централизованные хранилища уже есть - репозитории дистрибутивов линукс. А вот чтоб один для всех... И что он будет выдавать? Если исходники, которые будут вытягиваться по описанию зависимостей и собираться локально, то еще как-то можно жить\r\n\r\n\r\n**Сергей Садовников, 29 марта 2017, 17:04**\r\nru.night.beast, в экосистеме С++ слишком большой зоопарк компиляторов, тулчейнов, целевых платформ, способов сборки и т. п., чтобы такой репозиторий мог бы быть эффективно реализован на уровне бинарных пакетов.\r\n\r\n\r\n**ru.night.beast, 29 марта 2017, 17:13**\r\nСергей Садовников, в виде исходников. в зависимостях прописывать для какой системы собирается.\r\nнаверно возможно добавление и бинарных данных если, опять же, в зависимостях прописать.\r\n\r\n\r\n**Александр Шишенко, 9 августа 2017, 18:24**\r\nСергей Садовников, всё-таки сделали conan-center.\r\n\r\n\r\n**Евгений, 29 марта 2017, 15:41**\r\nидея шикарная, но требует детальной проработки, чтобы реализация стала полезной. сейчас проскочила бредовая мысль, что часть этой работы можно было бы поручить препроцессору.\r\n\r\n\r\n**mrgordonfreman, 29 марта 2017, 16:46**\r\nЧто-то из разряда фантастики. Сначала модули бы получить, без них нет смысла думать о зависимостях.\r\n\r\n\r\n**Pavel, 9 апреля 2017, 23:01**\r\nА Гор Нишанов на яндекс.разработке(ютуб) не про это говорил? У них какой-то \"vc package\" появился (вместо Nuget'a типа).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805045913/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805050184", + "html_url": "https://github.com/cpp-ru/ideas/issues/165#issuecomment-805050184", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/165", + "id": 805050184, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA1MDE4NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:34:37Z", + "updated_at": "2021-03-23T16:34:37Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 30 марта 2017, 11:53**\r\nto_chars из С++17 подходит под ваши нужды? Или вы хотите форматирование именно зависящее от локали?\r\n\r\n\r\n**Тимофей Чернов, 30 марта 2017, 12:05**\r\nyndx-antoshkka,\r\nПочти подходит, но у него:\r\n1) неудобный тип возвращаемого значения - хочется сразу в std::string\r\n2) неудобный тип входного значения - только число и формат\r\n3) таки нельзя проставить лидирующие нули :)\r\n\r\n\r\n**yndx-antoshkka, 30 марта 2017, 12:59**\r\nТимофей Чернов,\r\n\r\nСложно придумать решение, которое бы всем понравилось. Стоит начать с прототипа.\r\n\r\n\r\n**Yaroslav, 30 марта 2017, 18:47**\r\nЕсли что-то типо boost::format , вполне может подойти\r\n\r\n\r\n**yndx-antoshkka, 30 марта 2017, 18:55**\r\nМеня не устроит. Меня не устроит любая конвертация/форматирование, которое использует std::locale.\r\n\r\n\r\n**h4tred, 31 марта 2017, 2:49**\r\nyndx-antoshkka, а как быть когда форматировать согласно локали таки нужно? Например: десятичная точка или запятая?\r\n\r\n\r\n**yndx-antoshkka, 31 марта 2017, 12:11**\r\nh4tred, тогда придумайте такое, где можно форматировать и с локалью и без неё :)\r\n\r\n\r\n**h4tred, 5 апреля 2017, 3:54**\r\nyndx-antoshkka, ну \"без неё\" можно подразумевать локаль C :-) это если локаль в форматер передаётся, а не используется текущая... давно не пользовался boost::format, не помню его интерфейса.\r\n\r\n\r\n**h4tred, 5 апреля 2017, 3:55**\r\nyndx-antoshkka, а вообще согласен, пару раз отгребал от полученных CSV файлов, в не POSIX локали.\r\n\r\n\r\n**yndx-antoshkka, 14 июля 2017, 12:05**\r\nВот эта библиотека предложена для включение в С++ http://fmtlib.net/latest/index.html\r\n\r\nВот proposal: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0645r0.html\r\n\r\nПредложение очень хорошо встретили в комитете, есть шансы что будет в C++20", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805050184/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805051416", + "html_url": "https://github.com/cpp-ru/ideas/issues/165#issuecomment-805051416", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/165", + "id": 805051416, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA1MTQxNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:36:13Z", + "updated_at": "2021-03-23T16:36:13Z", + "author_association": "MEMBER", + "body": "Принято в C++20 http://eel.is/c++draft/format\r\nДубликат #13", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805051416/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805052574", + "html_url": "https://github.com/cpp-ru/ideas/issues/166#issuecomment-805052574", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/166", + "id": 805052574, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA1MjU3NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:37:48Z", + "updated_at": "2021-03-23T16:37:48Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 30 марта 2017, 11:51**\r\nА как вы видите это в стандарте? Новый контейнер? Какая алгоритмическая сложность должна быть у order_of_key?\r\n\r\n\r\n**Тимофей Чернов, 30 марта 2017, 11:58**\r\nyndx-antoshkka,\r\nНовый контейнер - в худшем случае, в лучшем - дополнение к текущим, но что делать с дополнительным расходом памяти на еще одно число (размер поддерева) в каждой вершине - не уверен.\r\nСложность у обеих операций должна быть логарифмическая, делаются они так:\r\norder_of_key: ищем ключ, смотрим на размер левого поддерева\r\nfind_by_order: смотрим на размер поддерева корня, спускаемся в соответствующее поддерево в зависимости от оставшегося размера\r\n\r\n\r\n**yndx-antoshkka, 30 марта 2017, 12:57**\r\nБоюсь что старый контейнер поменять нет возможности, это поломает бинарную совместимость в stdlibc++\r\n\r\nСоздать новый контейнер - это очень тяжёлая работа и должны быть серьёзные аргументы в целесообразности такого действия. Если готовы идти до конца, то для начала обсудите идею на std-proposals форуме (он есть в полезных ссылках на этом сайте).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805052574/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805056739", + "html_url": "https://github.com/cpp-ru/ideas/issues/167#issuecomment-805056739", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/167", + "id": 805056739, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA1NjczOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:43:32Z", + "updated_at": "2021-03-23T16:43:32Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 30 марта 2017, 11:49**\r\nТак ведь уже с C++14 есть. Просто используйте обычные компараторы с <> :\r\n```cpp\r\nstd::map> super_fast;\r\n```\r\n\r\n**mrgordonfreman, 30 марта 2017, 12:01**\r\nyndx-antoshkka,\r\nДействительно, оно делает тоже самое и определяет is_transparent. Тогда вторая часть вопроса - имеет смысл сдедать такое поведение по умолчанию для строк?\r\n\r\n\r\n**mrgordonfreman, 30 марта 2017, 12:05**\r\nyndx-antoshkka,\r\n```cpp\r\ntemplate<\r\n class Key,\r\n class T,\r\n class Compare = std::less,\r\n class Allocator = std::allocator >\r\n > class map;\r\n```\r\nвместо\r\n```cpp\r\n Compare = std::less\r\n```\r\nсделать что-то типа такого\r\nCompare = typename std::default_less::type\r\n\r\n при включении будет добавлять свою специадизацию\r\n\r\n\r\n**mrgordonfreman, 30 марта 2017, 12:20**\r\nyndx-antoshkka,\r\nИ еще связанный с этим вопрос - почему в unordered-контейнерах нет возможности выполнять поиск без создания инстанса ключа?\r\nhttp://llvm.org/svn/llvm-project/libcxx/trunk/include/unordered_map\r\nТут вижу только такие варианты\r\n```cpp\r\niterator find(const key_type& k);\r\nconst_iterator find(const key_type& k) const;\r\n```\r\n\r\n\r\n**yndx-antoshkka, 30 марта 2017, 12:53**\r\nМне бы хотелось иметь это поведение по умолчанию, но я не уверен в обратной совместимости. Unordered контейнеры надо допатчить, в них этого и правда не хватает.\r\n\r\nЕсли готовы взяться за написание предложения - говорите, дам ссылки на похожие предложения и помогу советом.\r\n\r\n\r\n**mrgordonfreman, 30 марта 2017, 13:12**\r\nyndx-antoshkka,\r\nВсегда готов!) Если не затруднит, то ссылки наверно будет лучше скинуть прямо на почту, чтобы тут в офтопик не уходить.\r\n\r\n\r\n**yndx-antoshkka, 30 марта 2017, 14:09**\r\nmrgordonfreman, я не знаю вашей почты :)\r\n\r\nЯ посмотрел логи обсуждений. Если делать std::less по умолчанию гетерогенным, то поломается пользовательский код: some_map.find({100, 'A'});\r\n\r\nФишка с std::default_less была рассмотрена и не прокатила, так как какую-то совместимость ломала http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0181r0.html\r\n\r\nОстаётся только продумать тему, с unordered контейнерами и гетерогенными хешированиями. На эту тему уже писали пропозал, который решили рассматривать после C++14 и с тех пор всё заглохло http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3573.html Стоит попробовать написать человеку, и спросить как дела с этим предложением.\r\n\r\n\r\n**mrgordonfreman, 30 марта 2017, 14:33**\r\nyndx-antoshkka, я всегда думал, что имя здесь соответствует почте на yandex.ru)\r\nВыходит, что я заново изобрел колесо, все уже предлагали. Тогда про unordered контейнеры попробую разузнать. Спасибо за помощь!\r\nЭти вопросы хотел еще на последней встрече РГ21 поднять в кулуарах, но как-то перескочили на проблемы mingw)\r\n\r\n\r\n**mrgordonfreman, 6 апреля 2017, 11:42**\r\nyndx-antoshkka, по документу http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3573.html\r\nАвтор на связь не выходит)\r\n\r\nМне этот пропозал не нравится\r\n1) в гетерогенном хэше предлагают использовать std::decay - это плохо, потому что для массивов произойдет array-to-pointer conversion и хэш будет вычисляться от T*\r\n2) гетерогенность для lookup-функций создается добавлением хэша и компаратора в параметры шаблона самих функций - это плохо, как мы уже выяснили гетерогенность по умолчанию ломает совместимость и не честно по отношению к самому контейнеру с заранее определенным хэшем и компаратором\r\n\r\nЯ набросал вариант решения на примере unordered_set в libc++, вот тут патч можно посмотреть\r\nhttps://github.com/compmaniak/libcxx/pull/1/files\r\nПрогнал тесты, ничего не ломает, гетерогенность работает\r\n\r\nОтличия от имеющегося пропозала\r\n1) в гетерогенном хэше вместо std::decay будет более безопасное std::remove_cv>\r\n2) если для контейнера хэш задан как std::hash<>, то по умолчанию компаратор тоже станет гетерогенным std::equal_to<>, и по аналогии с map/set через sfinae будут \"включаться\" гетерогенные lookup-функции\r\n\r\n\r\n**yndx-antoshkka, 6 апреля 2017, 17:02**\r\nmrgordonfreman, выглядит неплохо!\r\n\r\nДобавьте несколько тестов на unordered_set и string_view. Например:\r\n```cpp\r\nstd::unordered_set> m = {\r\n \"Lorem\", \"ipsum\", \"dolor\", \"sit\", \"amet\", \"consectetur\", \"adipiscing\", \"elit\"\r\n};\r\nstd::string_view str_v = \"amet\";\r\nassert(m.count(str_v) == 1);\r\n```\r\n\r\n\r\n**mrgordonfreman, 7 апреля 2017, 0:47**\r\nyndx-antoshkka, готово, все ок\r\nhttps://github.com/compmaniak/libcxx/pull/1/commits/389ba51ba5b376d26ff51c67cff6ec2fadce91f5\r\nУспеем оформить proposal до встречи в Торонто?)\r\n\r\n\r\n**yndx-antoshkka, 7 апреля 2017, 12:59**\r\nmrgordonfreman, думаю успеем :)\r\n\r\nНачинайте писать proposal. Как будет черновая версия - скидывайте ссылку, я подправлю. Ну и еще напишите о своей идее на std-proposals (а то вдруг кто-то делает точь в точь то же самое).\r\n\r\n\r\n**mrgordonfreman, 10 апреля 2017, 5:14**\r\nyndx-antoshkka, Черновая версия готова\r\nhttps://compmaniak.github.io/proposals/Heterogeneous%20lookup%20in%20unordered%20containers.html\r\n\r\nВот сам репозиторий с исходником https://github.com/compmaniak/proposals\r\n\r\nНа std-proposals никто не отозвался, что делает то же самое\r\nhttps://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/RCmAwD9s5W8\r\n\r\nПравда там указали, что поломается ABI в случае\r\n\r\ntemplate ,\r\nclass _Pred = typename _default_pred<_Value, _Hash>::type,\r\nclass _Alloc = allocator<_Value> >\r\nclass unordered_set\r\n\r\nи сослались на пропозал http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0181r0.html\r\nНе понятно в каком случае сломается, этот пропозал пережил одну правку\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0181r1.html\r\nи был отменен совсем недавно в Коне.\r\n\r\nПоэтому пришлось это учесть и теперь придется записывать контейнер с явным указанием еще и гетерогенной функции сравнения\r\n```cpp\r\nstd::unordered_set, std::equal_to<>> s = {\"hello\"};\r\ns.find(std::string_view{\"hello\"});\r\n```\r\nНо лучше написать немного больше при объявлении, чем вовсе остаться без гетерогенного поиска)\r\n\r\n\r\n**yndx-antoshkka, 10 апреля 2017, 13:43**\r\nmrgordonfreman, получилось очень круто. Я в течение недели вышлю на почту указанную в proposal, несколько замечаний связанных с местными правилами и объясню дальнейшие шаги.\r\n\r\nНатолкнулся на один очень важный момент: GCC и CLANG хешируют const char* = \"Hello\" не как строчку, а как void*, то есть просто хешируют адрес. Другими словами, вот этот пример выдаёт две разные строчки:\r\n```cpp\r\n#include \r\n#include \r\n\r\nint main() {\r\n const char* data = \"Hello\\0Hello\";\r\n std::cout << std::hash()(data) << '\\t' << data\r\n << '\\n' << std::hash()(data + 6) << '\\t' << data + 6;\r\n}\r\n```\r\n\r\nА это значит, что\r\n```cpp\r\nstd::set> s2 = {\"hello\"};\r\ns2.find(std::string_view{\"hello\"}); // ok\r\ns2.find(\"hello\"); // не соберётся, т.к hash не специализирован\r\nconst char* data = \"Hello\";\r\ns2.find(data); // соберётся, но ничего не найдет\r\n```\r\nС этим надо что-то порешать, с подобными недочётами proposal в стандарт не примут.\r\n\r\n\r\n**mrgordonfreman, 12 апреля 2017, 2:31**\r\nyndx-antoshkka, Чтобы работал следующий код\r\n```cpp\r\nstd::unordered_set, std::equal_to<>> s = {\"hello\"};\r\ns.find(\"hello\");\r\n```\r\nпредлагаю определить хэш для массива символов. Для этого нужно\r\n\r\n1) Ввести новый трейт is_character, который для типов char, char16_t, char32_t, wchar_t будет выдавать true. Сейчас появился тип std::byte, т.е. С++17 разделяет понятия байта и текстового символа. Поэтому такой трейт будет вполне уместным.\r\n\r\n2) Определить специализации std::hash для типов T[N] и T(&)[N], для которых is_character_v будет true. Хэш вычислять с помощью string_view (и поставлять в том же заголовочном файле).\r\n\r\nВот пример реализации с тестами\r\nhttps://github.com/compmaniak/libcxx/commit/e9690312003b2aef0f53eb98f768a7cdfd8889a6\r\n\r\nА со следующим кодом\r\n```cpp\r\nstd::unordered_set, std::equal_to<>> s = {\"hello\"};\r\nconst char *data = \"hello\";\r\ns.find(data);\r\n```\r\nможно ничего не делать) Объяснение может быть таким:\r\n\r\n1) Сломается совместимость, нельзя внезапно взять и вычислять хэш по-другому.\r\n2) Нельзя гарантировать однозначное вычисление хэша во всех единицах трансляции.\r\n```cpp\r\nunit1.cpp\r\n---------------------\r\n#include \r\nconst char* s = \"hello\";\r\nstd::hash<>{}(s); // будет вычислен как T*\r\n\r\nunit2.cpp\r\n---------------------\r\n#include \r\n#include \r\nconst char* s = \"hello\";\r\nstd::hash<>{}(s); // будет вычислен как std::string_view{s}\r\n```\r\n3) Гетерогенный поиск в контейнерах выключен по умолчанию. Его включение - это сознательное действие разработчика. Точно такие же проблемы с непредсказуемым поведением мы можем получить с гетерогенным поиском по std::map/std::set, когда ADL сыграет с нами злую шутку.\r\n\r\nЕще я думал над идеей что-то типа hash_proxy, который будет выдавать тип, через который гетерогенный хэш считать. Но это мне кажется хуже, чем первый вариант, потому что придем к противоречию\r\n```cpp\r\nconst char* s = \"hello\";\r\nassert( std::hash{}(s) != std::hash<>{}(s) );\r\n```\r\nА это уже серьезный аргумент против.\r\n\r\nВыходит, что const char* - это обуза со временем С. Но не отказываться же из-за этого от всех плюсов гетерогенного поиска?)\r\n\r\n\r\n**yndx-antoshkka, 12 апреля 2017, 9:34**\r\nmrgordonfreman, хм...\r\nА что получится, если к вашему предложению (тому, которое до предложения с is_character) добавить, что hash должен выглядеть вот так:\r\n```cpp\r\ntemplate struct hash> {\r\n size_t operator()(std::basic_string_view t) const noexcept {\r\n return hash>{}(t);\r\n }\r\n};\r\n```\r\n+ is_transparent брать из компаратора + убрать специализацию struct hash?\r\n\r\nТогда все примеры будут работать:\r\n```cpp\r\nstd::unordered_set, std::equal_to<>> s2 = {\"hello\"};\r\ns2.find(std::string_view{\"hello\"}); // ok\r\ns2.find(\"hello\"); //ok\r\nconst char* data = \"Hello\";\r\ns2.find(data); // ok\r\n```\r\nНо я не уверен, что будет работать\r\ns2.find({\"Hello word\", 5}); // ??? а это наc вообще должно волновать при std:;equal_to<> ???\r\n\r\n\r\n**yndx-antoshkka, 12 апреля 2017, 9:56**\r\nmrgordonfreman, минутку! Мне не удалось найти пример, где std::less<> ведёт себя иначе чем std::less:\r\n```cpp\r\n#include \r\n#include \r\n#include \r\n\r\nint main() {\r\n std::set> s {\r\n \"Hello\", \"dudde\", \"Woopsie\", {5, 'Q'}\r\n };\r\n\r\n assert( s.count(\"Hello\") );\r\n assert( s.count(std::string{\"Hello\"}) );\r\n assert( s.count({\"Hello Word\", 5}) );\r\n assert( s.count({5, 'Q'}) );\r\n}\r\n```\r\nА это значит что можно получить ОГРОМНЫЙ плюс:\r\n* берём ваш proposal, убираем специализацию std::hash, берём is_transparent из комапартора\r\n* все компараторы специализируем для std::basic_string, говорим что они гетерогенные, принимают параметр std::basic_string_view\r\n* PROFIT: из коробки ВСЕ ассоциативные контейнеры с std::string начинают работать во много раз быстрее\r\n\r\n\r\n**mrgordonfreman, 12 апреля 2017, 19:25**\r\nyndx-antoshkka, отличная идея! Опробовал, все функционирует.\r\nПредлагаю тогда разбить работу на части\r\n1) гетерогенный поиск в unordered контейнере + hash через string_view\r\n2) специализация всех компараторов для строки\r\nЯ буду дожимать первую часть.\r\nДля второй части наверно лучше будет отдельный пропозал делать - меняет поведение по умолчанию имеющегося кода, вдруг ABI где отъедет. Смешивать в один документ сложновато будет, и выше вероятность, что комитет зарубит сразу 2 фичи)\r\n\r\n\r\n**mrgordonfreman, 12 апреля 2017, 19:32**\r\nyndx-antoshkka, а можно как-нибудь узнать, почему отклонили это предложение open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0181r1.html ?\r\nЯ нашел только итоги голосования, на форуме про сломанное ABI говорили. Но вот как именно такая небольшая правка могла повлиять, не понятно.\r\nВполне может быть, что со специализацией компараторов для std::string такие же проблемы будут.\r\n\r\n\r\n**mrgordonfreman, 13 апреля 2017, 12:38**\r\nyndx-antoshkka, с вычислением хэша строки через string_view проблема нашлась\r\n\r\nНе компилируется следующий код\r\n```cpp\r\ntemplate struct hash> {\r\n size_t operator()(std::basic_string_view t) const noexcept {\r\n return hash>{}(t);\r\n }\r\n};\r\n\r\ntemplate \r\nstruct ConvertibleToSimple {\r\n operator To() const { return To{}; }\r\n};\r\nusing T = std::string;\r\ntypename std::result_of(ConvertibleToSimple&)>::type r{};\r\n```\r\nПримерно такой код в тестах libcxx для проверки требований к функции хэша\r\n\r\n\r\n**yndx-antoshkka, 24 апреля 2017, 17:48**\r\nmrgordonfreman, долго и мучительно пытался обойти подобную проблему, в итоге ничего хорошего не вышло. Получилось нечто, что на некоторых граничных условиях в огромных количествах генерирует временные строки.\r\n\r\n> 2) специализация всех компараторов для строки\r\nТа же проблема - множество временных объектов строки в граничных случаях.\r\n\r\nПохоже что стоит ограничиться гетерогенным поиском только когда пользователь это явно запросил.\r\n\r\n\r\n**yndx-antoshkka, 26 апреля 2017, 15:00**\r\nmrgordonfreman, немного поэкспериментировал с производительностью. Современные компиляторы убирают создание временного объекта ключа. Получается что разницы в производительности между set{}.find(\"qwe\") и set>{}.find(\"qwe\") - нет никакой.\r\n\r\nТак что основное для чего могут понадобиться гетерогенные unordered контейнеры, это чтобы искать по сравнимым друг с другом типам данных, которые в то же время не преобразовываются от одного к другому:\r\n```cpp\r\nstruct person; // can not be constructed from string!\r\nbool operator==(const person& p, const std::string& name);\r\nbool operator==(const std::string& name, const person& p);\r\n```\r\nИдею с гетерогенными компараторами по умолчанию для string - выкидываю на свалку, прироста скорости она не даёт.\r\n\r\nИдея с гетерогенными unordered контейнерами - жжот, расширяет применимость контейнеров. Постараюсь в ближайшее время сделать pull request с правками.\r\n\r\n\r\n**mrgordonfreman, 28 апреля 2017, 20:09**\r\nyndx-antoshkka, будем что-либо делать со следующим кейсом?\r\n```cpp\r\nstd::unordered_set, std::equal<>> s2 = {\"hello\"};\r\ns2.find(std::string_view{\"hello\"}); // ok\r\ns2.find(\"hello\"); // не соберётся, т.к hash не специализирован\r\nconst char* data = \"Hello\";\r\ns2.find(data); // соберётся, но ничего не найдет\r\n```\r\nСейчас пропозал не решает это, предоставляет только прозрачный хэш и необходимые функции.\r\nУ меня появилась еще мысль добавить в string_view конструктор по массиву символов\r\n```cpp\r\ntemplate>\r\nclass basic_string_view {\r\n template\r\n basic_string_view(Ch const (&a)[N]) {\r\n auto pos = Traits::find(a, N, Ch('\\0')); // ищем нул-символ\r\n if (pos == nullptr)\r\n создаем по строке (a, a + N);\r\n else\r\n создаем по строке (a, --pos);\r\n }\r\n};\r\n```\r\nСовместимо с созданием по C-строке + можно будет безопасно создавать вью на массивы без нул-символа. Тогда хэши массивов можно будет красиво выразить через string_view.\r\n\r\n\r\n**yndx-antoshkka, 3 мая 2017, 16:50**\r\nmrgordonfreman, basic_string_view трогать не стоит. Такой конструктор не очень красивый: поведение зависит от рантайма + пользователю очень легко случайно сконвертировать массив без '\\0' к указателю и получить segmentation fault.\r\n\r\nС кейсом делать ничего не надо и добавлять специализацию std::hash<> тоже не надо. Стоит сделать чтобы контейнер становился \"гетерогенным\" из-за компаратора, а не функции хеширования. Функцию хеширования пользователь должен передать/сделать сам.\r\n\r\nТаким образом мы получим гетерогенные контейнеры, но не придётся мучаться c std::hash и супер различными несовместимыми его имплементациями.\r\n\r\nТогда проблемный пример будет выглядеть как std::unordered_set> и решение по хешированию ляжет на плечи пользователя. Решить за пользователя мы не можем эту проблему - нет подхода который везде хорошо работает и не ломает пользовательский код.\r\n\r\n\r\n**yndx-antoshkka, 16 февраля 2018, 12:35**\r\nПоявился proposal на гетерогенные сравнения для unordered контейнеров: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0919r0.html", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805056739/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805057729", + "html_url": "https://github.com/cpp-ru/ideas/issues/168#issuecomment-805057729", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/168", + "id": 805057729, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA1NzcyOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:44:54Z", + "updated_at": "2021-03-23T16:44:54Z", + "author_association": "MEMBER", + "body": "**ru.night.beast, 31 марта 2017, 13:03**\r\nнаверно, разумнее делать не cow string, а cow_ptr.\r\nну и есть проблема с передачей между потоками.\r\n\r\n\r\n**Михаил Мальцев, 31 марта 2017, 13:10**\r\nru.night.beast, как cow_ptr будет понимать, когда нужно выполнить unsharing (т.е. копирование) для произвольного типа T?\r\n\r\n\r\n**ru.night.beast, 31 марта 2017, 13:12**\r\nМихаил Мальцев, при попытке получения неконстантной ссылки.\r\n\r\n\r\n**Олег Ляттэ, 1 апреля 2017, 2:52**\r\nru.night.beast, может, я не замечаю очевидного, но какие новые проблемы с потоками появляются у cow string по сравнению с обычным string?\r\n\r\n\r\n**ru.night.beast, 1 апреля 2017, 11:04**\r\nОлег Ляттэ, http://www.gotw.ca/publications/optimizations.htm\r\n\r\n\r\n**Олег Ляттэ, 1 апреля 2017, 14:23**\r\nru.night.beast, спасибо, для меня оказалось весьма познавательно. Теперь понятно, откуда столько минусов :-D\r\n\r\n\r\n**Клеванец Игорь, 31 марта 2017, 14:03**\r\nИдея хорошая, но для отдельного типа\r\n\r\n\r\n**Олег Ляттэ, 1 апреля 2017, 14:29**\r\nКлеванец Игорь, согласен. Делать это в std::basic_string, видимо, не лучшая идея.\r\n\r\n\r\n**Сергей Садовников, 31 марта 2017, 19:52**\r\nstd::string + std::string_view + small string optimization + move semantic делают CoW фактически ненужным. А CoW в многопоточной среде - малоэффективен и, временами, опасен.\r\n\r\n\r\n**Клеванец Игорь, 1 апреля 2017, 14:39**\r\nСергей Садовников, бывают случаи, когда нужно именно это: тонкая копия константного объекта для работы в нескольких потоках. Редко, но надо", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805057729/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805059885", + "html_url": "https://github.com/cpp-ru/ideas/issues/169#issuecomment-805059885", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/169", + "id": 805059885, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA1OTg4NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:48:00Z", + "updated_at": "2021-03-23T16:48:00Z", + "author_association": "MEMBER", + "body": "**Михаил Мальцев, 4 апреля 2017, 21:14**\r\n> raw_function f(std::string, void) //+ проверка первого типа\r\n> raw_function f(std::string, void) -> std::string; //+ проверка возвращаемого значения\r\nЭто невозможно реализовать, т.к. calling convention может сильно зависеть от типа возвращаемого значения.\r\n\r\nПро генераторы - см. Coroutines TS http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4649.pdf\r\n\r\n\r\n**ru.night.beast, 4 апреля 2017, 23:14**\r\nМихаил Мальцев> Это невозможно реализовать, т.к. calling convention может сильно зависеть от типа возвращаемого значения.\r\n\r\nв виде библиотеки, с рантайм проверками по аналогии с any, возможно.\r\nв язык пихать не нужно.\r\n\r\n\r\n**int33h-tm, 4 апреля 2017, 23:18**\r\nМихаил Мальцев, да, немного не додумал..., хотя точнее недописал... Понятно, что на стек положить объекты заранее неизвестного размера не лучшая идея, но туда вполне можно положить указатели(типа void*) на сырую дату этих объектов.\r\n\r\n\r\n**yndx-antoshkka, 6 апреля 2017, 19:38**\r\nПодскажите, а RAII с полноценными классами почему вам не подходят?\r\n\r\n\r\n**int33h-tm, 7 апреля 2017, 0:27**\r\nyndx-antoshkka, а как RAII разрешит эту проблему? Эта проблема досталась С++ по наследству от С. RAII, насколько я знаю, помогает решать проблему только для объектов, которыми функции, к сожалению, не являются.\r\n\r\n\r\n**yndx-antoshkka, 7 апреля 2017, 12:55**\r\nint33h-tm, почему\r\n```cpp\r\nclass open_read {\r\n FILE* f;\r\npublic:\r\n open_read(char* name) : f(fopen(name, \"r\")) {}\r\n ~open_read() { fclose(f); }\r\n};\r\n\r\n...\r\n open_read f(\"input.txt\");\r\n code;\r\n```\r\nне является заменой вашему предложению с\r\n```cpp\r\nover_function open_read(char* name){\r\n FILE* f = fopen(name, \"r\");\r\n code;\r\n fclose(f);\r\n}\r\n```\r\n?\r\n\r\n\r\n**int33h-tm, 7 апреля 2017, 22:07**\r\nyndx-antoshkka, тогда уж надо f вынести в секцию public... А так в принципе я и писал, что это реализуемо с помощью классов(вроде бы шаблонами функции называются). Проблема в том, что выше...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805059885/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805061481", + "html_url": "https://github.com/cpp-ru/ideas/issues/170#issuecomment-805061481", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/170", + "id": 805061481, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA2MTQ4MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:50:08Z", + "updated_at": "2021-03-23T16:50:08Z", + "author_association": "MEMBER", + "body": "**Михаил Мальцев, 4 апреля 2017, 21:07**\r\nРазные идеи насчёт генерации операторов сравнения уже активно обсуждаются в комитете:\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0221r2.html\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0481r0.pdf\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0436r1.pdf\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0515r0.pdf\r\n\r\n\r\n**int33h-tm, 4 апреля 2017, 23:36**\r\nМихаил Мальцев, теперь я увидел, спасибо. Тогда у меня остается только одно желание, чтобы все эти генерации по умолчанию были явными, иначе проблем не избежать...\r\n\r\n\r\n**ru.night.beast, 4 апреля 2017, 23:24**\r\n>Предложение 2:\r\n\r\nint foo (int a, int b);\r\nauto foo (int a) -> auto { return foo(a, 5); }\r\n\r\n\r\n**int33h-tm, 4 апреля 2017, 23:45**\r\nru.night.beast, хорошо когда эти две функции рядом... А когда между ними еще 20 строк кода? Да и этот код не гарантирует того, что он будет вставлен вместо перегруженной функции foo. Идея состояла в том, чтобы сделать inline функции своеобразными мнемониками для других функций или команд.\r\n\r\n\r\n**ru.night.beast, 5 апреля 2017, 8:53**\r\nint33h-tm> хорошо когда эти две функции рядом... А когда между ними еще 20 строк кода?\r\n\r\nа какая разница, сколько между ними строк?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805061481/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805063270", + "html_url": "https://github.com/cpp-ru/ideas/issues/170#issuecomment-805063270", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/170", + "id": 805063270, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA2MzI3MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:52:41Z", + "updated_at": "2021-03-23T16:52:41Z", + "author_association": "MEMBER", + "body": "Операторы сравнения в C++20 позволяют использовать `= default` а operator <=> позволяет писать один оператор вместо целой кучи, и тоже может быть `= default` http://eel.is/c++draft/expr.spaceship", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805063270/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805064057", + "html_url": "https://github.com/cpp-ru/ideas/issues/170#issuecomment-805064057", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/170", + "id": 805064057, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA2NDA1Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:53:48Z", + "updated_at": "2021-03-23T16:54:09Z", + "author_association": "MEMBER", + "body": "Механизм связываний из \"предложения 2\" реализуется через вызов нужной функции в теле, особо нового он ничего не привносит в язык.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805064057/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805065831", + "html_url": "https://github.com/cpp-ru/ideas/issues/171#issuecomment-805065831", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/171", + "id": 805065831, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA2NTgzMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:56:13Z", + "updated_at": "2021-03-23T16:56:13Z", + "author_association": "MEMBER", + "body": "**ilnurkh, 5 апреля 2017, 16:00**\r\nдублирую описание:\r\nВозможность не задавать инициализирующий значения является постоянным источником ошибок. Более того, в ряде случаев не возможность явного указания отсутствия начального значения является причиной ненужных действий (например при необходимости создать std::vector с заданным количеством элементов а затем перезаписать все его значения).\r\nПредлагаю для начала разрешить код вида: int var = std::uninitialized(); .\r\nА также дать возможность писать подобное std::vector vector_with_trash(100, std::unitialized_constructor);\r\n\r\nВ более радикальной формулировке предлагается запретить создавать переменные и поля без начальных значений. Отказ от явной инициализации должен быть обозначен явным std::uninitialized\r\n\r\n\r\n**yndx-antoshkka, 7 апреля 2017, 13:18**\r\nilnur.khuziev, int var = std::uninitialized(); не решит проблемы - пользователи будут так писать и будут так же забывать проинициализировать переменные. Проблему пока что лучше всего решают -Wall -Werror которые врубают статический анализ кода и находят места где переменные могут быть не проинициализированы.\r\n\r\nРешать проблему с отсутсвием неинициализирующих конструкторов надо сразу для всех контейнеров. У большинства sequence контейнеров есть констуркторы и resize которые принимают только размер, и соответственно будет вызываться std::allocator.construct(pointer) без параметров для инициализации. К сожалению allocator.construct(pointer) вызывает new(pointer) T(); а это проинициализирует T нулём (если T - численный тип). Если подсунуть свой особый аллокатор, то можно избежать инициализации:\r\n```cpp\r\ntemplate \r\nstruct my_allocator: public std::allocator {\r\n using value_type = typename std::allocator::value_type;\r\n\r\n template\r\n struct rebind { typedef my_allocator other; };\r\n\r\n template< class U>\r\n void construct(U* p) {\r\n ::new (static_cast(p)) T;\r\n }\r\n};\r\n```\r\nТолько вот контейнер с таким аллокатором нельзя переместить в контейнер с обычным аллокатором.\r\n\r\nПросто передать std::uninitialized() в контейнер нельзя - конструирование объектов должно происходить через allocator_traits::construct\r\n\r\nДальше надо исследовать и думать, как решать комплексно решить проблему.\r\n\r\n\r\n**ilnurkh, 7 апреля 2017, 13:28**\r\nyndx-antoshkka,\r\n1) не решит конечно, но можно делать ворнинг на отстутствие таких указаний (или аттрибутов).\r\n2) конечно это не законченное предложение а приглашение к обсуждению\r\n\r\n\r\n**yndx-antoshkka, 10 апреля 2017, 17:00**\r\nilnur.khuziev, есть proposal http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0632r0.html с идеей похожей на идею из пункт 1)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805065831/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805067703", + "html_url": "https://github.com/cpp-ru/ideas/issues/172#issuecomment-805067703", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/172", + "id": 805067703, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA2NzcwMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T16:58:37Z", + "updated_at": "2021-03-23T16:58:37Z", + "author_association": "MEMBER", + "body": "**Клеванец Игорь, 5 апреля 2017, 14:25**\r\nПервый вопрос на рассмотрении предложения в комитете: чем плох метод reserve() ?\r\n```cpp\r\nstd::vector v;\r\nv.reserve(100);\r\n```\r\n\r\n**ilnurkh, 5 апреля 2017, 15:59**\r\nКлеванец Игорь, во-первых, так краше. Не надо недооценивать психологический элемент: думаю половина случаев когда программист сознательно не сделал reserve - нет было желания делать в две строки.\r\n+ микро-оптимизация на инициализации переменных вектор\r\n+ возможность в ряде случаев избегать именования временных переменных без потери производительности\r\n\r\n\r\n**ilnurkh, 5 апреля 2017, 16:03**\r\nКлеванец Игорь, так выразительнее и в духе RAII - мы определяем начальное состояние объекта.\r\n\r\n\r\n**Клеванец Игорь, 5 апреля 2017, 16:08**\r\nilnur.khuziev, стандартная библиотека вообще для людей с крепкими нервами. Но лень написать строку - это нечто странное...\r\nМожно увидеть пример кода с временными переменными, который хочется оптимизнуть?\r\n\r\n\r\n**ilnurkh, 5 апреля 2017, 16:21**\r\nКлеванец Игорь, ну вот пример, кода нам нужно вместо внутреннего представления данных использовать стандартный - вектор.\r\n```cpp\r\nvoid some_lib_function(const std::vector&);\r\n\r\nstruct my_strange_container; //only have forward iterator\r\n\r\nvoid proxy_call(const my_strange_container& src) {\r\n some_lib_function(\r\n std::vector(std::reserve(src.Size()).assing(src.begin(), src.end())\r\n );\r\n //assign никак не может вычислить будущий размер и переаллокаций не избежать без предварительного reserve\r\n}\r\n```\r\n\r\n**Клеванец Игорь, 5 апреля 2017, 16:58**\r\nilnur.khuziev, в каждой точке вызова такую бороду кода писать - странно. По-хорошему надо написать где-то функцию, которая переложит данные из одного контейнера в другой и сделает это правильно - с использованием reserve()\r\n\r\n\r\n**ilnurkh, 7 апреля 2017, 10:19**\r\nКлеванец Игорь, с++ развивается в сторону увеличения выразительности. Так и лямбды то не нужны, и auto какая-то дичь. Мелкое изменение которое заставляет рутинную вещь выглядить лучше, а также избегать лишних\r\n\r\nА так да, пример с прокси вызовом конечно очень не естественный. Но основной случай default constructor + reserve имхо очень жизненный.\r\n\r\n\r\n**yndx-antoshkka, 7 апреля 2017, 12:00**\r\nЧто тут написано?\r\n```cpp\r\nstd::vector v(100, int{1}, container_init_capacity_holder{1024});\r\n```\r\nНемного непонятно, не правда ли?\r\n\r\nА вот так лучше:\r\n```cpp\r\nstd::vector v;\r\nv.reserve(1024);\r\nv.resize(100, int{1}); // тоже бяка, но лучше чем в первом примере\r\n```\r\n\r\nНо основное моё возражение: идее не хватает масштаба. Мне будет просто совестно отвлекать LEWG и LWG от Ranges/Networking/Coroutines/Span/constexpr/sse/Concurrency proposalом на добавление 1 конструктора в вектор, который ещё и не привносит нового функционала.\r\n\r\n\r\n**a.d.romanov, 21 октября 2017, 17:08**\r\nПроблема не в двух строках вместо одной. Проблема в том, что никто не гарантирует zero-overhead у пустого вектора.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805067703/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805069550", + "html_url": "https://github.com/cpp-ru/ideas/issues/173#issuecomment-805069550", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/173", + "id": 805069550, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA2OTU1MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T17:00:57Z", + "updated_at": "2021-03-27T12:08:57Z", + "author_association": "MEMBER", + "body": "**Клеванец Игорь, 5 апреля 2017, 14:27**\r\nКакую задачу/проблему должна решить такая возможность?\r\n\r\n\r\n**ilnurkh, 7 апреля 2017, 10:14**\r\nКлеванец Игорь, sse по данным deque (прежде всего, конечно, sse копирование из deque)\r\n\r\n\r\n**Дмитрий, 5 апреля 2017, 18:28**\r\nhttp://lafstern.org/matt/segmented.pdf\r\n\r\n\r\n**yndx-antoshkka, 6 апреля 2017, 18:52**\r\nМне бы очень хотелось, чтобы подобную оптимизацию компиляторы делали автоматически - все данные у них для этого есть.\r\n\r\nВ GCC 7.0.1 добавили \"loop splitting optimization\", если она не срабатывает на подобных кейсах - надо сделать минимальный пример, приложить дизассемблер и попросить чтобы оптимизировали. Минимальный пример удобно делать вот тут https://gcc.godbolt.org/ (надо использовать флаги -std=c++17 -O2).\r\n\r\nПопробуйте создать минимальный пример. Если возникнут вопросы - обращайтесь.\r\n\r\n\r\n**ilnurkh, 7 апреля 2017, 10:13**\r\nyndx-antoshkka, ситуации ведь могут быть разными. а если мы хотим какой-нибудь sse использовать на чанках. тогда без оптимизации вообще не сможем код правильно написать.\r\n\r\n\r\n**yndx-antoshkka, 7 апреля 2017, 11:47**\r\nilnur.khuziev, чтобы использовать sse на чанках надо ещё сделать, чтобы чанки были корректно выравнены. Либо написать логику, которая будет работать вначале без sse, а при достижении элемента с нужным alignment будет начинать sse. Такая логика будет давать разные приросты производительности/деградацтии в зависимости от имплементации стандартной библиотеки, поскольку размер чанка очень зависит от имплементации. И получается, что подобную низкоуровневую оптимизацию лучше сделает компилятор (он знает размеры чанка, он знает выравнивания, он знает особенности платформы).\r\n\r\nНа мой предвзятый взгляд, идея решать подобное на уровне библиотеки выглядит как куча работы, которая улучшит только один контейнер и только пара человек в мире будут ей пользоваться.\r\n\r\nГотов помогать только если будет готовый прототип и хоть один пример где такой подход действительно помогает.\r\n\r\n\r\n**ilnurkh, 8 апреля 2017, 9:53**\r\nyndx-antoshkka, я попробую сделать замеры, надеюсь не забуду.\r\nНо я совсем забыл одну важную мысль: у deque итераторов по идее сильно дороже должно быть одно из двух: либо ++iter, либо *iter по понятным причинам. То есть формально, всякие if в перегрузках компилятор убирать не может. Нужна там действительно логика специально для этого контейнера.\r\n\r\n\r\n**Сергей Прейс, 10 апреля 2017, 7:49**\r\nyndx-antoshkka, позволю себе не согласиться:\r\n- Компилятор не знает выравнивание чанков. Ом может о них догадываться, но сам ими не управляет (чанки аллоцируются динамически и их выравнивание зависит от платформы и бибилиотеки).\r\n- Компилятор не знает размер чанков - он может их узнать только если очень-очень постарается, но на практике этого обычно не происходит. Информация о высокоуровневой структуре deque исчезает очень рано (во время трансляции во внутреннее представление). Компилятору надо исхитриться осознать, что некое низкоуровневое внутреннее представление - это deque а числовая константа в определенном месте (зависящем от конкретной реализации) - это размер чанка. Поскольку реализации STL могут быть разными компилятор имеет очень-очень мало представления о его структурах, подавляющее большинство конструкций STL с точки зрения компилятора не отличаются от пользовательского кода.\r\n- Компилятор не знает о том, что это чанк вообще: оптимизатор в компиляторе имеет дело с низкоуровневым представлением и для него адреса чанков - это указатели прочитанные из массива в памяти. Протащить на них выравнивание - это ещё надо постараться (ведь оно может быть в общем случае разным для разных элементов массива).\r\n\r\nВ связи с эти идея о более явном выделении более хорошо (без условий) устроенных циклов кажется разумной.\r\n\r\n\r\n**Сергей Прейс, 10 апреля 2017, 8:05**\r\nyndx-antoshkka,\r\nС другой стороны для этого случая возможны оптимизации общего плана как в цикловом оптимизаторе, так и в векторизаторе. Вопрос здесь лишь в том, должен ли пользователь полагаться на оптимизации (которые могу сработать, а могут и не сработать) вместо того, чтобы написать явно более эффективный код.\r\n\r\nКонкретно возможны две оптимизации для любого кода (если компилятору удастся доказать, что трансформации не меняют семантику):\r\n\r\nЕсли низкоуровневое представление выглядит как:\r\n```cpp\r\nfor ( i = 0; i < N; ++i) {\r\n if ( i % CHUNK_SIZE) {\r\n p = chunks[i / CHUNK_SIZE];\r\n }\r\n do_job(p, i % CHUNK_SIZE);\r\n}\r\n```\r\nКомпилятор может попытаться сделать:\r\n```cpp\r\nfor ( c = 0; c < N / CHUNK_SIZE; ++c) {\r\n p = chunk[c];\r\n for (i = 0; i < min(CHUNK_SIZE, (N-CHUNK_SIZE*c); i++) {\r\n do_job(p, i % CHUNK_SIZE);\r\n }\r\n}\r\n```\r\nВнутренний цикл хорошо векторизуется и с выравниванием компилятор сам разберётся.\r\nНо оптимизация эта достаточно сложная в реализации и я не уверен, что компиляторы умеют её надежно делать.\r\n\r\nВекторизатор может сделать более простую оптимизацию сгенерив маскированный gather для загрузки посдедовательных индексов и потом применить локальные оптимизации типа если маска вся из единиц, то сделать последовательную загрузку.\r\n\r\n\r\n**yndx-antoshkka, 13 ноября 2017, 13:09**\r\nИльнур сделал отличные тесты, по которым виден выигрыш в производительности. Мы помучали ассемблерный выхлоп, посправшивали разработчиков GCC и завели тикет: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81461\r\n\r\nРазработчики GCC говорят что компилятор может делать jump threading оптимизацию, и выигрыш в производительности должен сойти на нет. Оптимизации на основе SSE так же сможет делать, но там нужно хитрое прокидывание aliasing и alignment. Работа в этом направлении идёт, но в ближайшее время не сойдётся.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805069550/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805071246", + "html_url": "https://github.com/cpp-ru/ideas/issues/174#issuecomment-805071246", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/174", + "id": 805071246, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA3MTI0Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T17:03:21Z", + "updated_at": "2021-03-23T17:03:21Z", + "author_association": "MEMBER", + "body": "**Клеванец Игорь, 5 апреля 2017, 14:36**\r\nhttp://en.cppreference.com/w/cpp/container/map/operator_at\r\n\r\nОписание начинается со слов \"1) Inserts a value_type object constructed in-place...\". Т.е. во своей сути метод модифицирующий. Что должен будет делать метод константный?\r\n```cpp\r\nconst T& operator[]( const Key& key ) const;\r\n```\r\n\r\n**ilnurkh, 5 апреля 2017, 15:53**\r\nКлеванец Игорь, не подклеивается на этой странице подзаголовок:\r\nповедение простое - должны действовать аналогично at(TKey) const\r\n\r\nмотивация - унификация. В vector есть operator[] (..) const\r\n\r\n\r\n**Клеванец Игорь, 5 апреля 2017, 16:28**\r\nilnur.khuziev, надо просто получить ссылку на элемент... Получится большая разница между\r\n```cpp\r\nconst T& operator[]( const Key& key ) const;\r\nT& operator[]( const Key& key );\r\n```\r\n\r\nИ это может взрывать мозг людям.\r\n```cpp\r\nstruct A {\r\n int foo(int i) const {\r\n return m[i];\r\n }\r\n int foo(int i) {\r\n return m[i];\r\n }\r\n std::map m;\r\n};\r\n```\r\nКод почти одинаковый, но делает сильно разные вещи", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805071246/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805072364", + "html_url": "https://github.com/cpp-ru/ideas/issues/175#issuecomment-805072364", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/175", + "id": 805072364, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA3MjM2NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T17:04:50Z", + "updated_at": "2021-03-23T17:04:50Z", + "author_association": "MEMBER", + "body": "**mrgordonfreman, 5 апреля 2017, 15:45**\r\nЧем плох static_cast?\r\n\r\n\r\n**Олег Ляттэ, 8 апреля 2017, 17:21**\r\nmrgordonfreman, тем, что ему нужно писать тип\r\n\r\n\r\n**Михаил Мальцев, 5 апреля 2017, 17:09**\r\nhttp://en.cppreference.com/w/cpp/utility/as_const\r\n\r\n\r\n**ilnurkh, 7 апреля 2017, 10:11**\r\nМихаил Мальцев, да, тоже увидел что оно уже есть ))\r\nсчитаю, что эффективно \"моё предложение принятно коммитетом\" )\r\n\r\n\r\n**dix75, 7 апреля 2017, 11:17**\r\nМихаил Мальцев,\r\nТолько хотел написать, а нет есть у нас знающие люди.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805072364/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805258979", + "html_url": "https://github.com/cpp-ru/ideas/issues/173#issuecomment-805258979", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/173", + "id": 805258979, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTI1ODk3OQ==", + "user": { + "login": "pavel-zhigulin", + "id": 6321795, + "node_id": "MDQ6VXNlcjYzMjE3OTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/6321795?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavel-zhigulin", + "html_url": "https://github.com/pavel-zhigulin", + "followers_url": "https://api.github.com/users/pavel-zhigulin/followers", + "following_url": "https://api.github.com/users/pavel-zhigulin/following{/other_user}", + "gists_url": "https://api.github.com/users/pavel-zhigulin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavel-zhigulin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavel-zhigulin/subscriptions", + "organizations_url": "https://api.github.com/users/pavel-zhigulin/orgs", + "repos_url": "https://api.github.com/users/pavel-zhigulin/repos", + "events_url": "https://api.github.com/users/pavel-zhigulin/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavel-zhigulin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-23T21:04:40Z", + "updated_at": "2021-03-23T21:04:40Z", + "author_association": "NONE", + "body": "Замечание немного сбоку - подобное изменение потребует прибить гвоздями реализацию `std::deque` на уровне интерфейса. Идеологически это довольно сомнительно, практически... ну, не мне решать.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805258979/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805555402", + "html_url": "https://github.com/cpp-ru/ideas/issues/176#issuecomment-805555402", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/176", + "id": 805555402, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTU1NTQwMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T07:01:54Z", + "updated_at": "2021-03-24T07:01:54Z", + "author_association": "MEMBER", + "body": "**ilnurkh, 10 апреля 2017, 17:04**\r\nполучение случайных чисел обязано быть методом объекта (состояние которого/источник энтропии и алгоритм генерации задаются явно), а не функцией меняющей глобальное состояние.\r\n\r\n\r\n**d-yaroshev, 18 июня 2017, 3:55**\r\nhttp://en.cppreference.com/w/cpp/experimental/randint", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805555402/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805556636", + "html_url": "https://github.com/cpp-ru/ideas/issues/177#issuecomment-805556636", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/177", + "id": 805556636, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTU1NjYzNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T07:03:47Z", + "updated_at": "2021-03-24T07:15:09Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 апреля 2017, 13:57**\r\nИдея хорошая. Надо поменять имплементацию на более обобщённую, чтобы:\r\n* на вход принимала итераторы, а не с контейнер\r\n* выдавала результат в OutputIterator а не в std::vector\r\n* не аллоцировала пямять (чтобы можно было подставить в него на выход итератор, принимающий string_view)\r\n* могла сплитить и по одному символу, и по нескольким, и используя функтор\r\n\r\nНо тогда у вас получится сто-то похожее на boost::split ...\r\n\r\n\r\n**Pavel, 10 апреля 2017, 15:23**\r\nyndx-antoshkka, я вот задумался над реализацией в виде for_each(..) - только each_tag(...) например. Вариантов-то много, главное чтобы хоть какой-то был в стандарте. Ну хоть буст::сплит, хотя он и странно выглядит по входным параметрам.\r\n\r\n\r\n**h4tred, 11 апреля 2017, 6:10**\r\nА если делить по строке, а не по символу? Тогда нужно притянуть и boost::find_all, что бы на базе его строить.\r\n\r\n\r\n**Pavel, 11 апреля 2017, 19:50**\r\nh4tred, было бы логично делить на Т в контейнере с Т. Всё остальное уже слишком для стандарта, как мне кажется.\r\n\r\n\r\n**Pavel, 21 апреля 2017, 19:17**\r\nyndx-antoshkka, ну вот как-то так. Что-то не виду преимуществ Output итератора (тут две версии, с ним и без него): https://github.com/crea7or/stringslice/blob/master/slicestd/slicestd.cpp\r\n\r\n\r\n**iloskutov, 21 октября 2017, 3:13**\r\nyndx-antoshkka, в стандартной библиотеке языка обычно хочется как раз split для простых случаев, которым приятно пользоваться, а при наличии особых требований можно воспользоваться сторонними библиотеками.\r\n\r\n\r\n**Сергей Садовников, 10 апреля 2017, 14:55**\r\nВообще, в качестве альтернативы, можно использовать regexp'ы, которые уже есть в стандарте.\r\n\r\n\r\n**Pavel, 10 апреля 2017, 15:24**\r\nСергей Садовников, это же насколько оно будет медленнее?\r\n\r\n\r\n**Сергей Садовников, 10 апреля 2017, 15:32**\r\ncrea7or, ну, это можно проверить. Не факт, что сильно медленнее.\r\n\r\n\r\n**Сергей Садовников, 10 апреля 2017, 19:06**\r\nБолее того, в std::regex уже есть такая конструкция:\r\nhttp://en.cppreference.com/w/cpp/regex/regex_token_iterator\r\n\r\n\r\n**Pavel, 11 апреля 2017, 0:06**\r\nСергей Садовников, я потратил 10 минут - 20+ раз разница с тем что вверху. Регэкспы это в принципе штука не быстрая.\r\n\r\n\r\n**Сергей Садовников, 11 апреля 2017, 1:14**\r\nДа. Согласен. По сравнению с достаточно простым алгоритмом \"в лоб\" разница действительно в 20 раз. А вот с бустовым алгоритмом, который более хитрый и предлагает больше количество классификаторов для сплиттера - разница уже меньше - всего в два раза. Регэкспы - штука, конечно, не быстрая. Но достаточно быстрая для задач обработки строк, отличающихся по сложности от простого разделения по символам.\r\n\r\nhttps://wandbox.org/permlink/YsLohgLdnlv1TCTQ\r\n\r\n\r\n**Pavel, 11 апреля 2017, 19:50**\r\nСергей Садовников, ок, я тогда попробую по своему в духе стандарта сделать и дальше посмотрим.\r\n\r\n\r\n**Pavel, 22 апреля 2017, 5:14**\r\nСергей Садовников, сделал я any_slice(в том числе) - всё равно разница в 20 раз с regexp'ом. Понятно, что для сложных штук придумывать ничего в стандарте не надо. Или своё или брать регэксп, но это-то задача не такого порядка: https://wandbox.org/permlink/3hm9rXLZYyUXbX8b\r\n\r\n\r\n**zamazan4ik@tut.by, 12 апреля 2017, 18:30**\r\nBoost.Algorithm (а точнее Boost.StringAlgo) умеет прекрасно делать такое. Если дождёмся unified call syntax, то будет вообще лепота.\r\n\r\n\r\n**Pavel, 22 апреля 2017, 22:44**\r\nДва предложения на эту тему уже есть. Первое, похоже, не прошло. Второе похоже на дельную вещь, но как мне кажется сильно сложное.\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3593.html\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0540r0.html\r\n\r\n\r\n**maxim.perenesenko, 31 мая 2017, 15:45**\r\nА как вам, например, такая реализация:\r\n```cpp\r\ntemplate\r\n_OutputIt split(_InputIt first, _InputIt last, _DelimsIt d_first, _DelimsIt d_last, _OutputIt out)\r\n{\r\n _InputIt start = first;\r\n while( first != last )\r\n {\r\n if( std::find(d_first, d_last, *first) != d_last )\r\n {\r\n *out++ = _Ty(start, first);\r\n start = first + 1;\r\n }\r\n ++first;\r\n }\r\n\r\n if( start != last )\r\n *out++ = _Ty(start, first);\r\n return out;\r\n}\r\n```\r\nИспользовать, например можно так:\r\n```cpp\r\nstd::string s = \"Some string, to tokenize.last\";\r\nstd::deque delims{ ' ', ',', '.' };\r\nstdx::split(std::begin(s), std::end(s), std::begin(delims), std::end(delims),\r\nstd::ostream_iterator(std::cout, \"\\n\"));\r\n```\r\nВставил ее в тест по времени от crea7or:\r\nhttps://wandbox.org/permlink/psULR142adeDiuMp\r\n\r\n\r\n**yndx-antoshkka, 1 июня 2017, 13:37**\r\nmaxim.perenesenko, огонь! Предлагаю пойти длинным путём и сначала добавить в Boost в виде pull request: https://github.com/boostorg/algorithm (только добавляйте в общие алгоритмы, а не в string)\r\n\r\nПохоже что можно убрать первый шаблонные параметр и просто писать *out++ = {start, first};. Возможно что умельцы из Boost подметят ещё какие-то вещи.\r\n\r\n\r\n**smertigdon, 5 июня 2017, 17:33**\r\nmaxim.perenesenko, часто используется split по одному разделителю, будет неплохо также сделать реализацию с таким функционалом, иначе костыльно получится\r\n\r\n\r\n**maxim.perenesenko, 16 июня 2017, 19:17**\r\nsmertigdon, тоже думал об этом. Спасибо.\r\n\r\n\r\n**maxim.perenesenko, 16 июня 2017, 19:18**\r\nyndx-antoshkka, Ни разу этого не делал, но попробую. О результатах отпишусь тут.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805556636/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805591873", + "html_url": "https://github.com/cpp-ru/ideas/issues/178#issuecomment-805591873", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/178", + "id": 805591873, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTU5MTg3Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:04:19Z", + "updated_at": "2021-03-24T08:04:19Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 24 апреля 2017, 17:44**\r\nне уверен в том, насколько std::nested_exception популярное решение. Но желающим помогу с написанием proposal.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805591873/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805593171", + "html_url": "https://github.com/cpp-ru/ideas/issues/179#issuecomment-805593171", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/179", + "id": 805593171, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTU5MzE3MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:06:27Z", + "updated_at": "2021-03-24T08:06:27Z", + "author_association": "MEMBER", + "body": "**mirgorodskiysk, 18 апреля 2017, 7:27**\r\nПолностью согласен с предложением! Если у тебя в функции будет, к примеру, 10 параметров - везде нужно писать static_cast-ы - это АД!\r\n\r\n\r\n**Antervis, 18 апреля 2017, 9:49**\r\nmirgorodskiysk, strong typed enum для того и нужен, чтобы быть отдельным типом перечисления, в отличие от обычного enum-а.\r\n\r\n\r\n**develoit, 18 апреля 2017, 10:14**\r\nAntervis, это не основное предложение) всего лишь синтаксическое \"послабление\" когда требуемый тип совпадает с базовым, не более. прокомментируй основное предложение, пожалуйста;)\r\n\r\n\r\n**develoit, 24 апреля 2017, 17:14**\r\nПрокомментируйте почему \"нет\", пожалуйста (хотя бы за основное предложение).\r\n\r\n\r\n**yndx-antoshkka, 24 апреля 2017, 17:29**\r\ndeveloit, расскажите подробнее, как вы хотите чтобы поведение было исправлено? Чего вы ожидаете? Чего вы хотели добиться изначально?\r\n\r\n\r\n**develoit, 25 апреля 2017, 11:38**\r\nyndx-antoshkka, сейчас если scoped-перечесление (с указанием базового типа или без) предварительно объявить в private-секции класса, то не важно в какой секции оно будет определено - оно останется private. Хотелось бы, чтобы область видимости перечисления задавалась секцией его определения, а не объявления (тем более для перечислений с указанием базового типа). Это касаемо основного предложения.\r\n\r\nЕще, для scoped-перечислений с указанием базового типа (только так!) хотелось бы не писать static_cast тогда, когда базовый тип перечисления совпадает с типом, к которому требуется преобразование. Если \"на пальцах\", то, чтобы вариант 2 в примере ниже не заставлял компиляторы ругаться, тогда как вариант 3 продолжал требовать привлечения static_cast.\r\n```cpp\r\nenum class color : std::size_t { red, green, blue };\r\nlong c1 = static_cast(color::red); //1\r\nstd::size_t c2 = color::green; //2\r\nint c3 = color::blue; //3\r\n```\r\n\r\n**yndx-antoshkka, 25 апреля 2017, 12:50**\r\ndeveloit, первая часть вашего предложения поломает существующий код и из-за этого её никто не примет.\r\n\r\nВторая часть вашего предложения (именно в таком виде) ухудшит type safety програм и соотвественно тоже не пройдет в комитете. Можно постараться как-то переформулировать её и слегка поменять поведение, но не понятно как именно.\r\n\r\n\r\n**develoit, 25 апреля 2017, 14:40**\r\nyndx-antoshkka, вот не понимаю как оно может поломать существующий код? можете пример привести, пожалуйста, как было и работало, и как перестанет работать если принять предложение?\r\nопять же, чем именно ухудшит type safety вторая часть, если только преобразование из перечисления в некоторый тип предполагается при полном совпадении последнего с базовым типом перечисления?\r\n\r\nкак по мне, так ничего не должно поломаться. возможно я дико ошибаюсь)\r\n\r\n\r\n**yndx-antoshkka, 25 апреля 2017, 17:20**\r\ndeveloit, поломает например вот тут:\r\n```cpp\r\nstruct foo {\r\n enum class some_enumerable_type : std::size_t;\r\n some_enumerable_type value_;\r\n\r\nprivate:\r\n enum class some_enumerable_type : std::size_t\r\n {\r\n identifier0,\r\n identifier1,\r\n identifier2,\r\n // ...\r\n identifierN\r\n };\r\n}\r\n```\r\nclass enum X - отдельный тип данных X. Вы предлагаете добавить оператор неявного преобразования ко всем enum. Это ведёт к ошибкам, для решения которых были добавляены explicit операторы в C++11.\r\n\r\n\r\n**develoit, 25 апреля 2017, 18:10**\r\nyndx-antoshkka, согласен, Ваш пример сломается, но он мало показателен и больше смахивает на ошибку что ли) согласитесь, объявлять тип в секции public, а затем определять его в private нелепо, сомнительно с прикладной точки зрения; сейчас оно сработает, но выглядит как-то запутанно, не однозначно. мой вариант строг в этом моменте - в какой секции определили enum, так он и виден во вне. предварительное объявление ведь совсем не для задания видимости в данном случае, а для возможности разместить переменную, зная базовый тип перечисления. именно определение перечисления в той или иной секции должно выражать намерение программиста, вносить ясность о видимости определяемого типа-перечисления, но никак не предекларация.\r\n\r\nя понимаю, что class enum X - это отдельный тип и отнюдь не предлагаю добавлять оператор неявного преобразования ко всем enum. я вполне понимаю для защиты от каких ошибок добавляли explicit операторы, но вторая часть моего предложения не из этой оперы. писать\r\nstd::size_t c = color::red;\r\nвместо\r\n```cpp\r\nstd::size_t c = static_cast(color::red);\r\n```\r\nпри color = enum class : std::size_t { red, ...};\r\nэто сродни пропуску списка параметров в определении лямбды, когда их попросту нет. не более.\r\n\r\nНо! на нет и суда нет) Вам виднее)\r\n\r\n\r\n**yndx-antoshkka, 25 апреля 2017, 19:06**\r\ndeveloit, хм... если так сильно ограничивать (делать фактически explicit операторы приведения) то идея интересная. Но нужно очень много исследований и проработать сразу большую часть проблем с enum:\r\n* операторы для enum из коробки?\r\n* расширить список типов для enum?\r\n* enum которые всегда хранят только одно из значений enum\r\n* ...\r\n\r\nНужно собрать все проблемы, проанализировать, найти решения, убедиться что решения друг другу не мешают. Если решать проблему по одной - можно оказаться в ситуации, когда решение одной проблемы перекрыло дорогу для решения другой проблемы.\r\n\r\nЭто адовая исследовательская работа. Если хотите заняться - помогу чем смогу.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805593171/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805594110", + "html_url": "https://github.com/cpp-ru/ideas/issues/180#issuecomment-805594110", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/180", + "id": 805594110, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTU5NDExMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:08:10Z", + "updated_at": "2021-03-24T08:08:10Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 17 апреля 2017, 10:37**\r\nМожно же это делать через лямбды:\r\n```cpp\r\nint cg=0, g2=3;\r\nvoid fn() {\r\n int c1=1, cl=2;\r\n [&c1] {\r\n c1=10; // ok\r\n g2=4; // ok, global\r\n cl=2; // compile-error undefined in block\r\n }();\r\n}\r\n\r\nint main() {\r\n fn();\r\n}\r\n```\r\nА еще можно писать содержимое box как отдельную функцию в cpp файле, эффект получится тот же.\r\n\r\n\r\n**ru.night.beast, 17 апреля 2017, 12:40**\r\nне понятно, printf в блоке не видна что-ли?\r\nзачем это может понадобиться?\r\n\r\n\r\n**Сергей Ковалёв, 25 августа 2017, 10:58**\r\nru.night.beast,\r\nзатем что в блоке может быть printf и ::printf например\r\n\r\n\r\n**dix75, 24 апреля 2017, 11:29**\r\nНу этот кусок кода идеально подходит под рефакторинг, выделение кода в отдельную функцию.\r\nВ общем предложение очень напоминает конструкцию let языка javascript, но там введение данной коснтрукции жизненно-необходимо.\r\n\r\n\r\n**Сергей Ковалёв, 19 июля 2017, 18:23**\r\nЭто может понадобиться когда lagacy рефакторишь\r\n\r\n\r\n**Сергей Ковалёв, 19 июля 2017, 18:28**\r\nИ еще бы добавил возможноть запрета перекрыти видимости локальных переменных\r\n```cpp\r\nint i; { int i; } // error i hides previous declaration\r\n```\r\nособенно для всяких вложенных циклов\r\n\r\n\r\n**yndx-antoshkka, 19 июля 2017, 18:48**\r\nСергей Ковалёв, так уже сейчас можно. Берёте современный компилятор и собираете с флагами -Wall -Werror", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805594110/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805595629", + "html_url": "https://github.com/cpp-ru/ideas/issues/181#issuecomment-805595629", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/181", + "id": 805595629, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTU5NTYyOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:10:54Z", + "updated_at": "2021-03-24T08:10:54Z", + "author_association": "MEMBER", + "body": "**Дмитрий, 19 апреля 2017, 11:09**\r\nВ С++17 последовательность выполнения выражения a.b.c.d чётко определена.\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf\r\nНапример, в ГЦЦ 7 это уже реализовано, переупорядочивания не происходит:\r\nhttps://wandbox.org/permlink/d6eu7UhfT3L6BDJ5\r\nДля сравнения, в ГЦЦ 6.3 вызовы переупорядочиваются так же, как в вашем примере:\r\nhttps://wandbox.org/permlink/qaNIQ5eEOGs7Xqpw", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805595629/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805596341", + "html_url": "https://github.com/cpp-ru/ideas/issues/182#issuecomment-805596341", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/182", + "id": 805596341, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTU5NjM0MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:12:11Z", + "updated_at": "2021-03-24T08:12:11Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 24 апреля 2017, 17:42**\r\nЕсть предложение на fp16 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0192r0.pdf\r\n\r\nОбсудили в Коне, людям понравилось, отправили в EWG.\r\n\r\nfloat128 на последнем собрании не обсуждали, но есть вот такое предложение http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3626.pdf . Если появится кто-nо, кто напишет прототип наподобие прототипа из https://stdcpp.ru/proposals/531b7d66-037b-48b7-8262-eb9c0c1f7535 но для floating-point, то с радостью помогу с написанием proposal.\r\n\r\n\r\n**yndx-antoshkka, 13 ноября 2017, 12:55**\r\nshort float обсуждали в Альбукерке, отправили на доработку - хочется чтобы short float работал на экзотических платформах, где в байте не 8 бит.\r\n\r\n\r\n**Матвей Корнилов, 27 марта 2018, 12:47**\r\nНе следует ли добавить поддержку чисел четверной точности сначала в язык C, а затем унаследовать её оттуда? Не получится ли иначе, что мы будем в конечном счете иметь в C и C++ две различные реализации чисел четверной точности. Не вызовет ли это потом какие-то неожиданные проблемы для людей которые захотят линковать свой код на C++ с чужими библиотеками на C, которые оба используют в четверной точности?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805596341/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805597052", + "html_url": "https://github.com/cpp-ru/ideas/issues/183#issuecomment-805597052", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/183", + "id": 805597052, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTU5NzA1Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:13:30Z", + "updated_at": "2021-03-24T08:13:30Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 24 апреля 2017, 17:37**\r\nПосмотрите пожалуйста предложение http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3611.html\r\n\r\nЭто решение вас устроит? Есть ли в нём какие-либо недочёты?\r\n\r\n\r\n**mezastel, 21 мая 2017, 10:59**\r\nyndx-antoshkka, нет, это совсем другое. я не хочу класс rational (дробь), я хочу fixed-point типы. это абсолютно разные вещи. rational приведен только в качестве примера.\r\n\r\n\r\n**mezastel, 21 мая 2017, 11:00**\r\nВот более релевантный пропозл http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3352.html", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805597052/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805598108", + "html_url": "https://github.com/cpp-ru/ideas/issues/184#issuecomment-805598108", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/184", + "id": 805598108, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTU5ODEwOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:15:23Z", + "updated_at": "2021-03-24T08:15:23Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 25 апреля 2017, 12:59**\r\nНа подобную тему был комментарий от России к C++17. В комментарии было требование, чтобы все type_triat проверяли тип на \"завершённость\" (если обратное не оговорено заранее:\r\n\r\n\"Failed prerequirement for the type trait must result in ill-formed program. Otherwise hard detectable errors will happen\"\r\n\r\nЭто будет исправлено в ближайшее время, и почти все type_trait будут внутри иметь static_assert(complete). Можно будет ассертить на полноту например вот так:\r\n```cpp\r\ntemplate\r\nconstexpr void assert_complete() {\r\n (void)std::is_pod_v;\r\n}\r\n```\r\n\r\n\r\nСделать именно type_trait std::is_complete_v a не assert - невозможно, т.к. такой type_trait будет нарушать ODR и будет \"запоминать\" первый результат применения для типа T и всегда выдавать его.\r\n\r\n\r\n**ru.night.beast, 27 апреля 2017, 9:16**\r\nне знаю, насколько соответствует стандарту, но на gcc работает.\r\nтолько вот строить логику на завершенности типа имхо не правильно.\r\n```cpp\r\ntypedef int yes_type;\r\ntypedef char no_type;\r\n\r\ntemplate \r\nconstexpr std::enable_if_t is_complete_impl(T*);\r\n\r\nconstexpr no_type is_complete_impl(...);\r\n\r\ntemplate \r\nconstexpr inline bool is_complete () { return sizeof(yes_type) == sizeof(is_complete_impl((T*)0)); }\r\n\r\nstruct Test;\r\nconstexpr bool e1 = is_complete<__LINE__,Test>();\r\n\r\nstruct Test {};\r\nconstexpr bool e2 = is_complete<__LINE__,Test>();\r\n\r\nint main()\r\n{\r\n static_assert(e1 == false, \"\");\r\n static_assert(e2 == true, \"\");\r\n}\r\n```\r\n\r\n\r\n**yndx-antoshkka, 27 апреля 2017, 17:28**\r\nru.night.beast,\r\n\r\nВ треде http://boost.2283326.n4.nabble.com/type-traits-is-complete-lt-T-gt-possible-realization-tc4638134.html John Maddock приводит пример, где подобный трейт приведёт к ODR:\r\n```cpp\r\n// Begin Translation Unit A\r\nstruct foo;\r\n\r\ntemplate< class T >\r\nstruct your_code\r\n{\r\n // Do something valid when the type is incomplete\r\n};\r\n// End Tranlation Unit A\r\n\r\n// Begin Translation Unit B\r\nstruct foo {};\r\n\r\ntemplate< class T >\r\nstruct your_code\r\n{\r\n // Do something valid when the type is complete\r\n};\r\n// End Tranlation Unit B\r\n\r\n//////////\r\n```\r\n\r\nТак что реализация, которая не добавляет проблем, это только assert_complete(). Добавление именно трейта будет очень неявно и трудноуловимо ломать код.\r\n\r\n\r\n**ru.night.beast, 27 апреля 2017, 17:53**\r\nyndx-antoshkka, кстати насчет трудноуловимости. какие-нибудь варнинги при линковке на нарушение ОДР не планируют добавить?\r\n\r\n\r\n**Александр, 27 апреля 2017, 19:43**\r\nyndx-antoshkka, в принципе, мне и одних assert'ов хватит.\r\n\r\n\r\n**yndx-antoshkka, 21 октября 2019, 19:09**\r\nВ C++20 утвердили что стандартная библиотека может использовать static_assert для подобных проверок.\r\n\r\nВ GCC реализовал часть проверок https://github.com/gcc-mirror/gcc/commit/c12402f67d3ac10feaa92bf92f242ec25b6ea11f . Работа по доработке стандартных библиотек ещё не закончена, но с точки зрения стандарта делать больше чечего.\r\n\r\nАналогичная проблема наблюдается с концептами (на данный момент их можно вызывать для incomplete типов). Закинул коментарием от страны, чтобы программа считалась ill-formed если проверка концепта проваливается из-за того, что тип incomplete.\r\n\r\n* Note: эта вещь не на 100% сделана в РГ21. Наши замечания и правки не прошли в том виде, что мы предлагали. Но идеей заинтересовался Walter E. Brown, приложил огромное количество усилий, и именно его текст попал в стандарт.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805598108/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805599063", + "html_url": "https://github.com/cpp-ru/ideas/issues/185#issuecomment-805599063", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/185", + "id": 805599063, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTU5OTA2Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:17:01Z", + "updated_at": "2021-03-24T08:17:01Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 3 мая 2017, 0:03**\r\nОчень подробное и интересное обсуждение подобного здесь: https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/uu7mRNXnf8Q\r\nИз любопытного: \"=>\" может встречаться в C++, поэтому нежелательно добавление такого токена.\r\n\r\n\r\n**WPMGPRoSToTeMa, 7 октября 2017, 23:57**\r\nAndrey Davydov, можно пример такого кода? Вроде же нет такого оператора.\r\n\r\n\r\n**Andrey Davydov, 8 октября 2017, 0:15**\r\nWPMGPRoSToTeMa, foo<&X::operator =>\r\n\r\n\r\n**WPMGPRoSToTeMa, 8 октября 2017, 0:19**\r\nAndrey Davydov, всё понял, спасибо, из-за слитного написания не сразу понял, что это параметр шаблона. Так чуть попроще понять: foo< &X::operator= >.\r\n\r\n\r\n**Antervis, 3 мая 2017, 8:39**\r\nПо факту, в лямбде самое широкое место - слово return. Печатать что \"{}\", что \"=>\" - по два символа. Для тривиальных случаев есть функциональные объекты, например, std::less<>", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805599063/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805600047", + "html_url": "https://github.com/cpp-ru/ideas/issues/186#issuecomment-805600047", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/186", + "id": 805600047, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYwMDA0Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:18:45Z", + "updated_at": "2021-03-24T08:18:45Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 мая 2017, 12:03**\r\nНе надо навинчивать дополнительный функционал на std::ios_base - комитет на это никогда не согласится и это гарантировано поломает ABI.\r\n\r\nЛучше попробуйте сформулировать вашу идею в виде новых функций/классов для стандартной библиотеки.\r\n\r\n\r\n**Сергей Садовников, 10 мая 2017, 12:54**\r\nВ таком виде предложение выглядит каким-то странным. ios_base не занимается сериализацией данных и (вроде) по задумке не должна. Блобы на входе, блобы на выходе, а что это за блобы - решает клиент.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805600047/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805600842", + "html_url": "https://github.com/cpp-ru/ideas/issues/186#issuecomment-805600842", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/186", + "id": 805600842, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYwMDg0Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:20:04Z", + "updated_at": "2021-03-24T08:20:04Z", + "author_association": "MEMBER", + "body": "Стоит посмотреть на библиотеку Boost.Endian https://www.boost.org/doc/libs/1_75_0/libs/endian/doc/html/endian.html и добавить основной её функционал в стандарт ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805600842/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805601707", + "html_url": "https://github.com/cpp-ru/ideas/issues/187#issuecomment-805601707", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/187", + "id": 805601707, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYwMTcwNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:21:34Z", + "updated_at": "2021-03-24T08:21:34Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 16 мая 2017, 14:34**\r\nСинтаксис такой делать не стоит, т.к. он уже используется для того чтобы убрать предупреждение при игнорировании результата вызова функции с [[nodiscard]].\r\n\r\nРабота в этом направлении международным комитетом уже ведётся, различные варианты решения уже обсуждаются. Пока к единому синтаксису не пришли.\r\n\r\n\r\n**dix75, 23 мая 2017, 11:37**\r\nyndx-antoshkka,\r\nКак обычно, решение данного вопроса может занять продолжительное время.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805601707/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805602444", + "html_url": "https://github.com/cpp-ru/ideas/issues/188#issuecomment-805602444", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/188", + "id": 805602444, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYwMjQ0NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:22:51Z", + "updated_at": "2021-03-24T08:22:51Z", + "author_association": "MEMBER", + "body": "**dix75, 23 мая 2017, 11:42**\r\nКак всегда, лучшем решением в данной ситуация является собственная инициаоизирующая функция", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805602444/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805603081", + "html_url": "https://github.com/cpp-ru/ideas/issues/188#issuecomment-805603081", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/188", + "id": 805603081, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYwMzA4MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:24:04Z", + "updated_at": "2021-03-24T08:24:04Z", + "author_association": "MEMBER", + "body": "Подобное предложение рассматривали несколько раз и оно проваливало голосования\r\n\r\nНужна какая-то очень убедительная информация, чтобы предожение прошло международное голосование", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805603081/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805603975", + "html_url": "https://github.com/cpp-ru/ideas/issues/189#issuecomment-805603975", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/189", + "id": 805603975, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYwMzk3NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:25:43Z", + "updated_at": "2021-03-24T08:25:43Z", + "author_association": "MEMBER", + "body": "**danich, 18 мая 2017, 16:40**\r\nНевнимательно написал пост.\r\n\r\nВ Стандартах кодирования на c++ версия такая:\r\n```cpp\r\nusing namespace boost::lambda;\r\nstd::vector::iterator i = find_if( v.begin(), v.end(), _1 > x && _1 < y);\r\n```\r\n\r\nСейчас поддерживается только такая:\r\n```cpp\r\nstd::vector::iterator i = find_if( v.begin(), v.end(), [=](int a) { return a > x && a < y; });\r\n```\r\n\r\n\r\n**yndx-antoshkka, 18 мая 2017, 17:44**\r\nshalak.dan, лямбды вида \"_1 > x && _1 < y\" поломают пользовательский код (например код с boost::lambda который с вы привели в начале).\r\n\r\nНужен синтаксис, который ничего не сломает, иначе в стандарт С++ не примут.\r\n\r\n\r\n**ru.night.beast, 18 мая 2017, 19:40**\r\nyndx-antoshkka, $1 ну или arg[1] который делает некое магическое lambdaexpr\r\n\r\n\r\n**danich, 22 мая 2017, 11:06**\r\nyndx-antoshkka, а можете пояснить что именно будет сломано, я не понял?\r\n\r\n\r\n**yndx-antoshkka, 22 мая 2017, 12:41**\r\nshalak.dan, вместо 'boost::lambda::_1' будет использоваться ключевое слово '_1'. Все библиотеки, где используется _1 могут потенциально поломаться (Boost.Bind, Boost.Phoenix и т.д.).\r\n\r\nМожно пойти путём библиотеки Boost.Lambda и добавить функциональности для std::_1. То есть воплотить ваше предложение на уровне библиотеки, а не языка.\r\n\r\nНо тогда мы получим все недостатки Boost.Lambda: нечитаемые сообщения об ошибках, сложно-обнаружимые проблемы, плохая интеграция со сторонними библиотеками... Мне не кажется что международный комитет захочет в ближайшее время заниматься подобным предложением, т.к. оно очень ресурсозатратно а в приоритетах сейчас Ranges, Networking и Concurrency.\r\n\r\n\r\n**danich, 22 мая 2017, 15:56**\r\nyndx-antoshkka, да, скорее всего вы правы.\r\n\r\n\r\n**Михаил Мальцев, 18 мая 2017, 20:43**\r\nНа эту тему есть предложение http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0573r0.html\r\n\r\n\r\n**Antervis, 19 мая 2017, 9:38**\r\nа что мешает сделать implicit auto для аргументов лямбда-функций по аналогии с implicit auto для захвата? аля auto func = [](x,&y) { y = x; };\r\n\r\n\r\n**danich, 22 мая 2017, 11:05**\r\nAntervis, ничего не мешает, просто увидел подобную запись в книжке и мне она показалась достаточно изящной.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805603975/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805605141", + "html_url": "https://github.com/cpp-ru/ideas/issues/190#issuecomment-805605141", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/190", + "id": 805605141, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYwNTE0MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:27:55Z", + "updated_at": "2021-03-24T08:27:55Z", + "author_association": "MEMBER", + "body": "**Михаил Мальцев, 24 мая 2017, 14:58**\r\nУже есть proposal: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0329r0.pdf\r\n\r\n\r\n**dix75, 30 мая 2017, 12:36**\r\nМихаил Мальцев,\r\nДа, и уже не раз обсуждалось, хотя и противников не мало.\r\n\r\n\r\n**zamazan4ik@tut.by, 5 июня 2017, 16:00**\r\ndix75, а не могли бы Вы подсказать, какая аргументация у противников данного предложения?\r\n\r\n\r\n**yndx-antoshkka, 7 июня 2017, 16:34**\r\nzamazan4ik@tut.by, аргументации против нет. Сейчас предложение крутится в CWG на утверждении формального текста.\r\n\r\nВ С++20 скорее всего будет.\r\n\r\n\r\n**Andrey Davydov, 8 июня 2017, 10:44**\r\nzamazan4ik@tut.by, Я вижу 2 сценария контръинтуитивного поведения этой фичи.\r\n--------------------------\r\nВо-первых, это не полностью инициализированный объект (я приводил это пример в комментарии здесь: stdcpp.ru/proposals/d92fe021-6af5-46bd-a520-9ef008cfd2dc) Давайте рассмотрим следующую ситуацию:\r\n```cpp\r\nstruct X\r\n{\r\n int a, b;\r\n};\r\n\r\nX x0; // x0.a, x0.b are not initialized\r\nX x1 { 1, 2 }; // x1.a, x1.b are initialized\r\nX x2 {}; // x2.a, x2.b are zero initialized\r\nX x3 { .a = 5 }; // x3.a is initialized, x3.b is not initialized (C99)\r\n```\r\nМне не нравится, что x3.b не будет инициализировано, в то время как поля x2 будут.\r\n--------------------------\r\nВо-вторых, порядок вычисления инициализаторов (по мотивам stackoverflow.com/questions/18731707/why-does-c11-not-support-designated-initializer-list-as-c99/29337570?noredirect=1#comment46864214_29337570):\r\n```cpp\r\nstruct Point\r\n{\r\n double lat, lon;\r\n};\r\n\r\ndouble f();\r\ndouble g();\r\n\r\nPoint p1 = { f(), g() }; // вызывается f потом g\r\nPoint p2 = { .lon = g(), .lat = f() }; // в С99 будет вызываться g а потом f, а как предлагается в C++?\r\n```\r\n\r\n**yndx-antoshkka, 8 июня 2017, 11:51**\r\nAndrey Davydov,\r\nСобственно черновик предложения: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0329r1.pdf\r\n\r\nИз него следует, что в первом случае X x3 { .a = 5 }; .b будет проинициализировано 0 (как и в случае с aggregate initialization).\r\n\r\nВторой пример не соберётся, т.к. имена полей должны идти в том же порядке, что и при объявлении.\r\n\r\nТак что пока выглядит весьма предсказуемо, но не так функционально как хотелось бы.\r\n\r\n\r\n**Andrey Davydov, 8 июня 2017, 12:53**\r\nyndx-antoshkka,\r\n\r\n> Собственно черновик предложения: open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0329r1.pdf\r\nСпасибо за пояснение, я весь proposal читать поленился.\r\n> Из него следует, что в первом случае X x3 { .a = 5 }; .b будет проинициализировано 0 (как и в случае с aggregate initialization).\r\nЛогично с точки зрения C++ но отличается от C. Это ведь проблема(?)\r\n> Второй пример не соберётся, т.к. имена полей должны идти в том же порядке, что и при объявлении.\r\n>\r\n> Так что пока выглядит весьма предсказуемо, но не так функционально как хотелось бы.\r\n\r\nЭто урезает \"половину полезности\" designated initializers. Читать такой код\r\n```cpp\r\nPoint p = { .lat = f(), .lon = g(), };\r\n```\r\nприятнее, чем такой\r\n```cpp\r\nPoint p = { f(), g() };\r\n```\r\nно при написании все равно приходится помнить, что lat объявлено раньше lon.\r\n\r\n\r\n**yndx-antoshkka, 13 ноября 2017, 12:53**\r\nПредложение приняли, будет в C++20", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805605141/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805606207", + "html_url": "https://github.com/cpp-ru/ideas/issues/191#issuecomment-805606207", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/191", + "id": 805606207, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYwNjIwNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:29:59Z", + "updated_at": "2021-03-24T08:29:59Z", + "author_association": "MEMBER", + "body": "**dix75, 7 июня 2017, 16:48**\r\nЯ немного поспешил, добавив std::sin и std::сos (жаль что подправить нельзя).\r\nТакже в список можно добавить\r\n```cpp\r\nstd::ilogb\r\nstd::signbit\r\n```\r\n\r\n**Клеванец Игорь, 7 июня 2017, 17:11**\r\nХорошая мысль\r\nХотим оформить математические функции отдельным предложением\r\n\r\n\r\n**eabesea, 7 июня 2017, 17:48**\r\nПо хорошему все или большая часть функций над int должны работать над wide_int", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805606207/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805607506", + "html_url": "https://github.com/cpp-ru/ideas/issues/192#issuecomment-805607506", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/192", + "id": 805607506, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYwNzUwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:32:11Z", + "updated_at": "2021-03-24T08:32:11Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 8 июня 2017, 12:13**\r\nКомитет уходит от std::bind по возможности, так как с ним есть большие нерешаемые проблемы в случае если используются placeholder.\r\n\r\nВаш пример работает и хорошо себя показывает из-за того, что сигнатура функции void() (как и в случае с std::thread который делает bind).\r\n\r\nЕсли сигнатура будет void(string&&, string&&), то вызов std::function(foo, _1, _1) приведёт к ошибке на рантайме. Получается, что все болезни std::bind перенесутся на std::function и в итоге станет хуже.\r\n\r\n\r\n**dix75, 8 июня 2017, 18:16**\r\nyndx-antoshkka, Уходит?\r\nа что в замен?\r\n\r\n\r\n**yndx-antoshkka, 9 июня 2017, 10:11**\r\ndix75, generic lambda\r\n\r\n\r\n**Antervis, 9 июня 2017, 11:59**\r\nyndx-antoshkka, ваш пример и в виде лямбды некошерен:\r\n```cpp\r\n[](string &&s) { return foo(std::move(s), std::move(s)); }\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805607506/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805608155", + "html_url": "https://github.com/cpp-ru/ideas/issues/193#issuecomment-805608155", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/193", + "id": 805608155, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYwODE1NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:33:18Z", + "updated_at": "2021-03-24T08:33:18Z", + "author_association": "MEMBER", + "body": "**Павел, 13 июня 2017, 17:59**\r\nкак это будет взаимодействовать с std::filesystem? не проще ли дописать перегрузки уже существующих функций, чем городить отдельный интерфейс?\r\nможно сделать аналог POSIX: есть две функции, одна из которых принимает путь, а другая -- дескриптор.\r\n\r\n\r\n**Арсений Смалюк, 13 июня 2017, 18:24**\r\nВ всех методах и классах std::filesystem, которым достаточно дескриптора, вместе с std::path принимать std::file\r\n\"можно сделать аналог POSIX: есть две функции, одна из которых принимает путь, а другая -- дескриптор.\" - это я и предлагаю.\r\n\r\n\r\n**yndx-antoshkka, 14 июня 2017, 12:43**\r\nИдея очень хорошая, но требует большой проработки!\r\n\r\nМногие ОС используют один тип дескриптора для сокетов/файлов/pipes/памяти/ioctrl - стоит покрыть как можно больший функционал; многие системные вещи уже в С++ обёртках, из которых иногда можно получать низкоуровневые дескрипторы - надо продумать взаимодействия; ОС различаются по функционалу - надо понять как эмулировать недостающий функционал на ОС если его нет и т.д.\r\n\r\nНадо продумать как всё должно работать и взаимодействовать друг с другом на разных платформах. Короче говоря - нужен минимальный прототип\r\n\r\n\r\n**Арсений Смалюк, 14 июня 2017, 17:00**\r\nyndx-antoshkka,\r\n\"многие системные вещи уже в С++ обёртках, из которых иногда можно получать низкоуровневые дескрипторы\" - это какие, например? Ничего не могу придумать, кроме std::filesystem и fstream.\r\n\"из которых иногда можно получать низкоуровневые дескрипторы\" - а нужно ли? Если получить fd из fstream, а потом его закрыть, то будет неработающий fstream. В каких случаях может понадобиться получить дескриптор, который уже используется кем-то?\r\n\"Многие ОС используют один тип дескриптора для сокетов/файлов/pipes/памяти/ioctrl\" - вроде не должно быть проблем, fstream не очень важно, с каким типом дескриптора работать. Можно создать функции для \"сырой\" работы с дескриптором (write, read, ioctl, seek), которые будут принимать std::file\r\n\r\n\r\n**yndx-antoshkka, 14 июня 2017, 17:52**\r\nАрсений Смалюк, ок. Нужен прототип\r\n\r\n\r\n**Павел, 14 июня 2017, 20:01**\r\nАрсений Смалюк, низкоуровневые дескрипторы зачем-то кому-то нужны. из std::thread можно вытащить native_handle(), а умные указатели содержат метод get(). Не стоит лишать возможности получить сырую ручку. Это бывает, например, полезно при поддержании legacy.\r\n\"Если получить fd из fstream, а потом его закрыть, то будет неработающий fstream\" -- да, так и надо. Ни один разумный человек так делать не должен, но это должно быть возможным.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805608155/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805609359", + "html_url": "https://github.com/cpp-ru/ideas/issues/194#issuecomment-805609359", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/194", + "id": 805609359, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYwOTM1OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:35:11Z", + "updated_at": "2021-03-24T08:35:11Z", + "author_association": "MEMBER", + "body": "**Павел, 18 июня 2017, 18:32**\r\nпочему это нельзя сделать с помощью шаблонного тега. зачем нужен спецификатор `abi(...)` в сигнатуре функции?\r\nеще мне непонятно, как всё-таки будет выявляться нужная перегрузка в `std::transform(unseq, b, b+N, c, a, mul);`\r\n\r\n\r\n**Сергей Прейс, 19 июня 2017, 7:24**\r\nза ABI отвечает компилятор. Он отвечает и за корректное порождение кода в соответствии с ABI и за корректное оформление вызова. Шаблонные теги прямо сейчас не предполагают смены ABI - все инстанциации шаблона имеют один и тот же ABI и я уверен, что менять это поведение неправильно. Нужная перегрузка будет выявляться компилятором: он увидит, что специализация алгоритма для конкретной политики требует вызова со специфическим ABI и подставит нужный вызов.\r\n\r\n\r\n**ru.night.beast, 19 июня 2017, 9:39**\r\nесли и делать, то через атрибуты [[...]]\r\nи без перегрузки.\r\n\r\n\r\n**Сергей Прейс, 19 июня 2017, 13:53**\r\nru.night.beast, атрибуты (по крайней мере сейчас) не являются обязательными (их допустимо игнорировать) и потому менять через них ABI не получится. Кроме того, атрибуты - это как раз не часть типа и именно то, что теряется в std::function, std::bind и просто при взятии адреса. По сути все существующие реализации и пытаются обойтись атрибутами и их аналогами, но как результат для них недоступна существенная часть возможностей современного C++.\r\nВ частности, начиная с версии 17.0 в компиляторе Intel доступны указатели на SIMD-функции (в синтаксисе OpenMP), но доступны они только в C. Есть специальная оговорка для C++ связанная именно с выводом типов: указатели на такие функции не совместимы с обычными, а \"необычность\" легко теряется.\r\nВ с++amp Microsoft делает попытку сделать restrict() частью системы типов, но std::bind даже в их собственной реализации работать не будет - restrict() просто не будет захвачен при деконструции типа. Ну и вопрос с указателями до конца не решен - описать их вроде как можно, но работать будут только для случая restruct(cpu) то есть когда они просто совпадают с обычными.\r\n\r\n\r\n**ru.night.beast, 19 июня 2017, 14:39**\r\nСергей Прейс, сейчас есть возможность для функций указывать CC (cdecl, thiscall, etc)\r\nзачем изобретать еще дополнительный способ?\r\n\r\n\r\n**Сергей Прейс, 19 июня 2017, 16:14**\r\nru.night.beast, Во-первых СС не часть С++. Во-вторых многие из них делают по сути из C++ функций C-функции. То есть напрочь убивают перегрузку, я уж молчу про std::function и std::bind.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805609359/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805610393", + "html_url": "https://github.com/cpp-ru/ideas/issues/195#issuecomment-805610393", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/195", + "id": 805610393, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYxMDM5Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:36:49Z", + "updated_at": "2021-03-24T08:36:49Z", + "author_association": "MEMBER", + "body": "**ru.night.beast, 16 июня 2017, 15:16**\r\nНадо ждать концепты. Там что-то похожее было.\r\n\r\n\r\n**d-yaroshev, 18 июня 2017, 3:49**\r\nПоясню про \"что-то похожее\". auto - самый базовый concept. Соответственно, если можно будет написать любой concept в качестве параметра, можно написать и auto.\r\n\r\n\r\n**yndx-antoshkka, 19 июня 2017, 12:58**\r\nНечто подобное обсуждается при разговорах о Conxepts. К чему люди в комитете придут - пока непонятно. Ну а до тех пор, можно использовать подобный хак из Boost.Hana:\r\n```cpp\r\nconstexpr auto sqrt = [](const auto& v) { return v*v; };\r\n```\r\n\r\n**smertigdon, 19 июня 2017, 20:24**\r\nyndx-antoshkka, а почему хак из Hana? Обычная полиморфная лямбда\r\n\r\n\r\n**Дмитрий, 20 июня 2017, 15:34**\r\nГЦЦ, кстати, уже давным-давно такое умеет:\r\nhttps://godbolt.org/g/47ft85", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805610393/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805610936", + "html_url": "https://github.com/cpp-ru/ideas/issues/195#issuecomment-805610936", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/195", + "id": 805610936, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYxMDkzNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:37:49Z", + "updated_at": "2021-03-24T08:37:49Z", + "author_association": "MEMBER", + "body": "C++20 разрешил подобный синтакс https://en.cppreference.com/w/cpp/language/function_template#Abbreviated_function_template", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805610936/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805612125", + "html_url": "https://github.com/cpp-ru/ideas/issues/196#issuecomment-805612125", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/196", + "id": 805612125, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYxMjEyNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:39:56Z", + "updated_at": "2021-03-24T08:39:56Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 19 июня 2017, 12:51**\r\nНечто подобное предложили добавить в стандартную библиотеку и к С++20 оно скорее всего уже окажется в стандарте: http://en.cppreference.com/w/cpp/experimental/propagate_const\r\n\r\nВместо `E *_elements;` надо будет написать `std::propogate_const_elements;` и готово :)\r\nНо оба метода всё равно придётся написать (однако, получить неконстантную ссылку из константного метода уже не получится):\r\n```cpp\r\nE& operator[](size_t i) const { return _elements[i]; } // compile time error\r\n```\r\n\r\n**Сергей Тиунов, 19 июня 2017, 17:17**\r\nyndx-antoshkka, Хорошее предложение :) не хватает только operator[] (по крайней мере на cppreference)\r\n\r\n\r\n**ru.night.beast, 19 июня 2017, 15:17**\r\nна rsdn было более общее предложение:\r\nhttp://rsdn.org/forum/cpp/4541793.1\r\n\r\n\r\n**Сергей Тиунов, 19 июня 2017, 17:13**\r\nru.night.beast, правильно я понял, что преимущество в том, что можно сделать возвращаемый тип зависимым от константности?\r\n\r\n\r\n**ru.night.beast, 19 июня 2017, 19:34**\r\nСергей Тиунов, не только возвращаемый, но и параметры.\r\nвсе обсуждение (rsdn.org/forum/cpp/4541793) глянь, там и другие примеры были.\r\nно насколько я понял, Николай это предложение в комитете не предлагал.\r\nможно уточнить, если интересно.\r\n\r\n\r\n**smertigdon, 19 июня 2017, 20:40**\r\nБыло похожее: https://stdcpp.ru/proposals/b41bac7b-f618-4ae0-b0fa-c3744ba26b9b\r\nВ комментарии был предложен вариант, который мне лично очень нравится, но нужно мнение опытных людей - ввести операторы const(bool) и volatile(bool), позволив писать:\r\n\r\ntemplate \r\nconst(constness) E& operator[](size_t i) const(constness) { return _elements[i]; }\r\n\r\n\r\n**Antervis, 23 июня 2017, 6:38**\r\nE& operator[](size_t i) const { return _elements; } - нелегальная конструкция, мутабельную ссылку можно получить только через const_cast\r\n\r\n\r\n**Сергей Тиунов, 25 июня 2017, 18:22**\r\nAntervis, Вы не правы, это совершенно легальная конструкция в С++.\r\nПосмотрите, например, сюда: http://cpp.sh/2j2o\r\nКод компилируется и выполняется.\r\n\r\n\r\n**zamazan4ik@tut.by, 27 июня 2017, 15:20**\r\nСергей Тиунов, А я на godbolt и ideone проверил - и ничего не собирается (и не должно как бы). http://ideone.com/CfXuhn\r\n\r\n\r\n**Сергей Тиунов, 28 июня 2017, 6:26**\r\nzamazan4ik@tut.by, Antervis,\r\n\r\nГоспода, перечитайте, пожалуйста, еще раз внимательнее основной текст предложения.\r\nВ нем речь о распространении const на элементы, на которые указывает указатель. В Ваших примерах нет членов-указателей, поэтому они (примеры) не имеют отношения к поставленной проблеме.\r\n\r\n\r\n**Andrey Davydov, 15 ноября 2017, 13:43**\r\nОчень похожая идея: https://github.com/atomgalaxy/isocpp-template-this/blob/master/template-this.pdf", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805612125/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805613575", + "html_url": "https://github.com/cpp-ru/ideas/issues/196#issuecomment-805613575", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/196", + "id": 805613575, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYxMzU3NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:42:23Z", + "updated_at": "2021-03-24T08:42:23Z", + "author_association": "MEMBER", + "body": "Аналогичное предложение: #148", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805613575/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805615073", + "html_url": "https://github.com/cpp-ru/ideas/issues/197#issuecomment-805615073", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/197", + "id": 805615073, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYxNTA3Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:45:02Z", + "updated_at": "2021-03-24T08:45:02Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 19 июня 2017, 13:48**\r\nПоследний черновик предложения по по Ranges http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4651.pdf\r\n\r\nПока я не понимаю, зачем ослаблять требования SemiRegular. SemiRegular для vector - слишком сильное ограничение. Основные требования к типу T для вектора должны быть наподобие (Movable && is_nothrow_constructible_v) || Assignable. Остальные ограничения должны накладываться на конкретный метод класса vector. Подскажите, что я упустил?\r\n\r\n\r\n**d-yaroshev, 19 июня 2017, 17:38**\r\nyndx-antoshkka, movable, nothrow_constructbile итд - это не concept. Точнее это плохой concept.\r\n\r\nОдна из идей concepts в том чтобы описывать группу требований к типам для группы алгоритмов, причем требования к типам должны быть связаны.\r\n\r\nЕсли тип CopyConstructible он должен быть CopyAssignable, MoveConstructibe и MoveAssignable.\r\n\r\nВот такой тип, например:\r\n```\r\nstruct awful_type {\r\nawful_type(const awful_type&) = default;\r\nawful_type& operator=(const awful_type&) = default;\r\nawful_type(awful_type&&) = delete;\r\nawful_type& operator=(awful_type&&) = delete;\r\n};\r\n```\r\nНе должен проходить проверку при вызове алгоритмов, потому что\r\nа) - этот тип скорее всего имеет что-то очень странное в виду под операциями копирования/присваивания и мы не знаем как с этим странным работать\r\nб) - ограничивает нашу возможность по разному реализовывать алгоритмы, например\r\n```cpp\r\nT x = y;\r\n```\r\nи\r\n```cpp\r\nT x = T(y);\r\n```\r\nСтановятся разными вещами.\r\n\r\nЭто одна из основных вещей, которые мы пытаемся избежать с concepts, а именно - облегчить написание generic кода.\r\n\r\nПо факту мое предложение заключается в том, что все алгоритмы/контейнеры должны требовать некоторый общий concept, который подразумевает разумность операций.\r\nИногда некоторые из этих операций невозможно/очень сложно определить, такое бывает, но если мы определяем операцию, она должна нести вполне определенную семантику за собой.\r\n\r\nЯ предложил расширить SemiRegular, потому что ровно это SemiRegular сейчас и делает, только для операции operator==. Однако SemiRegular могло бы быть хорошим именем в целом, для любой операции которой нет.\r\n\r\n\r\n**yndx-antoshkka, 20 июня 2017, 12:49**\r\nd-yaroshev, ок. Давайте рассмотрим картину в целом:\r\n1) Никто не даст ломать стандартные контейнеры. И если сейчас они работают с move-only type или с copy_constructible only типами, или еще с какой-то экзотикой - то так это и останется. Более того, некоторые контейнеры могут инстанцироваться ForwardDeclared типами. Так что концепт SemiRegular для типа T при инстанцировании контейнера сразу и не применишь.\r\n2) В данный момент в комитете старательно отделяют compile-time требования к типам контейнеров от всего остального, чтобы проще было прикрепить концепты к контейнерам. И прикреплять будут \"плохие\" концепты, так как нет выбора (см пункт 1)\r\n3) Если вы действительно заинтересованы в контейнерах на правильных концептах, то одной идеи Semiregular концепта будет мало. Нужно как и в случае с ranges, продумать ВСЁ целиком:\r\n* добавить функционал к имеющимся контейнерам, да такой, чтобы все захотели этим пользоваться\r\n* попутно, желательно, решить существующие проблемы контейнеров\r\n* тщательно продумать ВСЕ концепты\r\n* написать работающий прототип для ВСЕХ контейнеров\r\n* показать, почему такой подход лучше\r\n* написать proposal\r\n\r\nС последней частью я могу помочь, но 4/5 работы по остальным пунктам придётся делать вам.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805615073/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805617481", + "html_url": "https://github.com/cpp-ru/ideas/issues/198#issuecomment-805617481", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/198", + "id": 805617481, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTYxNzQ4MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T08:49:17Z", + "updated_at": "2021-03-24T08:50:41Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 20 июня 2017, 12:54**\r\nСуществующее положение вещей никто не даст менять. Ваш подход поломает следующий код:\r\n```cpp\r\nstruct A {\r\n void foo() const { cerr << \"const\"; }\r\n void foo() { cerr << \"non const\"; }\r\n};\r\n\r\nstruct B {\r\n const A a;\r\n B() {\r\n a.foo(); // now calls non-const version\r\n }\r\n};\r\n```\r\nОднако сама идея мне нравится. Её надо как следует продумать и придумать такое решение, которое не поломает существующий код и будет красиво выглядеть.\r\n\r\n\r\n**Сергей Тиунов, 22 июня 2017, 19:06**\r\nyndx-antoshkka,\r\n\r\nЧто скажете насчет такого решения...\r\nМожно сделать \"отложенную инициализацию\" member-констант и ссылок.\r\nВ конструкторе мы можем написать такой код:\r\n```cpp\r\n_const = TypeName(args...); // user-defined types\r\n_const = literal; // literal types\r\n```\r\nЕсли в конструкторе встречается строка такого вида, это означает, что мы откладываем инициализацию этого члена до этого момента. Использование этой константы до этого момента либо запрещено, либо undefined behaviour (как лучше?). Использование константы после этого момента - как обычное использование member-константы.\r\n\r\nЕсли же в конструкторе не встречается строка такого вида (т.е. любой старый код), то member-константа будет инициализирована до тела конструктора.\r\n\r\nАналогично со ссылками:\r\n```cpp\r\n&_ref = value;\r\n```\r\nЭто выражение будет считаться \"отложенной инициализацией\" ссылки, до которой ее вызов приведет к UB, а после - как обычная ссылка.\r\n\r\n\r\n**yndx-antoshkka, 22 июня 2017, 19:25**\r\nСергей Тиунов, напишите пожалуйста пример целиком. А то непонятно где писать предложенные вами конструкции.\r\n\r\n\r\n**Сергей Тиунов, 22 июня 2017, 19:55**\r\nyndx-antoshkka, Как-то так:\r\n```cpp\r\nclass MyClass : public MyBase {\r\npublic:\r\n MyClass(A a): MyBase(a), _d(42) {\r\n _d.baz(); // okay, _d initialized in member initialization list\r\n\r\n _с.foo(); // undefined behaviour, _c not initialized\r\n &_c = getC(a); // deferred initialization of _c\r\n _c.foo(); // okay, _c initialized\r\n\r\n _b.bar(); // undefined behaviour, _b not initialized\r\n _b = getB(_c); // deferred initialization of _b\r\n _b.bar(); // okay, _b initialized, calls const-version\r\n }\r\n \r\nprivate:\r\n const B _b;\r\n C& _c;\r\n const D _d;\r\n};\r\n```\r\n\r\n**Павел, 22 июня 2017, 23:45**\r\nСергей Тиунов, это ломает всё, что использует перегруженный оператор=. Как компилятор поймёт, что автор имел в виду: инициализировать переменную конструктором по умолчанию, а потом применить оператор=, или оператор= есть инициализация, а все использования переменной до него -- ошибки?\r\nВсё же '=' не обязательно является инициализацией, это просто оператор. В связи с этим, как мне кажется, тут любой синтаксис, использующий существующие конструкции, обречён на поломку старого кода.\r\nНапример, как будет работать код отсюда: https://pastebin.com/0A4wambz ?\r\nК тому же предложенный вами синтаксис ничего не упрощает, а только позволяет лишний раз стрельнуть в ногу при работе с (казалось бы, простой вещью) константами. В моём мире слово const перед объявлением переменной не значит ничего, кроме невозможности применения (напрямую) неконстантных методов. Ваше же предложение ломает это простое представление и вносит хаос в тело конструктора.\r\n\r\n\r\n**Сергей Тиунов, 23 июня 2017, 3:19**\r\nПавел Корозевцев, operator= недоступен для констант, поэтому никакого противоречия у компилятора не будет.\r\n\r\n> Как компилятор поймёт, что автор имел в виду: ...\r\n\r\nЕсли член класса, константа, то синтаксис x = ... не может быть operator=, т.к. operator= недоступен для констант, поэтому это отложенная инициализация.\r\nЕсли член класса не константа, то синтаксис x = ... - это operator=.\r\n\r\n> Например, как будет работать код отсюда: pastebin.com/0A4wambz ?\r\n> T a; // конструктор по умолчанию\r\n> T b(1); // конструктор с отложенной инициализацией\r\n\r\nКонструктор по умолчанию не использует отложенную инициализацию, поэтому сработает по-старому и напечатает \"0 const\".\r\nКонструктор с параметром использует отложенную инициализацию члена val, и пытается использовать его неинициализированное значение. Таким образом, первый вызов print приведет к undefined behaviour (например, напечатает \"-858993460 const\"), а второй вызов print напечатает уже инициализированное значение \"1 const\".\r\nВ этом примере operator= не будет вызван нигде.\r\n\r\nДругими словами, никаких двусмысленностей (ambiguity) у компилятора не будет. Но если Вас смущает похожесть на operator=, или смущает, что таким образом нельзя инициализировать не-константу, то можно предложить альтернативный синтаксис для user-defined типов, например,\r\nвместо: val = f(x); // some complicated 'initialisation'\r\nвот так: val.V(f(x)); // explicitly call constructor\r\n\r\nТ.е. мы явным образом вызываем конструктор, ни с чем не спутаешь. Аналогичный явный вызов деструктора объекта разрешен уже давно.\r\n\r\n\r\n**Сергей Тиунов, 23 июня 2017, 3:53**\r\nПавел Корозевцев, по поводу философии const.\r\n\r\n> В моём мире слово const перед объявлением переменной не значит ничего, кроме невозможности применения (напрямую) неконстантных методов.\r\n\r\nУ меня ровно такое же представление о константах - мы ограничиваем спектр возможных операций над объектом операциями \"чтения\".\r\nПоэтому рекомендуется применять const везде, где это возможно (принцип наименьшего интерфейса).\r\nОднако применение const на членах классов приводит к трудностям в конструкторе, и поэтому 90% населения просто не используют const на членах классов.\r\nВ результате те прекрасные гарантии, которые мог бы дать const, ничто уже не дает, и класс становится более уязвимым.\r\n\r\n> Ваше же предложение ломает это простое представление и вносит хаос в тело конструктора.\r\n\r\nЕще раз: const ограничивает набор возможных операций на протяжении жизненного цикла объекта.\r\nОтложенная инициализация всего лишь позволяет отложить начало жизненного цикла, т.е. вызов конструктора (императивный подход).\r\nВо всех остальных функциях (т.е. не в конструкторе) предложение ничего не меняет.\r\nУвеличение свободы в конструкторе дает возможность чаще использовать const на членах классов.\r\nВ результате (как я надеюсь) const-члены классов будут более привлекательны и более популярны, а классы станут более прочными и удобными в разработке.\r\n\r\n\r\n**Павел, 23 июня 2017, 7:47**\r\nСергей Тиунов,\r\n\r\n>> operator= недоступен для констант\r\n\r\nЧего? Вон же там написано `void operator=(int) const {...}`.\r\n\r\nВы предложенный код вообще компилировали? В курсе, да, что он уже вполне себе определенно работает без всяких фантазий на тему того, что делает первый оператор=?\r\nЗапретить использовать оператор= для констант вам точно никто не даст.\r\n\r\n>> напечатает \"-858993460 const\"\r\n>> напечатает уже инициализированное значение \"1 const\"\r\n\r\nОба раза выведет \"2 const\".\r\n\r\n>> В этом примере operator= не будет вызван нигде.\r\n\r\nОчень интересно. А что такое `val = f(x);`, если не вызов оператора=?\r\n\r\n>> val.V(f(x)); // explicitly call constructor\r\n\r\nЗнакомьтесь: `new (const_cast(&val)) V(f(x));`\r\nДать жизнь переменным, у которых не выполнился конструктор, чтобы потом явно его вызвать, тоже никто в трезвом уме не позволит.\r\n\r\n\r\n**Сергей Тиунов, 23 июня 2017, 10:28**\r\nПавел Корозевцев, прошу прощения, никогда не думал, что оператор присваивания доступен для констант. Существуют ли не выдуманные примеры его применения от людей в трезвом уме?\r\n\r\n> Вы предложенный код вообще компилировали?\r\n> А что такое `val = f(x);`, если не вызов оператора=?\r\n\r\nКод не компилировал, просто просмотрел. Но мы тут вроде рассуждаем о развитии языка, а не о том, как он работает сейчас, поэтому val = f(x) - это в моей интерпретации отложенная инициализация члена val.\r\n\r\nC placement-new я знаком, разумеется, но приведенный Вами код запустит конструктор второй раз, тогда как мой вариант - первый раз (отложенный).\r\n\r\n> Дать жизнь переменным, у которых не выполнился конструктор, чтобы потом явно его вызвать, тоже никто в трезвом уме не позволит.\r\n\r\n```cpp\r\nint x; // А как же встроенные типы?\r\n```\r\n\r\n**Павел, 23 июня 2017, 10:46**\r\nСергей Тиунов,\r\n>> Но мы тут вроде рассуждаем о развитии языка, а не о том, как он работает сейчас\r\n\r\nТо, что работает сейчас, должно работать так же через 20 лет. В том числе, мой код должен выводить нолик, двоечку, хе-хе и двоечку, а никак не (условное) -858993460 и 1.\r\n\r\n>> int x; // А как же встроенные типы?\r\n\r\nТут отработал \"конструктор\" инта. Дальше только присваивание.\r\n\r\n\r\n**Сергей Тиунов, 23 июня 2017, 11:36**\r\nПавел Корозевцев,\r\n\r\n> То, что работает сейчас, должно работать так же через 20 лет. В том числе, мой код ...\r\n\r\nХорошо, забыли про оператор присваивания (хотя оператор присваивания для констант - это конечно смешно). Я предложил вариант с явным вызовом конструктора - насколько я знаю, сейчас в языке такой код не разрешен, т.е. ничего не ломает.\r\n\r\n>>> Дать жизнь переменным, у которых не выполнился конструктор, чтобы потом явно его вызвать, тоже никто в трезвом уме не позволит.\r\n\r\n>> int x; // А как же встроенные типы?\r\n\r\n> Тут отработал \"конструктор\" инта. Дальше только присваивание.\r\n\r\nРезультат один и тот же - undefined behaviour, и язык позволяет это делать. Или есть какие-то другие причины (кроме возможного UB), по которым \"никто в трезвом уме не позволит\" сделать отложенный вызов конструктора?\r\n\r\n\r\n**Павел, 23 июня 2017, 14:19**\r\nСергей Тиунов, UB -- уже довольно весомая причина.\r\nC++ силён, благодаря своей строгости. Нужно пользоваться этим, а не пытаться \"упростить\". Никто не любит \"упрощения\", ведущие к UB.\r\nНу хорошо, понятно, что у нас с вами разные подходы к решению поставленной проблемы. Но всё-таки есть правило \"все фичи, которые могут быть реализованы в либе, должны быть в либе, а не в языке\".\r\nПочему вы хотите именно языковое нововведение? Быть может, вам такая обёртка подойдёт: `std::optional`? Понятно, что это не совсем то, чего вы хотели, но проблему решает: хранимая переменная имеет квалификатор const, а инициализировать можно в любое время.\r\nМожно ещё написать велик, приближающий std::optional к тому, что вы хотите. То есть завести char[sizeof(T)], в котором с помощью placement new инициализировать единственный раз. По оператору-> возвращать константный указатель. В обоих случаях получается оверхед в один bool.\r\n\r\n\r\n**Сергей Тиунов, 23 июня 2017, 16:37**\r\nПавел Корозевцев,\r\n\r\n> Быть может, вам такая обёртка подойдёт: `std::optional`?\r\n\r\nЯ же правильно понимаю, Вы можете присвоить в std::optional в любой другой момент? Тогда зачем мне это, если я могу с тем же успехом использовать просто `T`?\r\n\r\n> Можно ещё написать велик...\r\n\r\nЕсли Вы можете присвоить велику в теле конструктора, то вы можете присвоить велику в любой другой member-функции, т.е. Вы теряете const-гарантию.\r\n\r\n> Почему вы хотите именно языковое нововведение?\r\n\r\nПотому что список инициализации конструктора делает неудобным использование констант и ссылок, которые могли бы принести пользу.\r\n\r\nЕсли уж делать что-то в рамках текущей версии языка, то оптимальный (на мой взгляд) вариант я описал в основном предложении - это фабричный метод.\r\nВ нем минимум лишнего - один метод + возможно несколько дополнительных (вызовов конструкторов) перемещений.\r\nВ итоге мы получаем инициализированные константы и ссылки с соответствующими гарантиями.\r\nНО! На практике я такой подход встречал редко, потому что зачем заморачиваться, если можно просто убрать const или сделать указатель вместо ссылки?\r\nПоэтому нужно сделать константы и ссылки по крайней мере не менее удобными, чем переменные и указатели.\r\n\r\n> Никто не любит \"упрощения\", ведущие к UB.\r\n\r\nЯвный вызов конструктора (равно как и placement new) - это сознательное действие программиста, который понимает, что он делает, не так ли? Это просто инструмент, и у него есть свое применение. Никто же не заставляет нас пользоваться \"void *\", но бывают случаи, когда это удобно.\r\n\r\n> C++ силён, благодаря своей строгости.\r\n\r\nПри использовании подхода, который предлагаю я, можно будет объявлять больше членов класса константами и ссылками, это приведет к повышению \"прочности конструкции\" с момента выхода из конструктора. Согласитесь, редко бывают классы, у которых бОльшая часть кода сосредоточена в конструкторах, в основном код в member-функциях. А если и бывают, то опять же - никто не заставляет использовать этот подход :)\r\n\r\n\r\n**Павел, 20 июня 2017, 20:07**\r\nТо есть Вы хотите позволить внести внутрь конструктора какие-то относительно сложные вычисления, решающие конкретную задачу? Кажется, люди используют модульность именно для того, чтобы отдельные задачи решались отдельным модулем. Почему бы не инициализировать переменную через передачу её конструктору возвращаемого значения специальной функции?\r\n```cpp\r\nclass B {\r\npublic:\r\n B(int x, int y)\r\n : val(calc_val(x, y)) {}\r\nprivate:\r\n static int calc_val(int x, int y) { return (x + y) / 2; }\r\n const int val;\r\n};\r\n```\r\nИзвините за очевидный код, но я искренне не понял проблему. Возможно, мне нужно увидеть более сложный пример, чтобы проникнуться.\r\nИ раз уж мы хотим снять константность со всех переменных-членов в области видимости конструктора, может быть еще для деструктора то же провернуть? Возможно, тоже кому-то пригодится.\r\n\r\n\r\n**Сергей Тиунов, 22 июня 2017, 18:53**\r\nПавел Корозевцев,\r\n\r\nДействительно, Ваш пример не раскрывает никакой проблемы.\r\nПредставьте себе класс с 5 членами, тогда придется сделать 5 дополнительных функций (если не испугало 5, просто увеличьте число :).\r\nНо если вдуматься: эти функции (calc_val) нужны только потому, что всего этого нельзя сделать в конструкторе.\r\n\r\nЯ думаю, что каждый инструмент нужно использовать по назначению: конструкторы для инициализации объектов, модульность - для управления сложностью кода. Вы предлагаете использовать модульность не для управления сложностью, а просто потому что в конструкторах нельзя писать такой код.\r\n\r\nЯ же предлагаю сделать написание конструкторов *удобнее*. В конце концов цель любого улучшения языка заключается в том, чтобы тот или иной аспект работы с ним стал удобнее.\r\n\r\n\r\n**Сергей Тиунов, 22 июня 2017, 19:46**\r\nКстати, забыл еще один недостаток списков инициализации.\r\nО нем упоминал еще Скотт Мейерс (Effective C++, Item 4), вряд ли это поменялось.\r\n\r\nЧлены класса инициализируются в порядке объявления в классе, а не в порядке перечисления в списке инициализации. Это поведение абсолютно неочевидно, т.е. о нем нужно знать. В результате, если члены класса инициализируются друг из друга, можно получить развеселые баги, и потратить немало времени в отладчике.\r\n\r\n\r\n**Дмитрий, 23 июня 2017, 17:02**\r\nСергей Тиунов, для этого есть флажок -Wreorder, включённый в -Wall.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805617481/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805962301", + "html_url": "https://github.com/cpp-ru/ideas/issues/199#issuecomment-805962301", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/199", + "id": 805962301, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTk2MjMwMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T16:16:01Z", + "updated_at": "2021-03-24T16:16:01Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 27 июня 2017, 15:38**\r\nСтоит поисследовать проблему и понять почему это не делается автоматически. Если разумных причин нет - разрешить компиляторам так делать по умолчанию.\r\n\r\n\r\n**Павел, 28 июня 2017, 1:20**\r\nyndx-antoshkka, если начать делать по умолчанию, сломается бинарная совместимость со старым кодом.\r\n\r\n\r\n**yndx-antoshkka, 28 июня 2017, 13:34**\r\nПавел Корозевцев, да сломается.\r\n\r\nНо мне кажется что оптимизация сильно хорошая и было бы неплохо, чтобы стандарт C++ позволял её делать. А уж какие из компиляторов будут её реализовывать и когда (и будут ли вообще) - это их дело.\r\n\r\nНужно поисследовать этот вопрос подробнее\r\n\r\n\r\n**Дмитрий, 28 июня 2017, 19:31**\r\nyndx-antoshkka, размер перечисления задается только вручную (начиная с c++11), иначе будет int. Никакого автоматического выведения не сделали, а тоже была бы неплохая оптимизация.\r\n\r\n\r\n**yndx-antoshkka, 28 июня 2017, 20:02**\r\nДмитрий, поясните вашу мысль. Я немного не понимаю о чём вы.\r\n\r\n\r\n**Дмитрий, 28 июня 2017, 21:02**\r\nyndx-antoshkka, мне кажется ситуация аналогична. Размер enum фиксирован - 4 байта (тип int), что излишне в ряде случаев. В с++11 могли сделать автоматический вывод размера перечисления основываясь на количестве и значениях его полей. Но так не сделали, а ввели альтернативный синтаксис для объявления перечисления с явным заданием типа (размера). Я полагаю тоже руководствовались бинарной совместимостью.\r\n\r\n\r\n**Andrey Davydov, 28 июня 2017, 9:02**\r\n```cpp\r\nДавайте рассмотрим такой код:\r\nvoid assign(Container & dest, Container const & src)\r\n{\r\n dest = src;\r\n}\r\n\r\nvoid foo(Object o, Container c)\r\n{\r\n assign(o.list, c);\r\n}\r\n```\r\nКомпилятор не имеет права скомпилировать assign как memcpy(&dst, &src, sizeof(Container)). Кажется это довольно сильное ограничение. Не лучше ли стандартизовать аттрибут packed (#pragma pack в MSVC), чтобы можно было реализовать Ваш пример следующим образом?\r\n```cpp\r\n#include \r\n\r\nstatic_assert(sizeof(void*) == 8);\r\n\r\nstruct [[gnu::packed]] alignas(2) Container\r\n{\r\n void * data;\r\n std::uint16_t size;\r\n};\r\n\r\nstatic_assert(sizeof(Container) == 10);\r\nstatic_assert(alignof(Container) == 2);\r\n\r\nstruct Object\r\n{\r\n std::uint64_t id;\r\n Container list;\r\n std::uint16_t flags;\r\n};\r\n\r\nstatic_assert(sizeof(Object) == 24);\r\n```\r\nПри этом, если мы не хотим уплотнять Object, то этого можно достичь так:\r\n```cpp\r\nstruct Object\r\n{\r\n std::uint64_t id;\r\n Container list;\r\n alignas(8) std::uint16_t flags;\r\n};\r\n\r\nstatic_assert(sizeof(Object) == 32);\r\n```\r\n\r\n**Дмитрий, 28 июня 2017, 18:57**\r\nСкомпилировать assign как memcpy(&dst, &src, sizeof(Container)) не может. Но я отметил что inline должен обозначать что структура Container никак не использует области памяти, к которым у неё нет явного доступа (в примере последние 6 байт). Поэтому компилятор свободно может сделать так: memcpy(&dst, &src, sizeof(Container)-6), или проще: memcpy(&dst, &src, 10).\r\n\r\n\r\n**Andrey Davydov, 28 июня 2017, 19:35**\r\nДмитрий, а чем такое хитрое определение \"структура никак не использует области памяти к которым у нее нет явного доступа\" лучше чем просто ограничить размер структуры (что достигается в моем примере через атрибут packed)?\r\n\r\n\r\n**Дмитрий, 28 июня 2017, 21:08**\r\nAndrey Davydov, дело в выравнивании. Обычно поля структур выравнены по границе кратной своему же размеру. Не знаю актуально ли оно на сегодня, но все компиляторы его производят и данное правило будет нарушено.\r\n\r\n\r\n**Дмитрий, 28 июня 2017, 16:10**\r\nИдея хорошая, но — согласен с комментариями — требуется более глубокая проработка.\r\n\r\n\r\n**Сергей Прейс, 28 июня 2017, 21:10**\r\nПроблема в совместимости - необходимо обеспечить бинарную совместимость структур между кодами от разных компиляторов, поэтому \"А уж какие из компиляторов будут её реализовывать и когда (и будут ли вообще) - это их дело\" - не вариант. Более того, придется прописать как в точности встраивание структур будет работать.\r\nКроме того, \"встраиваемость\" накладывает определенные ограничения на компилятор и может иметь негативный эффект на производительность. Например, сейчас компилятор имеет право записывать 4 байта вместо 2х в size если это будет быстрее на целевой архитектуре, но если на структуре написано inline то это недопустимо - структура может содержать данные из другой структуры, которые будут испорчены таким образом. В частности при копировании структур нельзя будет делать bulk copy, придется делать field-by-filed.\r\n\r\n\r\n**Дмитрий, 29 июня 2017, 20:58**\r\nСергей Прейс, бинарная совместимость обеспечивается, ситуация аналогична enum. При копировании структур делать bulk copy можно во всех случаях, т.к. речи о перестановке полей или нарушении выравнивания не идет. Встраиваемость негативный эффект может иметь, а может не иметь. Я склоняюсь к мнению что описанного негативного эффекта не будет в принципе. Однозначно можно сказать что потребление памяти и количество кэш-промахов снизится. Далее сам программист в конкретной ситуации должен решать применять или нет.\r\n\r\n\r\n**Сергей Прейс, 29 июня 2017, 21:49**\r\nДмитрий, про enum не понял аналогию. Для обычных структур в стандарте строго прописано размещение полей и это обеспечивает бинарную совместимость. Всякие [[gnu::packed]] нарушают эту совместимость - если один компилятор (сс1) поддерживает gnu::packed а другой компилятор (сс2) не поддерживает gnu::packed и проигнорирует атрибут, то структура пришедшая от сс1 к сс2 как параметр вызова (при чем не важно по ссылке или по значению) будет интерпретирована неправильно. То же и в обратную сторону, то же и с предложенной идеей - точное размещение полей структур должно полностью совпадать и его надо будет точно специфицировать.\r\n\r\nИ нет, bulk copy делать нельзя. Рассмотрим такой код.\r\n```cpp\r\nstruct Container {\r\n void *data; // 8\r\n uint16_t size; // 8, из которых используется 2\r\n};\r\n\r\nstruct Object {\r\n uint64_t id; // 8\r\n inline Container list; // 16, из которых используется 11, свои поля + flags\r\n uint16_t flags;\r\n};\r\n\r\nvoid make_container(void* data, uint16_t size) {\r\n return {data, size};\r\n}\r\n\r\nvoid make_object(uint64_t id, uint16_t flags, uint_16 size, Generator gen) {\r\n Object o;\r\n o.id = id;\r\n o.flags = flags;\r\n Container c = make_container(gen(size), size);\r\n o.list = c; // Будем считать, что это копирование останется в коде\r\n}\r\n```\r\nПрисваивание o.list = c; нельзя сделать через bulk copy (memcpy(o.list, c, sizeof(Container)) - можно было бы сделать через один SSE регистр двумя простыми инструкциями) - внутри o.list размещено поле flags и при bulk copy оно будет затерто.\r\n\r\nНа некоторых платформах негативные эффекты точно будут. Потребление памяти и количество промахов по кэшу могут снизиться, но могут возникнуть проблемы с partial register stall, store forwarding и т.п. К сожалению программисты далеко не всегда понимают возможные низкоуровневые проблемы.\r\n\r\n\r\n**Сергей Прейс, 29 июня 2017, 22:06**\r\nПоправлюсь - согласен с yndx-antoshkka - размещение полей структур описано в ABI а не в стандарте языка. И это делает аналогию с enum еще менее понятной.\r\n\r\n\r\n**Дмитрий, 30 июня 2017, 16:27**\r\nСергей Прейс, одни компиляторы поддерживают enum Example : uint8_t { ... }, другие нет. Одни компиляторы будут поддерживать inline struct Container { ... }, другие нет. И в том, и в другом случае при отсутствии поддержки код просто не соберется. Поясните, в чем же все таки разница?\r\nОтмечу что в предложении про [[gnu::packed]] и нарушение выравнивания ничего не говорится в принципе. Выравнивание сохраняется.\r\n\r\n\r\n**Сергей Прейс, 30 июня 2017, 17:18**\r\nЕсли не соберется - это нормально. Я отвечал на вот этот комментарий \"А уж какие из компиляторов будут её реализовывать и когда (и будут ли вообще) - это их дело.\"\r\n\r\nПро выравнивание я понимаю, но дело не только в нем. Чтобы была можно было передавать структуру между функциями собранными разными компиляторами эта структура должна пониматься ими обоими абсолютно одинаково (должны совпадать не просто выравнивания, а смещения полей от начала структуры и размер всей структуры). В предложении меняются и смещения и размеры, а значит требуется их точное описание при чем, как правильно отметил yndx-antoshkka менять придется не только стандарт, но и ABI.\r\n\r\n>> Обычно поля структур выравнены по границе кратной своему же размеру.\r\n>> Не знаю актуально ли оно на сегодня, но все компиляторы его производят\r\n>> и данное правило будет нарушено.\r\nПравило актуально - оно часть ABI и оно имеет два полезных свойства: оно фиксирует как точно должны размещаться поля в структурах и при этом позволяет эффективную и безпроблемную реализацию операций над структурами. Эффективность достигается не только за счет собственно выравнивания, но и за счет снижения гранулярности операций (использование доступов большего размера). Ну и на части платформ (Sparc, Xeon Phi первого поколения) нарушение натурального выравнивания (выравнивания на размер доступа) при доступе к памяти может приводить к аппаратным ошибкам.\r\n\r\n\r\n**Дмитрий, 30 июня 2017, 22:14**\r\nСергей Прейс, в таком случае выравнивание сохраняется, здесь проблем нет. А по поводу передачи структуры между функциями я предложил решение ниже - если она встраивается, то её как объекта быть не должно, иначе действительно много проблем.\r\n\r\n\r\n**_NN_, 14 мая 2019, 9:13**\r\nСергей Прейс, Расскажите как вы сегодня обеспечиваете бинарную совместимость между компиляторами.\r\nБез явного указания выравнивания ( #pragma pack ) и перечисления всех полей структуры вы не обеспечите бинарной совместимости даже сегодня.\r\nК примеру, рассмотрим эту простую структуру.\r\n\r\nВсё, что мы знаем, что она занимает по меньшей мере 2 байта и что a идёт в памяти до b.\r\nРеально структура может занимать хоть все 16 хоть так:\r\n\r\na: 1 байт\r\n\r\nвыравнивание:13 байт\r\nb: 1 байт\r\nвыравнивание: 3 байт\r\n```cpp\r\nstruct A\r\n{\r\n char a;\r\n char b;\r\n};\r\n```\r\nВ общем, это предложение никак не касается проблем бинарной совместимости, которой итак не было.\r\n\r\nРешается одна конкретная проблема, которая позволит гарантировать, например размер поля unique_ptr в вашем классе.\r\n\r\n\r\n**Сергей Прейс, 29 мая 2019, 9:19**\r\n_NN_, размещение структур в памяти включая выравнивание полей и padding определяются ABI для платформы см. напр. System V Application Binary Interface Intel386 APS 2.1 или System V Application Binary Interface AMD64 APS п.3.1.2. Это не свойство языка, однако совместимость есть и она не требует #pragma pack. И это коррелирует с наблюдаемым миром: в стандартных библиотеках и API использование указателей на структуры достаточно распространено, никакого специального выравнивания/упаковки для этих структур в интерфейсе не делается и тем не менее всё работает с разными компиляторами в рамках одной платформы. Простой пример - struct tm.\r\n\r\n\r\n**yndx-antoshkka, 29 июня 2017, 15:39**\r\nПоисследовал:\r\n\r\n* Стандарт С++ позволяет такую оптимизацию:\r\n```\r\n[basic.align]\r\n\r\nThe alignment required for a type might be different when it is used as the type of a complete object and when it is used as the type of a subobject.\r\n\r\n[ Example:\r\n\r\nstruct B { long double d; };\r\nstruct D : virtual B { char c; };\r\n\r\nWhen D is the type of a complete object, it will have a subobject of type B, so it must be aligned appropriately for a long double. If D appears as a subobject of another object that also has B as a virtual base class, the B subobject might be part of a different subobject, reducing the alignment requirements on the D subobject.\r\n\r\n— end example ]\r\n```\r\n\r\n* GCC использует Itanium ABI https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html\r\n* Itanium ABI описывает alignment для классов http://refspecs.linuxbase.org/cxxabi-1.83.html#class-types\r\n* Для примеров близких к вашим, GCC и CLANG сейчас генерируют очень похожий код в обоих случаях (см вторую половину) https://godbolt.org/g/ztHZnn . Другими словами, можно проводить такую оптимизацию, но надо поэкспериментировать с типами и перепроверить, что для unsigned типов переполнение будет работать одинаково в обоих случаях.\r\n\r\nИтого: если хочется увидеть из коробки такую оптимизацию, то нужно убедить в её целесообразности разработчиков Itanium ABI и дополнить Itanium ABI.\r\n\r\n\r\n**Сергей Прейс, 29 июня 2017, 22:03**\r\nyndx-antoshkka,\r\nбоюсь даже представить как передается по ссылке D для которого выполнено \"appears as a subobject of another object that also has B as a virtual base class, the B subobject might be part of a different subobject, reducing the alignment requirements on the D subobject\". В вызываемой функции D is the type of a complete object со всеми вытекающими, так что передать простой указатель на подобъект D не получится. Подозреваю, что в месте вызова возникнет временный объект типа D в него соберут подобъект и передадут на него ссылку в вызов при возврате случится копирование данных из времянки. Впрочем это поведение не зависит от выравнивания, так что определенная оптимизация по памяти будет иметь место, а бинарная совместимость будет обеспечена необходимостью описанного выше преобразования.\r\n\r\n\r\n**Will Code For Food, 27 октября 2017, 17:33**\r\n> Стандарт С++ позволяет такую оптимизацию:\r\n> [basic.align]\r\n\r\nПодобная оптимизация изменит в первую очередь размер, а не выравнивание структуры. Так что не позволяет.\r\n\r\n\r\n**yndx-antoshkka, 29 июня 2017, 15:40**\r\nЕсть у кого желание заняться улучшением Itanium ABI?\r\n\r\n\r\n**Дмитрий, 30 июня 2017, 21:42**\r\nТам, где копирование встроенного объекта делается так: memcpy(&dst, &src, sizeof(Container)), будет ошибка. При том ошибка неявная и трудноуловимая, особенно для незнающего.\r\nПредлагаю для решения данной проблемы запретить прямой доступ к объектам встраиваемых структур, превратить их во что-то вроде namespace. А доступ к его полям и методам сделать с явным указанием, что объекта не существует, он встроен:\r\n```cpp\r\nObject testObject;\r\ntestObject.id; // Можно\r\ntestObject.list; // Нельзя, такого объекта нет\r\ntestObject.list::size; // Можно.\r\n```\r\nВзять адрес list него нельзя, передать по ссылке тоже нельзя и т.д., а его поля приобрели имена list::size и list::data. Таким образом проблема будет решена.\r\nА в подобных случаях: std::vector или std::vector доступ оставить, т.к. объект Container не встроен и действительно существует сам по себе.\r\n\r\n\r\n**alexey.i.salmin, 5 июля 2017, 10:15**\r\nЭта проблема известна под названием \"overlaying tail padding\". Itanium ABI изначально не оговаривал этот вопрос явно, что привело к разным реализациям: g++ упаковывал структуры, а icc нет. Вот тред про g++: https://gcc.gnu.org/ml/gcc/2002-08/msg00874.html\r\n\r\nКогда это обнаружилось, вопрос вынесли на обсуждение рабочей группы ABI. Решение -- явно запретить переиспользование tail padding. https://itanium-cxx-abi.github.io/cxx-abi/cxx-closed.html#A31 . После этого в g++ привели реализацию в соответствие с ABI.\r\n\r\nТак что, шансы того, что \"компиляторы будут делать это автоматически\" равны нулю.\r\n\r\nНасчет нового ключевого слова -- идея интересная, но тут главный вопрос: чему равен sizeof(Container)? Если 6, то их нельзя класть в массив. Если 8, то нельзя будет делать memset(&container, 0, sizeof(container)) -- это не только компиляторы делают. Единственное решение, которое я вижу -- вообще не считать Container типом данных, а чем-то вроде нэймспейса, как предлагают ниже. Если хочешь использовать inline структуру -- обязательно должен обернуть ее в полноценный тип. В таком виде можно попробовать довести идею до ума, но удобство использования страдает.\r\n\r\n\r\n**alexey.i.salmin, 5 июля 2017, 11:21**\r\nДобавлю: ближайшая аналогия -- это bit fields. Поле в структуре есть, но адрес брать нельзя.\r\nЕсли продолжить эту идею, то можно объявлять Container как обычно, а inline писать в точке использования, будет даже понятнее. Но \"инлайнить\" можно будет только POD структуры: адрес брать нельзя, т.е. this использовать нельзя, нетривиальный конструктор копирования использовать нельзя и т.д.\r\n\r\n\r\n**yndx-antoshkka, 5 июля 2017, 11:54**\r\nalexey.i.salmin, спасибо большое за ссылки!\r\n\r\nПо поводу ключевого слова - с такими ограничениями не хочется вводить новую конструкцию. Предлагаю подождать принятия метаклассов http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0707r0.pdf . С ними можно будет написать метакласс делающий эту оптимизацию (как-то вот так):\r\n```\r\n$class tail_opt { constexpr {\r\nfor (auto m : $this.classes())\r\nfor (auto m : $b.variables())\r\n-> { m; }\r\n}};\r\n```\r\n\r\n**Дмитрий, 5 июля 2017, 17:25**\r\nalexey.i.salmin, sizeof(Container) менять нельзя, это нарушит выравнивание. Рассматривать нужно ситуацию встраивания, когда сам объект пропадает. std::vector к этой ситуации не относится.\r\nyndx-antoshkka, тут без вариантов, автоматически не выйдет. И потом не всегда всё необходимо встраивать, иногда требуется чтобы объект сохранился, для передачи его куда-то... Многие моменты в метаклассах меня смущают, но я согласен, это вполне решение.\r\n\r\n\r\n**Ватенов Артем, 10 мая 2019, 20:20**\r\nВторой предложенный вариант:\r\n```cpp\r\nstruct Object {\r\n uint64_t id;\r\n inline Container list;\r\n uint16_t flags;\r\n};\r\n```\r\nс обозначенным порядком доступа:\r\n```cpp\r\nObject testObject;\r\ntestObject.id; // Ok\r\ntestObject.list; // Error, object does not exist\r\ntestObject.list::size; // Ok\r\n```\r\n- явное и простое решение обозначенной проблемы, без побочны эффектов.\r\n\r\nНасчет метаклассов:\r\n\r\n1. Они без преувеличения будут адом. Изучение чужого кода усложнится на порядки. И будет ли согласнен разработчик так жертвовать разборчивостью своего кода для такой оптимизации?;\r\n\r\n2. Для создания метаклассов необходимо разобраться в синтаксисе. Это без сомнения усложнение языка, которое если и будет введено, не будет освоено всеми.\r\n\r\n3. Простое приравнивание работать не будет. В предложенном же варианте операторы для встроенной структуры должны работать:\r\n```cpp\r\nObject testObjectA;\r\nObject testObjectB;\r\ntestObjectA.list = testObjectB.list; // Ok\r\nif(testObjectA.list == testObjectB.list) {...} // Ok\r\n...\r\n```\r\n\r\nТаким образом, метаклассы не альтернатива.\r\n\r\n \r\n\r\n\r\n**_NN_, 14 мая 2019, 7:39**\r\nОбновлено 10 мая 2019, 20:24\r\n\r\n\r\nВатенов Артем, testObject.list; // Error, object does not exist\r\n\r\nВ чём смысл запрета ?\r\nСегодня компилятор вправе сгенерировать так поля, что будут аналогично inline struct.\r\nЕдинственное, что есть в предложении это заставить его делать это всегда.\r\n\r\n\r\n**Илья, 15 мая 2019, 23:36**\r\n_NN_, компилятор не вправе. При \"встраивании\" структуры, конкретно в данном случае, flags займёт неиспользуемую область list. Они начнут перекрываться. Таким образом:\r\n\r\n1. зануляя через memset поле list, будет занулено и flags;\r\n\r\n2. копируя через memcpy поле list, в неиспользуемой им области памяти окажутся скопированные данные поля flags, которые могут носить конфиденциальный характер.\r\n\r\nДля избежания данных проблем при встраивании стоит отказаться от доступа непосредственно к полю list.\r\n\r\nПри необходимости указатель на встроенный объект можно получить по его первому полю.\r\n\r\n\r\n**_NN_, 16 мая 2019, 9:44**\r\nОбновлено 15 мая 2019, 23:41\r\n\r\n\r\nИлья, Всё верно. Я не так понял предложение.\r\nПо наводке Дмитрия я подумал, что это аналогично моему, но теперь я вижу, что это разное.\r\nhttps://stdcpp.ru/proposals/d9e344f7-0c8e-4ed7-a84a-b44051019bce", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805962301/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805963250", + "html_url": "https://github.com/cpp-ru/ideas/issues/199#issuecomment-805963250", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/199", + "id": 805963250, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTk2MzI1MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T16:17:13Z", + "updated_at": "2021-03-24T16:17:13Z", + "author_association": "MEMBER", + "body": "В C++20 добавили для этого аттрибут `[[no_unique_address]]` http://eel.is/c++draft/dcl.attr.nouniqueaddr", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805963250/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805964200", + "html_url": "https://github.com/cpp-ru/ideas/issues/200#issuecomment-805964200", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/200", + "id": 805964200, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTk2NDIwMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T16:18:30Z", + "updated_at": "2021-03-24T16:18:30Z", + "author_association": "MEMBER", + "body": "**zamazan4ik@tut.by, 5 июля 2017, 23:42**\r\nКак по мне, абсолютно бесполезный синтаксический сахар.\r\n\r\n\r\n**dix75, 28 июля 2017, 11:16**\r\nzamazan4ik@tut.by,\r\nКак пить дать", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805964200/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805965678", + "html_url": "https://github.com/cpp-ru/ideas/issues/201#issuecomment-805965678", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/201", + "id": 805965678, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTk2NTY3OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T16:20:30Z", + "updated_at": "2021-03-24T16:20:30Z", + "author_association": "MEMBER", + "body": "**smertigdon, 6 июля 2017, 16:56**\r\nДумаю, что идея не зайдёт. Все текущие унарные операторы имеют реальный смысл и без перегрузок. А что такое %x для decltype(x) == int? И я уверен, что ради такого наделять %, ^ и прочие бинарные операторы унарным смыслом не будут\r\n\r\n\r\n**post-increment, 7 июля 2017, 19:39**\r\nОтветил ниже.\r\n\r\n\r\n**post-increment, 7 июля 2017, 19:39**\r\nДополнение и ответ smertigdon.\r\nМоё предложение рассматривает расширение в том числе бинарных операторов на унарные .\r\n1. Для бинарных операторов. Например, в языке D бинарный оператор ~ означает конкатенацию. Было бы неплохо иметь такую возможность.\r\nВ том случае можно более легко объединять диапазоны.\r\nЯ сам в основном занимаюсь математическими задачами. И если говорить в этом контексте, то объединение векторов прекрасно смотрелось бы как\r\nv3 = v1~v2;\r\nДумаю это также хорошо сочеталось бы с range library.\r\n2. Касаемо унарного %.\r\nКак пример. В контексте матричных операций часто бывает нужно внешнее произведение векторов, которое в коде С++ можно записать так:\r\nM = v1%v2;\r\nЕсли же я хочу получить квадрат,то я вынужден писать так:\r\nM = v%v;\r\nто мне хотелось бы иметь такой синтаксис:\r\nM = %v;\r\nЗнание того, что в произведении вектор один и тот же может дать преимущества для реализации.\r\nНа данный момент я просто написал функцию:\r\nM = outer(v);\r\nЕсли говорить о типах с плавающей точкой, то унарный % в контексте матричных операций соответствует возведению в квадрат.\r\nНо мне не хотелось бы настаивать на таком семантическом смысле.\r\n3. Как я сказал в предложении, унарные операции (пока что) не имеют семантического смысла для встроенных типов. Однако как я указал в примере выше. унарные операции можно наделить семантическим смыслом для пользовательских типов. Пусть пользователь решает.\r\nСемантический смысл для встроенных типов - это другой вопрос дизайна языка.\r\nИ его на мой взгляд можно решить позже.\r\n4. Замечу, что ваш критерий для унарного * превращается в\r\n\"что такое *x для decltype(x) == int?\".", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805965678/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805968105", + "html_url": "https://github.com/cpp-ru/ideas/issues/202#issuecomment-805968105", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/202", + "id": 805968105, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTk2ODEwNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T16:23:49Z", + "updated_at": "2021-03-24T16:39:18Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 5 июля 2017, 16:29**\r\nА как именно это должно выглядеть?\r\n\r\n\r\n**Павел, 5 июля 2017, 18:16**\r\nyndx-antoshkka,\r\n```cpp\r\nvoid foo(const std::string&... words) {\r\n (std::cout << ... << words) << std::endl;\r\n}\r\n```\r\n\r\n**yndx-antoshkka, 5 июля 2017, 19:21**\r\nПавел Корозевцев, тут есть проблема:\r\n```cpp\r\nvoid foo(int...);\r\n```\r\nТакой код сейчас собирается, за счёт правила, позволяющего не ставить запятую и трактуется как\r\n```cpp\r\nvoid foo(int /*var*/, ...);\r\n```\r\nС variadic templates всё верно работает за счёт контекстно чувствительной грамматики\r\n```cpp\r\ntemplate // compiler: remembering that `I` is a pack\r\nvoid foo(I......); // compiler: `I` is a pack => void foo(I... /*vars*/, ...);\r\n```\r\nВ вашем примере `void foo(const std::string&...)` компилятор не сможет догадаться о ваших намерениях. Нужно как-то ему намекнуть + неплохо было бы показать пользователю, что функция на самом то деле шаблонная (см ваш же комментарий ниже)\r\n\r\n\r\n**Andrey Davydov, 6 июля 2017, 0:33**\r\nyndx-antoshkka, теоретически, для этой цели по аналогии с std::initializer_list можно ввести специальный магический тип std::varargs. Тогда пример с выводом слов мог бы выглядеть так:\r\n```cpp\r\ntemplate\r\nvoid foo(std::varargs words) {\r\n for (auto const & w : words) std::cout << w;// constexpr for из p0589\r\n std::cout << std::endl;\r\n}\r\n```\r\nОднако меня пугает, то что overload resolution усложнится еще больше, особенно при инициализации объектов.\r\n```cpp\r\nstruct Container\r\n{\r\n template Container(std::initializer_list); // #1\r\n template Container(std::size_t size, T value); // #2\r\n template Container(std::varargs); // #3\r\n};\r\n\r\nContainer c2 {1, 2}; // #1\r\nContainer c1 (1, 2); // #2 или #3\r\n```\r\n\r\n**Antervis, 6 июля 2017, 9:16**\r\nyndx-antoshkka, разумеется, чем проще тем лучше. Идеальный вариант - void func(int ...args);\r\n\r\nЯ так полагаю, проблема в том, что дополнительно требуется явно указать что функция-шаблон (подобная проблема, если не ошибаюсь, с синтаксисом типа void func(auto arg);). Синтаксис template (без скобок) уже используется для явного инстанцирования, синтаксис template <> (без аргументов) уже используется для template overloading'а. template или template - очевидно нет. Что оставляет нам один вариант: template <...> - явно указать, что в шаблоне присутствуют varargs.\r\n\r\nТогда синтаксис будет вида\r\n```cpp\r\ntemplate <...>\r\nvoid func(int ..args) { /*...*/ }\r\n```\r\n\r\n**Павел, 5 июля 2017, 18:20**\r\nА зачем это делать? Это всё равно будет шаблон. Всё равно инстанциироваться будет на этапе компиляции, как и шаблоны. Если вы хотите гарантировать, что в функцию не попадёт \"неправильный\" тип, то это можно и сейчас делать.\r\n\r\nТакой синтаксис подарит нам ограничения, но не даст фич. Или я ошибаюсь?\r\n\r\n\r\n**Andrey Davydov, 5 июля 2017, 23:15**\r\nПавел Корозевцев, гарантировать что в функцию не попадет неправильный тип можно, но заставить, чтобы вывелся правильный тип -- нет. Воображаемую функцию\r\nvoid foo(const std::string&... words);\r\nможно будет вызвать так:\r\n```cpp\r\nfoo(\"aba\", \"caba\"),\r\n```\r\nа такую\r\n```cpp\r\ntemplate...>>>\r\nvoid foo(Args const & ...);\r\n```\r\nнельзя.\r\n\r\n\r\n**Antervis, 6 июля 2017, 8:22**\r\nПавел Корозевцев, проблема в другом. Если у нас есть func(string ...s), мы сможем передать в неё func(s1, s2, {v1.begin(),v1.end()}) и код скомпилируется. С variadic template'ом последний аргумент попросту не получится передать\r\n\r\n\r\n**Александр, 6 июля 2017, 8:25**\r\nAndrey Davydov,\r\n```cpp\r\ntemplate...>>>\r\nvoid foo(Args &&...words)\r\n{\r\n (std::cout << ... << words) << std::endl;\r\n}\r\n```\r\n\r\n**Andrey Davydov, 6 июля 2017, 8:45**\r\ncroessmah, в Вашем варианте все равно не заработает пример от @Antervis комментарием выше.\r\n\r\n\r\n**Александр, 7 июля 2017, 13:51**\r\nAndrey Davydov, я когда писал, его поста еще не было. Да и других проблем это не решает.\r\n\r\n\r\n**rymis, 11 июля 2017, 13:46**\r\nУдалил свой предыдущий комментарий, чтобы написать корректно.\r\n\r\nЯ недавно решал подобную проблему так:\r\n```cpp\r\n#include \r\n#include \r\n#include \r\n\r\nusing namespace std;\r\n\r\ntemplate \r\ninline void print_impl(const typename pair::second_type&...args) {\r\n std::string strings[] = {args...};\r\n for (auto&& s : strings)\r\n cout << s;\r\n\r\n cout << endl;\r\n}\r\n\r\ntemplate \r\ninline void print(T&&...vals) {\r\n print_impl(std::forward(vals)...);\r\n}\r\n\r\nint main() {\r\n print(\"Hello\", \" \", \"World\");\r\n}\r\n```\r\nТак это работает вполне пристойно. Конечно выглядит не очень, но проблема решаема в рамках текущего стандарта C++.\r\n\r\n\r\n**Antervis, 12 июля 2017, 15:44**\r\nrymis, ваш пример не решает braced-initialization проблему, описанную выше:\r\n```cpp\r\nstring s = \"somestring\";\r\nprint({s.begin(), s.end()});\r\n```\r\nТак не сработает.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805968105/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805984271", + "html_url": "https://github.com/cpp-ru/ideas/issues/202#issuecomment-805984271", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/202", + "id": 805984271, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTk4NDI3MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T16:45:23Z", + "updated_at": "2021-03-24T16:45:23Z", + "author_association": "MEMBER", + "body": "C С++20 terse syntax для концептов появилась возможность указывать параметры паков, как на точное соответствие\r\n```cpp\r\nvoid exact(std::same_as auto const& ... strings) {}\r\n```\r\nтак и на не точное:\r\n```cpp\r\nvoid inexact(std::convertible_to auto const& ... strings) {}\r\n```\r\nПесочница https://godbolt.org/z/1ThEahxeY\r\n\r\nbraced-initialization правда не разрешён, но это возможно и к лучшему, слишком уж много неоднозначностей появляется", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805984271/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805990150", + "html_url": "https://github.com/cpp-ru/ideas/issues/203#issuecomment-805990150", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/203", + "id": 805990150, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTk5MDE1MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T16:51:44Z", + "updated_at": "2021-03-24T16:51:44Z", + "author_association": "MEMBER", + "body": "**Александр, 7 июля 2017, 13:47**\r\n```cpp\r\n#define until(expr) while(!(expr))\r\n\r\n//usage:\r\nint x = 5;\r\nuntil (x == 0) {\r\n //...\r\n --x;\r\n}\r\n```\r\n\r\n**Павел Ольховиков, 7 июля 2017, 14:13**\r\ncroessmah, при принятии стандартов, во всю происходит борьба с препроцессором, а вы предлагаете такое кощунство?\r\nКроме того, использование слова until не в лучшую сторону влияет на восприятие кода, потому что внимание программиста заточено на поиск таких ключевых слов, как while, а я лишь предлагаю одним символом удобно менять его поведение.\r\nМое предложение позволяет создать удобное единое синтаксическое средство, понятное всем, использование макросов в данном случае наносит куда больше вреда, нежели вариант while(!(expr)).\r\nВаш вариант практически не обладает преимуществами, описанным в статье.\r\n\r\n\r\n**Александр, 7 июля 2017, 20:12**\r\nПавел Ольховиков, while !() - намного хуже, конечно же, это моё мнение. А еще нужно будет do {} while !(). Следом будет вопрос почему нет if !(). Что касается until, то есть языки с таким кейвордом, так что те, кто знаком с подобным, поймут в чем дело. Лично мне проще видеть один вариант while - while(!(expr)).\r\n\r\n\r\n**Павел Ольховиков, 8 июля 2017, 10:53**\r\ncroessmah, знаете, что в нем хорошего? Его значение очевидно даже тем, кто не будет знать о возможности такой конструкции, и это практически не изменяет существующий синтаксис, разве что позволяет вынести один оператор за основные скобки, позволяя уменьшить их количество.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805990150/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805993835", + "html_url": "https://github.com/cpp-ru/ideas/issues/204#issuecomment-805993835", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/204", + "id": 805993835, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTk5MzgzNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T16:56:22Z", + "updated_at": "2021-03-24T16:56:22Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 12 июля 2017, 12:04**\r\nА такой вариант вас устроит:\r\n```cpp\r\ntemplate \r\nstruct dma: std::reference_wrapper {\r\n dma() noexcept\r\n : std::reference_wrapper{ *reinterpret_cast(A) }\r\n {}\r\n\r\n template \r\n explicit dma(U&& u) noexcept(is_nothrow_assignable_v)\r\n : std::reference_wrapper{ *reinterpret_cast(A) }\r\n {\r\n *this = std::forward(u);\r\n }\r\n};\r\n\r\n// Usage:\r\ndma<405338, std::uint32_t> var;\r\ndma<40583, std::uint32_t> var = 100;\r\n```\r\nБонусом можно будет навешать static_assert на alignment и платформо специфичные допустимые диапазоны адресов.\r\n\r\n\r\n**avraliov.andrey, 12 июля 2017, 15:25**\r\nyndx-antoshkka, Спасибо за ответ. Да это вариант, сам пользую подобные вещи. Это можно запихать в либу. Но! количество кода с читаемостью и последующим сопровождением на лицо. Страуструп на Cppcon2016 сам сказал что нужен компромисс между фичами в языки и библиотеках. Одни дают экспрессивность языка, другие время компиляции. Мне кажется что мой любимый С++ (как один из основных языков в этом программирования железа) ДОЛЖЕН делать это просто и дубово, с проверкой типа, что это не просто int, а адрес на уровне языка. Развитие темы мне кажется это так же как ada - простой синтаксис для битовых полей указанной переменной (насколько я зная битоые поля в c++ оставлены на откуп разработчика компилятора.).\r\nв ada:\r\nfor var at 0 range 0 .. 3;\r\nчто означает в переменной var в нулевом байте использовать только первые четыре бита.\r\nВсе с гарантией от стандарта на уровне языка.\r\n\r\nКак это будет выглядеть на С++ мы с вами представляем!!! Разница есть\r\n\r\n\r\n**yndx-antoshkka, 12 июля 2017, 15:43**\r\navraliov.andrey, предлагаю продумать следующую идею:\r\n\r\n\"Набор функций и классов, полезных для embedded разработки.\"\r\n\r\nДавайте соберём побольше полезных классов/конструкций языка и напишем proposal сразу на добавление их всех. Если есть уже готовая популярная библиотека - дайте на неё ссылку, задача упростится :)\r\n\r\n\r\n**avraliov.andrey, 12 июля 2017, 16:43**\r\nyndx-antoshkka, Библиотек таких не видел. Много embedded кода вежде на обычном С. Энтузиасты С++ выкручиваются сами способами типа вашего. Лично я пока не вижу способа решить проблему без дополнения именно синтаксиса языка, но я программист любитель (по профессии я врач), до уровня Антона Полухина мне не угнаться. Но если вы с высоты своего опыта видите что это реально сделать имеющимися средствами хотя бы С++17, то скажите. Я буду думать, искать и пробовать. И на какой площадке обсуждать, куда присылать?\r\n\r\n\r\n**yndx-antoshkka, 12 июля 2017, 17:16**\r\navraliov.andrey, обсуждать стоит здесь, присылать сюда же :)\r\n\r\nУ меня нет особого опыта в embedded разработке, я не знаю типичных задач и проблем embedded разработчика. Так что нужен человек, который будет активно жаловаться на что, чего ему не хватает в C++\r\n\r\n\r\n**avraliov.andrey, 12 июля 2017, 18:08**\r\nyndx-antoshkka, Ну мне после приобретенного опыта в ada программировании стало очевидно, что в С++ нужен способ удобного и гарантированного назначения адреса переменным, удобная и гарантированная работа с битовыми полями.\r\nчто бы можно было написать:\r\n```cpp\r\ntypename enable_t;\r\nfor enable using size 1; //(bit)\r\n\r\ntypename reset_t;\r\nfor reset using size 1; //(bits)\r\n\r\ntypename data_t;\r\nfor data using size 8; //(bits)\r\n\r\nstruct status_register\r\n{\r\n enable_t en;\r\n reset_t res;\r\n data_t data;\r\n};\r\nfor status_register using size 16;\r\nfor status_register using address 34657678;\r\nfor status_register.en using range 0..1;\r\nfor status_register.reset using range 1..2;\r\nfor status_register.data using range 8..15;\r\n```\r\nНа выходе получаем регистр с адресом и использьванием только нужных битов:\r\n1100000011111111 по адресу ххх.\r\n\r\nЧитаемость и программируемость как мне кажется на высоте.\r\n\r\nЕсли битовые операции делать через |= &= ~=, то мне кажется это уже не с++ а галимый С, от которого мы вроде пытаемся уйти в сторону типобезопастности , читаемости, выразительности...\r\n\r\n\r\n**yndx-antoshkka, 13 июля 2017, 17:08**\r\navraliov.andrey, Да, c полями битов в стандарте так себе:\r\n\r\n[class.bit] Allocation of bit-fields within a class object is implementation-defined. Alignment of bit-fields is implementation-defined.\r\n\r\nНадо подумать, как это исправить, ничего не разломав. По идее нужен специальный синтаксис, который говорит что биты идут строго в том порядке, что написали\r\n\r\n\r\n**avraliov.andrey, 17 июля 2017, 9:46**\r\nyndx-antoshkka, абсолютно с вами согласен!!!\r\n\r\n\r\n**avraliov.andrey, 23 июля 2017, 20:15**\r\nyndx-antoshkka, нашел в инете интересное решение. Не то что хотелось бы в идеале но тем не менее.\r\n```cpp\r\n#include \r\n#include \r\n#include \r\n\r\ntemplate \r\nstruct MinimumTypeHelper {\r\ntypedef\r\n typename std::conditional::type>::type>::type>::type>::type type;\r\n};\r\n\r\ntemplate \r\nclass BitField {\r\nprivate:\r\n enum {\r\n Mask = (1u << Bits) - 1u\r\n };\r\n\r\n typedef typename MinimumTypeHelper::type T;\r\npublic:\r\n template \r\n BitField &operator=(T2 value) {\r\n value_ = (value_ & ~(Mask << Index)) | ((value & Mask) << Index);\r\n return *this;\r\n }\r\n\r\n operator T() const { return (value_ >> Index) & Mask; }\r\n explicit operator bool() const { return value_ & (Mask << Index); }\r\n BitField &operator++() { return *this = *this + 1; }\r\n T operator++(int) { T r = *this; ++*this; return r; }\r\n BitField &operator--() { return *this = *this - 1; }\r\n T operator--(int) { T r = *this; --*this; return r; }\r\n\r\nprivate:\r\n T value_;\r\n};\r\n\r\ntemplate \r\nclass BitField {\r\nprivate:\r\n enum {\r\n Bits = 1,\r\n Mask = 0x01\r\n };\r\n\r\n typedef typename MinimumTypeHelper::type T;\r\npublic:\r\n BitField &operator=(bool value) {\r\n value_ = (value_ & ~(Mask << Index)) | (value << Index);\r\n return *this;\r\n }\r\n\r\n explicit operator bool() const { return value_ & (Mask << Index); }\r\n\r\nprivate:\r\n T value_;\r\n};\r\n\r\nunion reg\r\n{\r\n std::uint32_t raw;\r\n BitField<0,1> en;\r\n BitField<1,1> rst;\r\n BitField<5,3> data;\r\n};\r\n\r\nint main()\r\n{\r\n reg my_reg;\r\n\r\n my_reg.data = 4;\r\n\r\n return 0;\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805993835/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805995680", + "html_url": "https://github.com/cpp-ru/ideas/issues/205#issuecomment-805995680", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/205", + "id": 805995680, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTk5NTY4MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T16:58:55Z", + "updated_at": "2021-03-24T16:58:55Z", + "author_association": "MEMBER", + "body": "**Antervis, 13 июля 2017, 12:40**\r\nобычно проверка против nullptr обрабатывается как-то иначе, нежели \"ничего не делать\".\r\n\r\n\r\n**x4mmm, 14 июля 2017, 11:51**\r\nAntervis,\r\n1. Замена отсутствуюего значения на значение по умолчанию\r\n2. Вызов события у объёкта при наличии объекта\r\n3. Создание временного объекта при его отсутствии, различные варианты Lazy поведения\r\n\r\nЭтот proposal из C#, там точно также много лет были аргументы - \"null всегда нужно обрабатывать не через nop\". Фича появилась и ей все очень довольны.\r\n\r\nДа, она нужна не для ООП а для т.н. \"языков работы с объектами\", когда человек вызывает незнакомое ему API в стиле \"пархающей кувалды\". Но эта фича существенно упрощает написание программ, исследюущих это API. И не открывает большого количества путей для новых багов.\r\n\r\n\r\n**dix75, 28 июля 2017, 11:14**\r\nПовтор #124", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/805995680/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/806001516", + "html_url": "https://github.com/cpp-ru/ideas/issues/206#issuecomment-806001516", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/206", + "id": 806001516, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNjAwMTUxNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T17:06:47Z", + "updated_at": "2021-03-24T17:06:47Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 2 августа 2017, 15:29**\r\nОтличная идея! Желающие заняться ей - пишите, тут надо будет прежде всего обсудить с автором библиотеки https://github.com/boostorg/callable_traits , у него уже есть предложенные вами вещи http://boostorg.github.io/callable_traits/doc/html/index.html\r\n\r\n\r\n**Antervis, 7 августа 2017, 6:01**\r\nyndx-antoshkka, получается, надо реализовать conversion functions, попробовать просунуть их в буст, а там как пойдет?\r\n\r\n\r\n**yndx-antoshkka, 7 августа 2017, 18:11**\r\nAntervis, Библиотека https://github.com/boostorg/callable_traits уже почти принята в Boost и её хотят перетащить в стандарт С++.\r\n\r\nНачать стоит с того, что убедиться что всё необходимое есть в этой библиотеке http://boostorg.github.io/callable_traits/doc/html/index.html\r\n\r\nЕсли чего-то не хватает - попробовать добавить через pull request\r\nЕсли уже всё необходимое есть - либо маякнуть чтобы я познакомил вас с разработчиком библиотеки, либо самому связаться с автором библиотеки и предложить ему свою помощь с продвижением в стандарт.\r\n\r\n\r\n**Antervis, 8 августа 2017, 5:48**\r\nyndx-antoshkka, в этой библиотеке есть преобразования типов, но отсутствуют функции преобразования самих callable объектов", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/806001516/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/806003481", + "html_url": "https://github.com/cpp-ru/ideas/issues/207#issuecomment-806003481", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/207", + "id": 806003481, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwNjAwMzQ4MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-24T17:09:34Z", + "updated_at": "2021-03-24T17:09:34Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 20 июля 2017, 13:36**\r\nА как вы собираетесь работать с этими файлами в програме?\r\n\r\n\r\n**Сергей Ковалёв, 20 июля 2017, 17:29**\r\nyndx-antoshkka, в какой программе? vim some.hpp.gz\r\n```cpp\r\nВ исходниках это должно выглядеть так же как и без архива\r\n// main.cpp\r\n#include \"some.hpp\"\r\n#include \"include/header.h\"\r\n```\r\n\r\nЕсли лежат два и более архива с одни именем ругаться на этапе компиляции.\r\n\r\n\r\n**yndx-antoshkka, 20 июля 2017, 17:43**\r\nСергей Ковалёв, вы предлагаете плохую версию модулей http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4667.pdf\r\n\r\n\r\n**Сергей Ковалёв, 24 июля 2017, 15:28**\r\nyndx-antoshkka, нет я предлагаю вместо гигабайта исходников иметь 100мб\r\n\r\n\r\n**Александр, 25 июля 2017, 14:18**\r\nСергей Ковалёв, но вместо 10 часов компиляции ждать 30 часов?\r\n\r\n\r\n**Сергей Ковалёв, 27 июля 2017, 22:32**\r\ncroessmah, Вот тут вы не правы скорость может даже вырасти.\r\n\r\n\r\n**dix75, 28 июля 2017, 11:08**\r\ncroessmah,\r\nну это вы махнули.\r\n\r\n\r\n**yndx-antoshkka, 2 августа 2017, 15:25**\r\nСергей Ковалёв, смотрите, модуль это исходники, которые были:\r\n1) обработаны препроцессором\r\n2) разобраны компилятором\r\n3) превращены в бинарное представление, удобное для использования компилятором\r\n4) дополнительно обработаны с выкидыванием\\скрытием приватных частей\r\n5) сохранены на диск одним файлом, возможно со сжатием\r\n\r\nВы предлагаете только пункт 5), хотя очень много времени тратится на части 1) и 2). Часть 4) может дополнительно ускорить компиляцию и линковку. Модули так же сильно уменьшают размер объектных файлов и соответственно ускоряют время линковки.\r\n\r\nМодули уже на подходе, скоро вы сможете ими воспользоваться.\r\n\r\n\r\n**d-yaroshev, 28 июля 2017, 23:56**\r\nНу, кстати, если это не zip архив, а архивация знающая про компиляцию и язык, то мб может. Только мне кажется, что модули - это в тот огород. Вообще интересно - какое соотношение между размерами исходников и файлами модулей. Мб можно выкачивать только часть исходников из репозиториев? (распаковывать из архивов)?\r\n\r\n\r\n**Сергей Ковалёв, 1 августа 2017, 22:53**\r\nБольшая часть исходников лежит не изменной и занимает много места\r\nи представляет огромное количество мелких и не очень файлов.\r\nКоторые на диске могут храниться кластерами и не локально.\r\nБолее того большинство файловых систем не гарантируют\r\nцелостность данных.\r\n\r\nСкопировать 100 тыс файлов по 5кб и один файл в 50Мб - есть разница?.\r\nДаже обычный lzma может упаковать текст в 10раз.\r\nНапример один файл boost_1_64.7z занимает 67Мб\r\nРаспаковывается в 55тыс файлов и 5тыс папок.\r\nРаспакованный размер 7.4 раза больше ~500Мб\r\nИ реально в 10раз больше на диске ~640Mb\r\n\r\nИ потом еще может несколько гигов накомпилировать объектников, либ,\r\npdb файлов и других отходов которые упаковываются в разы.\r\n\r\nЗачем нагружать дисковую систему если есть мощные многоядерные процессоры.\r\n\r\n\r\n**Will Code For Food, 25 октября 2017, 16:34**\r\narchivemount", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/806003481/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808005246", + "html_url": "https://github.com/cpp-ru/ideas/issues/208#issuecomment-808005246", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/208", + "id": 808005246, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAwNTI0Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T07:33:44Z", + "updated_at": "2021-03-26T07:33:44Z", + "author_association": "MEMBER", + "body": "**Александр, 24 июля 2017, 19:37**\r\n_msize, как видно из описания, может возвращать значение больше, чем Вы запросили памяти.\r\nЕсли отталкиваться от реализации, когда число выделенных элементов (там хранится число элементов, для корректного вызова деструкторов, а не количество выделенных байт) хранится перед выдаваемым пользователю участком памяти, то, даже для этой реализации, не ясно что делать для одного элемента, т.е. когда память выделялась с помощью new, а не new[].\r\n\r\n\r\n**Дмитрий, 28 июля 2017, 15:02**\r\ncroessmah, выбирать в любом случае уже приходится, между delete и delete[]. Разумеется должно быть и два варианта метода определения выделенной памяти.\r\n\r\n\r\n**Александр, 24 июля 2017, 19:42**\r\nТакже стоит учитывать, что operator new может быть перегружен.\r\n\r\n\r\n**Павел, 27 июля 2017, 20:32**\r\nобычно, когда предлагают сделать что-то более корсс платформенным, предъявляют, что на большинстве платформ это и так уже есть. вы показали способ для шиндошс, но для других платформ я что-то не знаю такого. буду очень рад узнать, если такое возможно на FreeBSD, например.\r\n\r\nопять же, что делать, если прилинкован странный malloc?\r\n\r\n\r\n**Дмитрий, 28 июля 2017, 15:00**\r\n> когда предлагают сделать что-то более корсс платформенным\r\nЯ не предлагаю сделать что-то более кроссплатформенным.\r\n> о для других платформ я что-то не знаю такого\r\nДля других платформ никто и не знает, потому что решения нет, и об этом я и пишу.\r\n> что делать, если прилинкован странный malloc?\r\nТогда должен быть прилинкован и странный free и странный .... get_heap_block_size.\r\n\r\n\r\n**yndx-antoshkka, 2 августа 2017, 15:14**\r\nБлизкое по теме обсуждение вот тут https://stdcpp.ru/proposals/3b0072f1-61f2-4b78-beab-9d3e1bacfe51\r\n\r\nНужен прототип, работающий на большинстве платформ. И нужно показать, что с ним std::vector начинает работать быстрее. И да, тема - огонь :) Помогу с написанием предложения, или сведу с нужными людьми, как будет прототип.\r\n\r\n\r\n**Виктор Губин, 18 марта 2019, 17:35**\r\nОбновлено 22 июля 2020, 9:39\r\n\r\n\r\nЧто делать с placement new ?\r\n\r\n ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808005246/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808006456", + "html_url": "https://github.com/cpp-ru/ideas/issues/209#issuecomment-808006456", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/209", + "id": 808006456, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAwNjQ1Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T07:36:06Z", + "updated_at": "2021-03-26T07:36:06Z", + "author_association": "MEMBER", + "body": "**adamant, 28 июля 2017, 14:45**\r\nЧуть подробнее:\r\nБиблиотека pbds -- гибкий инструмент для работы со сбалансированными двоичными деревьями с возможностью поддержки различного рода метаданных (размеры поддеревьев, какие-то функции от элементов поддерева, задаваемые пользователем), а также базовых операций (split, merge), выполняемых за O(log n). Кроме того, встроенные шаблоны политик включают в себя команды order_of_key и find_by_order, которых сильно недостаёт стандартным set и map.\r\n\r\n\r\n**yndx-antoshkka, 2 августа 2017, 15:08**\r\nСоздать и описать новые контейнеры - это очень тяжёлая работа. Если готовы идти до конца, то для начала обсудите идею на std-proposals форуме (он есть в полезных ссылках на этом сайте).\r\n\r\nС написанием предложения помогу, но основная работа будет на вас.\r\n\r\n\r\n**Alexander Kulkov, 9 августа 2017, 4:05**\r\nА в чём заключается эта основная работа?\r\n\r\n\r\n**yndx-antoshkka, 9 августа 2017, 13:42**\r\nAlexander Kulkov, основная работа заключается в том, чтобы для каждого предложенного контейнера пройтись по секциям [container.requirements.general] и [sequence.reqmts]/[associative.reqmts]/[unord.req] и убедиться что они не нарушают требования для контейнеров. Так же надо будет проанализировать, каких новых фичей не хватает в контейнере (rvalue references, поддержка node, push() возвращающих ссылку или итератор и т.п) и добавить их по возможности.\r\n\r\n\r\n**adamant, 9 августа 2017, 16:40**\r\nhttps://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/O6d0iPVnUhc", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808006456/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808007586", + "html_url": "https://github.com/cpp-ru/ideas/issues/210#issuecomment-808007586", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/210", + "id": 808007586, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAwNzU4Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T07:38:16Z", + "updated_at": "2021-03-26T07:38:16Z", + "author_association": "MEMBER", + "body": "**smertigdon, 31 июля 2017, 20:54**\r\nБыло, забраковали.\r\n#172 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808007586/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808015193", + "html_url": "https://github.com/cpp-ru/ideas/issues/211#issuecomment-808015193", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/211", + "id": 808015193, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAxNTE5Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T07:52:52Z", + "updated_at": "2021-03-26T07:52:52Z", + "author_association": "MEMBER", + "body": "**develoit, 1 августа 2017, 5:28**\r\n```cpp\r\nFoo::Foo(Bar bar)\r\n : a_(bar.a)\r\n , b_(bar.b)\r\n ...\r\n , m_(bar.m)\r\n#if FEATURE_ENABLED\r\n , n_(bar.n)\r\n , x_(bar.x)\r\n#else\r\n , n_(bar.n)\r\n#endif\r\n{}\r\n```\r\nнапример)\r\n\r\n\r\n**yndx-antoshkka, 2 августа 2017, 15:05**\r\nВ комитете недавно обсуждали такое предложение для списков инициализации http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0562r0.pdf . Решили ничего не менять.\r\n\r\nБоюсь что в ближайшее время ещё раз поднимать вопрос бессмысленно.\r\n\r\n\r\n**alexander.y.k, 4 октября 2017, 12:45**\r\nyndx-antoshkka, в приведенном вами документе описан подход к списку инициализации конструкторов, в то время как Anatoly Scheglov преложил расширить такой подход на все списки инициализации. Лично мне не достает такой возможности в спиках аргументов функций, как при их определениях так и при вызовах.\r\n\r\nПри обобщенном написании кода часто приходится вести списки в различных конекстах, особенно с введением constexpr функий и все большей роли шаблонов. Писать обобщенный код стало бы действительно легче.\r\n\r\nПусть обсуждать это будут не скоро, но предложение действительно стоящее.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808015193/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808016150", + "html_url": "https://github.com/cpp-ru/ideas/issues/212#issuecomment-808016150", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/212", + "id": 808016150, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAxNjE1MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T07:54:43Z", + "updated_at": "2021-03-26T07:54:43Z", + "author_association": "MEMBER", + "body": "**d-yaroshev, 1 августа 2017, 0:08**\r\nЕще подумал, что проблему улучшения интерфейсов можно решать делая deprecation старых.\r\n\r\nУсловно говоря, старый алгоритм/контейнер остается но либо перегрузкой либо внутри той же реализации.\r\n\r\nПри этом при переходе на новый стандарт компилятор будет выдавать предупреждение, что данная перегрузка алгоритма/ версия контейнера является deprectaed. Если у пользователей -Werror, то они будут получать ошибку компиляции и большую часть преимуществ Concepts. В противном случае, у них будет переходный период в который будут вычищаться warnings (которые по прежнему будут нести в себе четкую информацию об ошибке),\r\n\r\n\r\n**h4tred, 3 августа 2017, 4:51**\r\nd-yaroshev, выбор реализации вполне можно организовать при помощи inline namespace. Со строками уже так сделано, по крайней мере в GCC: читать про Dual ABI.\r\n\r\n\r\n**d-yaroshev, 6 августа 2017, 14:24**\r\nh4tred, тоже может быть решением, но только для чего-нибудь легко диагностируемого, как более строгих интерфейсов. Изменения, которые могут повлиять на корректность внесут много проблем.\r\n\r\nУ нас был подобный опыт с частичным переездом с set/map на flat_set/flat_map - приходится много вручную проверять.\r\n\r\n\r\n**Евгений Власов, 29 сентября 2017, 15:19**\r\nПри работе с boost меня всегда сильно раздражали вложенные namespace типа\r\n```cpp\r\nboost::asio::serial_port_base::character_size charSize;\r\nboost::asio::serial_port_base::stop_bits stopBit;\r\nboost::asio::serial_port_base::parity pariy;\r\nboost::asio::serial_port_base::flow_control flowControl;\r\nboost::asio::io_service io;\r\n```\r\nДа конечно можно обложиться кучей typedef и using но это жутко не удобно.\r\n\r\n\r\n**yndx-antoshkka, 13 ноября 2017, 12:47**\r\nКомитет решил уходить от использования вложных namespace http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0816r0.pdf", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808016150/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808016796", + "html_url": "https://github.com/cpp-ru/ideas/issues/213#issuecomment-808016796", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/213", + "id": 808016796, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAxNjc5Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T07:55:58Z", + "updated_at": "2021-03-26T07:55:58Z", + "author_association": "MEMBER", + "body": "**d-yaroshev, 1 августа 2017, 0:10**\r\nЯ не очень понял. Имеется в виду что вложенный контейнер будет пользоваться другим аллокатором?\r\n\r\n\r\n**ru.night.beast, 1 августа 2017, 9:03**\r\nd-yaroshev, да", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808016796/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808017630", + "html_url": "https://github.com/cpp-ru/ideas/issues/214#issuecomment-808017630", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/214", + "id": 808017630, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAxNzYzMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T07:57:38Z", + "updated_at": "2021-03-26T07:57:38Z", + "author_association": "MEMBER", + "body": "**Павел, 7 августа 2017, 16:52**\r\nЭто ломает старый код: все 3 func из второго примера возвращают void.\r\nПо поводу первых двух func оттдуда же: обе могли бы вернуть int. Почему существование side effect'а заставит меня писать return явно?\r\n\r\n\r\n**Александр, 7 августа 2017, 22:03**\r\n\"убрать требование к наличию ключевого слова return в её конце.\"\r\nПонравилось, но дальнейшее описание явно ушло в другую сторону.\r\nЯ бы ослабил, убрав UB в случае, когда тип функции явно указан.\r\nНапример, для функции main имеется гарантия того, что в конце return 0;\r\nВозможно, стоит подумать по этому поводу.\r\ntype f()\r\n{\r\n//неявный return type{};\r\n}\r\n\r\nХотя не понятно что делать, например,\r\nс типами, у которых нет дефолтного конструктора.\r\n\r\n\r\n**Antervis, 8 августа 2017, 5:18**\r\nсуть совершенно в другом - чтобы можно было возвращать определенное значение из функции, без ключевого слова return.\r\n\r\n\r\n**Александр, 8 августа 2017, 8:49**\r\nAntervis, на мой взгляд это не нужно, ничего кроме запутанности,\r\nухудшения читаемости и багов это не даст.\r\n\r\n\r\n**Antervis, 8 августа 2017, 5:44**\r\nподумал и нашел способ не ломать существующий код:\r\nauto func(int i) { return i + 5; }\r\nauto func(int i) { i + 5 }\r\nЕсли последний оператор функции не заканчивается точкой с запятой, к нему \"добавляется\" неявный return. Т.е. две функции сверху идентичны. Второй код (предложенный синтаксис) не должен компилироваться с текущим стандартом\r\n\r\n\r\n**Andrey Strelkov, 29 сентября 2017, 0:05**\r\nЧисто субъективно - мне не нравится. Например, в каком-нибудь шаблонном коде (особенно SFINAE) одна невнимательность может привести к совершенно невероятным последствиям. В случае с точкой с запятой ещё хуже - одна опечатка вместо ошибки компиляции приведет к часам вставок static assert'ов, чтобы определить в каком из десятка шаблонов что-то пошло не так.\r\nНа самом деле, мне интересно обратное - почему даже в случае явно указанного типа возвращаемого значения, мой gcc не ругается на отсутствие return в нем.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808017630/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808018322", + "html_url": "https://github.com/cpp-ru/ideas/issues/215#issuecomment-808018322", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/215", + "id": 808018322, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAxODMyMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T07:58:56Z", + "updated_at": "2021-03-26T07:58:56Z", + "author_association": "MEMBER", + "body": "**Павел, 7 августа 2017, 17:01**\r\nНа данный момент, если написать make_shared (где C -- класс с приватным конструктором), мы получим от компилятора стек из восьми функций (на моей версии libstdc++), вызываемых внутри make_shared. Верхняя функция -- __gnu_cxx::new_allocator::construct. Должно ли быть у неё разрешение на вызов приватного конструктора C? А у остальных семи промежуточных функций?\r\n\r\nКак ваше предложение могло бы быть реализованно в стандарте и в компиляторах? Мне абсолютно не понятен механизм :(\r\n\r\n\r\n**Antervis, 15 августа 2017, 14:03**\r\nможно добавить специализацию make_shared как friend\r\n\r\n\r\n**yndx-antoshkka, 15 августа 2017, 14:24**\r\nAntervis, не поможет. Нужно ещё добавить allocate_shared и возможно какие-то внутренности конкретной имплементации стандартной библиотеки.\r\n\r\n\r\n**Дмитрий, 16 августа 2017, 9:50**\r\nМожно просто сконструировать объект снаружи и засунуть его как rvalue в make_shared. В C++17 при этом не должно произойти ни копирования, ни переноса.\r\n\r\n\r\n**yndx-antoshkka, 16 августа 2017, 13:32**\r\ndmitriy@izvolov.ru, вы подняли очень интересную тему! В данный момент так не работает https://godbolt.org/g/V3edfK . Если сделать чтобы работало - будет ооочень круто, rvalue будут более легковесными и будут работать с copy elision.\r\n\r\nОднако это поменяет порядок следования вызовов. И может быть неприятно в ряде случаев. Я обдумаю и обсужу с разработчиками компиляторов.\r\n\r\n\r\n**Дмитрий, 16 августа 2017, 14:57**\r\nyndx-antoshkka, действительно, как-то я слишком оптимистично отнёсся к \"copy elision\". Но с интересом жду результатов обдумывания и обсуждения.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808018322/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808019087", + "html_url": "https://github.com/cpp-ru/ideas/issues/216#issuecomment-808019087", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/216", + "id": 808019087, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAxOTA4Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:00:25Z", + "updated_at": "2021-03-26T08:00:25Z", + "author_association": "MEMBER", + "body": "**Antervis, 9 августа 2017, 5:47**\r\nдля этого (как и в случае с std::tie) можно использовать std::ignore\r\n\r\n\r\n**Антон Бикинеев, 14 ноября 2017, 15:16**\r\nstd::ignore не работает с structured bindings. Авторы не включили идею игнорирования подобъектов, потому что она является частным случаем паттерн-матчинга. Лучше не добавлять ad-hoc решение с std::ignore, а дождаться более обобщенного паттерн-матчинга. Подробнее в самом пропозале: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0144r2.pdf", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808019087/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808020556", + "html_url": "https://github.com/cpp-ru/ideas/issues/217#issuecomment-808020556", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/217", + "id": 808020556, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAyMDU1Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:02:56Z", + "updated_at": "2021-03-26T08:02:56Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 9 августа 2017, 13:34**\r\nЕсли и исправлять эту проблему, то через deduction giudes. Тогда можно будет писать:\r\n\r\nauto upBuf = std::unique_ptr(data, &std::free);\r\n\r\nВ данный момент в стандарте явно запрещено использовать deduction guide для большинства конструкторов unique_ptr. Лично я на заседании яро боролся за запрет использования deduction guide для конструкторов с одним параметром, т.к. если не указывать deleter то нет возможности различить\r\n```cpp\r\nauto up_array = std::unique_ptr(new int[100});\r\nauto up_1element = std::unique_ptr(new int);\r\n```\r\nВ итоге немного перестраховались, и пока что запретили deduction guide для всех конструкторов, принимающих pointer.\r\n\r\nЕсли есть желание - помогу с написанием proposal для добавления необходимого deduction guide.\r\n\r\nОднако там непросто, и надо продумать все ситуации. Вот параграфы 9-15 [unique.ptr.single.ctor], которые нужно осознать и доработать :\r\n```\r\nThe signature of these constructors depends upon whether D is a reference type. If D is a non-reference\r\ntype A, then the signatures are:\r\nunique_ptr(pointer p, const A& d) noexcept;\r\nunique_ptr(pointer p, A&& d) noexcept;\r\n\r\nIf D is an lvalue reference type A&, then the signatures are:\r\nunique_ptr(pointer p, A& d) noexcept;\r\nunique_ptr(pointer p, A&& d) = delete;\r\n\r\nIf D is an lvalue reference type const A&, then the signatures are:\r\nunique_ptr(pointer p, const A& d) noexcept;\r\nunique_ptr(pointer p, const A&& d) = delete;\r\n\r\nRemarks: If class template argument deduction (16.3.1.8) would select a function template corresponding to either of these constructors, then the program is ill-formed.\r\n```\r\n\r\n**Yaroslav, 10 августа 2017, 15:46**\r\nyndx-antoshkka, ок , разберусь в deduction guide, осмыслю параграфы из стандарта по unique_ptr на выходных. Честно говоря, я в начале пути осознания STL, и никогда не оформлял proposal, но хотелось бы уделить этому время.\r\n\r\n\r\n**Antervis, 11 августа 2017, 10:29**\r\nyndx-antoshkka, но мы же можем определить deduction guide для конструктора с двумя аргументами, например так:\r\n```cpp\r\ntemplate ()(declval()))>\r\nunique_ptr(T*, Deleter &&) -> unique_ptr;\r\n```\r\n\r\n**Andrey Davydov, 11 августа 2017, 13:27**\r\nAntervis, в таком случае unique_ptr(new int[1], default_delete) выведется в unique_ptr вместо unique_ptr, а unique_ptr(malloc(1), free) выведется в unique_ptr вместо unique_ptr.\r\n\r\n\r\n**Andrey Davydov, 11 августа 2017, 14:06**\r\nyndx-antoshkka, мне, кажется, удалось создать рабочие deduction guides, ценой введения дополнительного customization point'а `deleter_applicable_to_array`: https://github.com/AndreyG/unique-ptr-deduction-guides Буду рад любым комментариям от всех заинтересованных.\r\n\r\n\r\n**yndx-antoshkka, 11 августа 2017, 14:43**\r\nAndrey Davydov, надо постараться максимально упростить эти guides.\r\n\r\n* Как мне кажется, новая customization point, чисто для deduction guides, не пройдёт. Так что стоит забить на случай unique_ptr и не мучаться. Ну не будет у пользователя operator[] b kflyj - пусть пользуется make_unique для этого случая.\r\n* Вот тут есть риск получить unique_ptr, что скорее всего не то, что хотел пользователь https://github.com/AndreyG/unique-ptr-deduction-guides/blob/master/deduction_guides.h#L56\r\n\r\n\r\n**Andrey Davydov, 11 августа 2017, 15:04**\r\nyndx-antoshkka,\r\n\r\n> Как мне кажется, новая customization point, чисто для deduction guides, не пройдёт.\r\n\r\nОк, а если определить у default_delete typedef `applicable_to_array` по аналогии c less::is_transparent? Это же будет совсем не инвазивно.\r\n\r\n> Вот тут есть риск получить unique_ptr\r\n\r\nвроде не должно быть, я же проверяю is_object_v; is_object_v == false.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808020556/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808021933", + "html_url": "https://github.com/cpp-ru/ideas/issues/218#issuecomment-808021933", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/218", + "id": 808021933, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAyMTkzMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:05:27Z", + "updated_at": "2021-03-26T08:05:27Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 сентября 2018, 11:49**\r\nСсылки на имплементации из аналогичного предложения:\r\n\r\nhttps://stackoverflow.com/questions/10839747/istream-vs-memory-mapping-a-file\r\n\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2044.html\r\n\r\nhttps://github.com/mandreyel/mio\r\n\r\n ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808021933/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808023286", + "html_url": "https://github.com/cpp-ru/ideas/issues/219#issuecomment-808023286", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/219", + "id": 808023286, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAyMzI4Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:08:05Z", + "updated_at": "2021-03-26T08:08:05Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 18 августа 2017, 20:16**\r\nЭто же будет breaking change? Рассмотрим, скажем, такой код (по сравнению с std::map в класс MyMap добавлен константный operator[]).\r\n```cpp\r\ntemplate\r\nstruct MyMap\r\n{\r\n /// @throw std::out_of_range if map doesn't contain \\p k\r\n V const & operator[] (K const & k) const;\r\n\r\n /// @return reference to default constructed element if map doesn't contain \\p k\r\n V operator[] (K const & k);\r\n};\r\n\r\nvoid foo(MyMap const & map)\r\n{\r\n auto lambda = [map] () {\r\n std::cout << map[239];\r\n };\r\n}\r\n```\r\nЕсли принять Ваше предложение семантика lambda поменяется.\r\n\r\n\r\n**Антон, 18 августа 2017, 20:37**\r\nAndrey Davydov,\r\nпо моему предложению код\r\n```cpp\r\nauto lambda = [map] () {\r\n std::cout << map[239];\r\n};\r\n```\r\nи не должен работать, должен\r\n```cpp\r\nauto lambda = [map] () mutable {\r\n std::cout << map[239];\r\n};\r\n```\r\n\r\n\r\n**Andrey Davydov, 18 августа 2017, 20:49**\r\nanton_lashkov, но если mutable уже был (для модификации какой-то другой переменной), то map[239] ведь начнет работать по другому?\r\n\r\n\r\n**Антон, 18 августа 2017, 21:09**\r\nAndrey Davydov, да, еще раз взглянув на пример, я понял о чем вы, обратной совместимости не будет.\r\n\r\n\r\n**Andrey Davydov, 18 августа 2017, 21:15**\r\nanton_lashkov, значит, ни за что не примут, но если б изначально работало как Вы предлагаете, было бы клево.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808023286/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808024317", + "html_url": "https://github.com/cpp-ru/ideas/issues/220#issuecomment-808024317", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/220", + "id": 808024317, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAyNDMxNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:09:56Z", + "updated_at": "2021-03-26T08:09:56Z", + "author_association": "MEMBER", + "body": "**smertigdon, 18 августа 2017, 18:08**\r\nКхм..\r\n__FUNC__ - это макрос, раскрывающийся в имя функции во время препроцессирования, то есть в строковый литерал. Вычисления же constexpr выражений идут на стадии компиляции, то есть после препроцессирования. Всё должно работать, в чём же проблема?\r\n\r\n\r\n**WPMGPRoSToTeMa, 18 августа 2017, 18:28**\r\nsmertigdon, __func__ это статическая переменная определённая в каждой функции.\r\nhttp://en.cppreference.com/w/cpp/language/function#func\r\n\r\n\r\n**smertigdon, 18 августа 2017, 20:32**\r\nWPMGPRoSToTeMa, не знал. Век живи, век учись. Пока не приняли proposal, можно и __FUNC__ пользоваться.\r\n\r\n\r\n**Andrey Davydov, 18 августа 2017, 20:02**\r\n__func__ является constexpr (static const для этого достаточно). Следующий код благополучно скомпилируется.\r\n```cpp\r\n#include \r\n\r\nvoid foo()\r\n{\r\n static_assert(std::size(__func__) == 4);\r\n}\r\n```\r\n\r\n**WPMGPRoSToTeMa, 18 августа 2017, 20:29**\r\nAndrey Davydov, нет, недостаточно. https://godbolt.org/g/Sg9U3i\r\n\r\n\r\n**smertigdon, 18 августа 2017, 20:31**\r\nAndrey Davydov, std::size прокатит с любыми массивами, так что не аргумент :)\r\n\r\n\r\n**Andrey Davydov, 18 августа 2017, 20:42**\r\nWPMGPRoSToTeMa, действительно, я был не прав. Интересно, что gcc выдает ошибки во 2-м и 4-м случае, а Clang и MSVC только во 2-м, т.е., они уже определяют __func__ как constexpr.\r\n\r\n\r\n**yndx-antoshkka, 19 августа 2017, 19:57**\r\nAndrey Davydov, вот тут сделана работа с __func__ подобными макросами на этапе компиляции портабельно (но страшно) https://github.com/boostorg/type_index/blob/develop/include/boost/type_index/detail/compile_time_type_info.hpp\r\n\r\nА вообще стоит поисследовать вопрос, разобраться - ошибка это GCC или правильное поведение, и если необходимо - написать proposal. Если готовы заняться - всячески помогу.\r\n\r\n\r\n**yndx-antoshkka, 21 августа 2017, 12:53**\r\nНасколько я понял из стандарта С++, \"static const auto a = constant_expression\" должно порождать переменную, которую можно использовать в constexpr.\r\n\r\nЗавёл два тикета, посмотрим что скажут разработчики компиляторов:\r\n* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81911\r\n* https://bugs.llvm.org/show_bug.cgi?id=34253\r\n\r\n\r\n**Дмитрий Назаров, 6 октября 2017, 19:21**\r\nУ GCC была похожая ситуация с __PRETTY_FUNCTION__. Скажем в GCC 4.7 его нельзя было использовать в contexpr функциях. В то же время уже в GCC 4.8 вполне себе применим. Вообще говоря неплохо бы в стандарт внести ее аналог, так как __FUNC__ не учитывает в имени функции ее пространство имен, в то время как __PRETTY_FUNCTION__ - да.\r\n\r\n\r\n**yndx-antoshkka, 9 октября 2018, 15:24**\r\nОбновили список проблем в ядре языка. Теперь там есть и бага из этого предложения: [__func__ should be constexpr](http://open-std.org/JTC1/SC22/WG21/docs/cwg_active.html#2362)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808024317/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808025146", + "html_url": "https://github.com/cpp-ru/ideas/issues/220#issuecomment-808025146", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/220", + "id": 808025146, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAyNTE0Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:11:26Z", + "updated_at": "2021-03-26T08:11:26Z", + "author_association": "MEMBER", + "body": "Нужно писать proposal https://wg21.link/cwg2362", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808025146/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808026109", + "html_url": "https://github.com/cpp-ru/ideas/issues/221#issuecomment-808026109", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/221", + "id": 808026109, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODAyNjEwOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:13:10Z", + "updated_at": "2021-03-26T08:13:10Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 21 августа 2017, 12:59**\r\nМне идея нравится. Если нужна помощь с написанием proposal - говорите, помогу.\r\n\r\n\r\n**Antervis, 23 августа 2017, 6:42**\r\nА может имеет смысл сразу ориентироваться на Concepts && Ranges? В том плане, что два контейнера разных типов (vector, list) тоже могут сравниваться лексикографически. Что-то вроде inline bool operator == (const Container &lhs, const Container &rhs) { return equal(lhs,rhs); }\r\n\r\n\r\n**yndx-antoshkka, 23 августа 2017, 11:28**\r\nAntervis, стоит проработать оба варианта и дать комитету выбор между \"для каждого контейнера добавляем операторы сравнения\" и \"операторы сравнения для всех контейнеров сразу\"\r\n\r\n\r\n**Antervis, 24 августа 2017, 4:55**\r\nyndx-antoshkka, так ведь одно является подмножеством второго\r\n\r\n\r\n**Will Code For Food, 25 октября 2017, 14:40**\r\n> Есть ощущение, что данную идею можно развить и дальше, например, на конструкторы копирования, операторы присваивания\r\n\r\nНельзя развить дальше. Конструктор копирования и оператор присваивания не может быть шаблонным.\r\n\r\n\r\n**Will Code For Food, 25 октября 2017, 16:50**\r\n> Есть ощущение, что данную идею можно развить и дальше, например, на конструкторы копирования\r\n\r\nДобавлю ещё, что есть темплейтный конструктор, принимающий input-итераторы. Хоть вектором с другим аллокатором инициализируйте, хоть другим контейнером.\r\nНу а про std::equal уже написали.\r\n\r\nСравнение и инициализацию ещё со времён C++98 можно делать гораздо более общим способом, чем просто не различая аллокаторы у контейнеров одного и того же вида.\r\n\r\n\r\n**yndx-antoshkka, 16 февраля 2018, 12:32**\r\nПоявился proposal на эту тему: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0805r1.html", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808026109/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808048092", + "html_url": "https://github.com/cpp-ru/ideas/issues/222#issuecomment-808048092", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/222", + "id": 808048092, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODA0ODA5Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:53:26Z", + "updated_at": "2021-03-26T08:53:26Z", + "author_association": "MEMBER", + "body": "**webreh, 18 сентября 2017, 17:54**\r\nСовершенно не очевидно, должно ли быть сообщение правой части инстанцировано при выполнении условия, как должно проверяться и что должно происходить, если инстанцирование сообщения об ошибке приводит к провалу или новому сообщению об ошибке\r\n\r\n\r\n**smertigdon, 28 ноября 2017, 11:53**\r\nwebreh, вопрос хороший, но проблем особых не вижу. На данный момент инстанцирование чего-либо в compile-time **не должно** иметь побочных эффектов. Все хаки, опирающиеся на факт инстанцирования - дефекты стандарта (привет, friend+loophole). Я к тому, что выбор между инстанцированием правой части всегда или только при срабатывании assert'а - это лишь вопрос вкуса, на который нужно один раз ответить.\r\nЛично я пока не вижу причин против инстанцирования только при срабатывании. Пытаемся инстанцировать правую часть - ну отлично. Возникла ошибка при инстанцировании? Прерываем. В чём отличие от рекурсивного инстанцирования шаблонов?\r\n\r\nАлгоритм элементарный:\r\n0. *Что-нибудь инстанцируем, наткнулись на static_assert*\r\n1. Если первый аргумент static_assert'а вычислился с результатом true, goto 4. Иначе, вычисляем второй аргумент.\r\n2. Пытаемся вычислить второй аргумент static_assert'а. Если в процессе попадём на static_assert, goto 0.\r\n3. Выводим в консоль вычисленную строку и прерываем компиляцию.\r\n4. Продолжаем вычисления/компиляцию\r\n\r\nДа, можно зациклиться. Впрочем, template-depth тоже придуман не просто так :)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808048092/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808049057", + "html_url": "https://github.com/cpp-ru/ideas/issues/223#issuecomment-808049057", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/223", + "id": 808049057, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODA0OTA1Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:55:02Z", + "updated_at": "2021-03-26T08:55:02Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 29 сентября 2017, 11:56**\r\nА как Вы себе представляете сигнатуру такого конструктора? Его template headers должна же будет содержать переменное число template parameter packs, как это можно выразить на C++?\r\n\r\n\r\n**Дмитрий, 2 октября 2017, 16:08**\r\nAndrey Davydov, на самом деле, ничего сложного: https://wandbox.org/permlink/7RrDix2YhNoRCpSx (пример схематичный).\r\n\r\n\r\n**Andrey Davydov, 2 октября 2017, 17:02**\r\ndmitriy@izvolov.ru, Ваша реализация делает не то же, что piecewise_construct конструктор std::pair. Вы в конструкторе ::tuple создаете элементы std::tuple и передаете их в конструктор std::tuple, т.е. это не будет работать с noncopyable & nonmovable типами.\r\n\r\n\r\n**Дмитрий, 2 октября 2017, 17:13**\r\nAndrey Davydov, я просто показал принцип, который заключается всего-навсего в том, чтобы в поэлементном конструкторе принимать набор кортежей. Их дальше можно проверить на совпадение с классом std::tuple через концепты или SFINAE, а дальше они разворачиваются и бросаются в конструкторы конкретных элементов.\r\n\r\nПример, как я и написал, схематичный. Я же не буду реализовывать полноценный кортеж ради такого простого примера.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808049057/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808049819", + "html_url": "https://github.com/cpp-ru/ideas/issues/224#issuecomment-808049819", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/224", + "id": 808049819, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODA0OTgxOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:56:20Z", + "updated_at": "2021-03-26T08:56:20Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 2 октября 2017, 18:29**\r\nЕсть, начиная с C++17 в виде атрибута [[nodiscard]].", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808049819/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808050779", + "html_url": "https://github.com/cpp-ru/ideas/issues/225#issuecomment-808050779", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/225", + "id": 808050779, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODA1MDc3OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:57:58Z", + "updated_at": "2021-03-26T08:57:58Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 2 октября 2017, 18:02**\r\nДобавлю в один из своих ближайших proposal на constexpr\r\n\r\n\r\n**WPMGPRoSToTeMa, 6 октября 2017, 3:11**\r\nВ switch как-то слишком оптимистично из-за коллизий, там нужно идеальное хэширование.\r\n\r\n\r\n**Дмитрий Назаров, 6 октября 2017, 18:54**\r\nКоллизии случаются, это так. Главная идея заключается в том, что для constexpr объектов сам хэш также можно посчитать на этапе компиляции. Применять ли его в switch - дело вкуса. Для какого-то небольшого подмножества объектов, например, реализованной компилятором хэш функции может быть вполне достаточно.\r\n\r\n\r\n**WPMGPRoSToTeMa, 11 октября 2017, 13:39**\r\nhttp://en.cppreference.com/w/cpp/utility/hash#Notes\r\n\r\n> Hash functions are only required to produce the same result for the same input within a single execution of a program\r\n\r\nМне кажется из-за этого std::hash нельзя сделать constexpr, т.е. скорее всего придётся вводить новый std::hash, например, через tag dispatching.\r\n\r\n\r\n**yndx-antoshkka, 21 июля 2020, 9:23**\r\nWPMGPRoSToTeMa, вы правы. Некоторые фирмы используют хеши, выдающие разные результаты при перекомпиляциях, чтобы заранее отлавливать баги с закладыванием на порядок следования элементов в unordered контейнерах.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808050779/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808051374", + "html_url": "https://github.com/cpp-ru/ideas/issues/226#issuecomment-808051374", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/226", + "id": 808051374, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODA1MTM3NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T08:59:02Z", + "updated_at": "2021-03-26T08:59:02Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 2 октября 2017, 18:34**\r\nПодобное уже долго обсуждается и будет называться Executors http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0443r2.html . Executors должны будут хорошо интегрироваться с разными частями стандартной библиотеки, например с Networking TS.\r\n\r\nНа данный момент там достаточно сложный дизайн, есть предложения по упрощению http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0688r0.html\r\n\r\nКомитет хочет успеть сделать в виде TS к С++20, но это оптимистичный план.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808051374/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808052908", + "html_url": "https://github.com/cpp-ru/ideas/issues/227#issuecomment-808052908", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/227", + "id": 808052908, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODA1MjkwOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T09:01:29Z", + "updated_at": "2021-03-26T09:01:29Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 2 октября 2017, 18:37**\r\nНеобходим прототип, иначе обсуждение затянется на года. Так же необходимо продумать взаимодействие с iostream и std::locale\r\n\r\n\r\n**Дмитрий, 4 октября 2017, 13:31**\r\nОбязательно ли вводить новый тип? Почему бы не реализовать в библиотеке?\r\n\r\n\r\n**Victor Dyachenko, 5 октября 2017, 9:20**\r\ndmitriy@izvolov.ru, поддерживаю. Это первый вопрос, который зададут в Комитете. Нужно очень хорошее обоснование, почему нельзя обойтись библиотекой.\r\n\r\n\r\n**Дмитрий Назаров, 5 октября 2017, 12:49**\r\ndmitriy@izvolov.ru, На самом деле в стандартной библиотеке есть некоторый функционал для работы с unicode. Начиная с c++11 в библиотеке есть codecvt. Правда стоит оговориться, что в c++17 он помечен как deprecated. Так что требуется либо доработать сам codeсvt, либо предложить ему альтернативу. Но определенно это должно быть реализовано библиотекой.\r\n\r\n\r\n**Victor Gubin, 6 октября 2017, 13:16**\r\nstring-view http://josephanders0n.github.io/2016/02/20/string-view.html\r\nИли вот такой контейнер https://github.com/incoder1/libio/blob/master/include/conststring.hpp\r\n(или QString, wxString и т.п. )\r\nконечно позволяют работать с UNICODE.\r\n\r\nСуть в том что С++ язык высокого уровня, а не assembler.\r\n\r\nIMHO code_cvt - очень правильно объявлен устаревшим, спецификации шаблона могут бросить исключение и выделяют память через new и т.д.\r\n\r\n\r\n**Виктор Губин, 26 марта 2018, 19:01**\r\nВ общем предложение по факту является дубликатом http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0482r0.html\r\n\r\nИ снимается.\r\n\r\n\r\n**yndx-antoshkka, 20 июля 2020, 21:31**\r\nВ C++20 приняли https://wg21.link/p0482", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808052908/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808054586", + "html_url": "https://github.com/cpp-ru/ideas/issues/228#issuecomment-808054586", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/228", + "id": 808054586, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODA1NDU4Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T09:04:26Z", + "updated_at": "2021-03-26T09:04:26Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 3 октября 2017, 13:57**\r\nЕсть уже proposal на эту тему http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0214r5.pdf\r\n\r\nОзнакомьтесь, и если есть замечания - мы их передадим комитету.\r\n\r\n\r\n**Дмитрий Назаров, 3 октября 2017, 21:08**\r\nСпасибо. Я не знал об этом предложении.\r\nСамо предложение расписано достаточно подробно. Но я бы добавил constexpr к операциям, где это возможно. Например ничто не мешает компилятору создавать объект типа simd из std::initializer_list и сразу же загружать в соответствующий регистр.\r\nЭто может показаться надуманно, но представим себе следующий пример: pixel perfect rendering с использованием графических API. Например, в OpenGL при отрисовке используется \"diamond exit rule\". Одним из решений для получения требуемого эффекта выровненных пикселей является добавления некоторого смещения к координатам выводимых на экран точек. Если таких точек много, то оптимальным решением на стороне процессора было бы использовать simd инструкции. Если бы у simd был бы constexpr конструктор, то ничего бы не мешало нам написать contexpr функцию по добавлению смещения к вектору.\r\n\r\nимеется\r\n```cpp\r\nstatic constexpr float offset = { 0.0f, 1.0f, 4.0f, 5.0f};\r\n\r\nconstexpr simd retranslate(const simd &point_)\r\n{\r\n return point_ + simd(offset);\r\n}\r\n```\r\n\r\nВозможно это является экономией на спичках, но как по мне, если есть шанс что-то посчитать на этапе компиляции, то почему бы и нет.\r\n\r\n\r\n**yndx-antoshkka, 13 ноября 2017, 12:38**\r\n\r\n> Но я бы добавил constexpr\r\n\r\nЯ бы тоже. Однако с этим придётся подождать, так как большая часть simd операций может использовать asm вставки, которые в данный момент невозможно сделать constexpr. Даже простой констуруктор может иметь вставку наподобие \"pxor xmm0, xmm0\", разгружающую конвеер.\r\n\r\nCтоит дождаться принятия \"if (constexpr())\". Тогда можно будет делать simd constexpr, не боясь что-то замедлить.\r\n\r\n\r\n**Сергей Прейс, 23 ноября 2017, 8:19**\r\nДмитрий Назаров, вот здесь есть обсуждение на тему реализации векторных constexpr: http://clang-developers.42468.n3.nabble.com/Allow-constexpr-in-vector-extensions-td4057969.html\r\n\r\nОбщий смысл в том, что как минимум в некоторых случаях от constexpr будет страдать производительность. В частности если бы константа в вашем случае была, скажем {1.0f,1.0f,1.0f,1.0f} то добавить её на этапе исполнения было бы быстрее, чем загрузить значение посчитанное на этапе компиляции. Однако общее заключение, что это не повод не делать constexpr simd.\r\n\r\n\r\n**Дмитрий Назаров, 24 ноября 2017, 20:38**\r\nСергей Прейс, в обсуждении как раз приводится пример желаемого результата.\r\n```cpp\r\ntypedef int v4si __attribute__ ((vector_size (16)));\r\n\r\nint main()\r\n{\r\n constexpr v4si a = {1,2,3,4};\r\n constexpr v4si b = {2,0,0,0};\r\n v4si c = a + b;\r\n...\r\n}\r\n```\r\nВозможно обходным решением было бы неявное преобразование таких векторов в какой-то другой тип, который бы можно было использовать в качестве constexpr, и обратно. Но это требует хотя бы constexpr конструктора. Вообще говоря, возможно именно конструктор то и не обязан быть simd. Основное требование к векторам, насколько я понимаю, это выравнивание.\r\n\r\n\r\n**Сергей Прейс, 24 ноября 2017, 21:09**\r\nДмитрий Назаров, там как раз написано, что constexpr результат (загрузка константы из памяти) будет медленнее того, что сгенерировал бы компилятор непосредственно в коде для конкретного случая в обсуждении без constexpr-сложения.\r\n\r\nВыравнивание важно для производительности, но не только оно. Некоторые операции и последовательности операций в simd выполняются быстрее, чем другие. эквивалентные. Кроме того, в векторных типах требования к типизации строже. Такте вещи как integral promotion, конверсии float->double в simd зачастую стоят гораздо дороже, требуют нетривиальных операций и просто вредны.\r\nНо это всё (включая выравнивание) имеет мало отношения к constexpr - там будут совсем другие проблемы. Для поддержки constexpr придётся встраивать в компилятор simd-интерпретатор и без JIT он в нетривиальных случаях просто будет медленным. Впрочем в clang уже обсуждают JIT для скалярных consexpr-выражений.\r\n\r\n\r\n**Сергей Прейс, 23 ноября 2017, 8:48**\r\nЯ, как разработчик векторизатора в компиляторе, всегда скептически относился к такому способу описания векторного (simd) исполнения. Несомненный плюс этого подхода по отношению к более высокоуровневым программным моделям - это относительная предсказуемость кодогенерации. Минусами, однако, являются завязка кода на особенности аппаратуры (размеры векторных регистров, фиксированная последовательность вычислений, оптимальная на конкретной аппаратуре) и уменьшение пространства для оптимизации (преобразование низкоуровневой последовательности записанной в коде в оптимальную может быть сложнее, чем оптимизация алгоритма записанного высокоуровневыми средствами).\r\nПоэтому я предпочитаю более высокоуровневые подходы к проблеме - execution_policies, for_each и т.п.\r\nНо последнее предложение от Matthias Kretz (ссылку дали выше) выглядит достаточно стройным и продуманным, а ABI tags кажутся вообще очень хорошей и универсальной концепцией для гетерогенного программирования на С++, так что я теперь скорее ЗА.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808054586/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808055106", + "html_url": "https://github.com/cpp-ru/ideas/issues/228#issuecomment-808055106", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/228", + "id": 808055106, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODA1NTEwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T09:05:14Z", + "updated_at": "2021-03-26T09:05:14Z", + "author_association": "MEMBER", + "body": "Аналогичное предложение #15 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808055106/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808186867", + "html_url": "https://github.com/cpp-ru/ideas/issues/229#issuecomment-808186867", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/229", + "id": 808186867, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODE4Njg2Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T12:44:33Z", + "updated_at": "2021-03-26T12:44:33Z", + "author_association": "MEMBER", + "body": "**Victor Gubin, 3 октября 2017, 22:44**\r\nПо идее и сейчас можно через tuple сделать, но не особо удобно\r\n```cpp\r\n#include \r\n#include \r\n#include \r\n#include \r\n\r\n\r\nenum class color {\r\n red, green, blue\r\n};\r\n\r\ntemplate\r\nconstexpr std::size_t enum_to_idx(E e) {\r\n static_assert( std::is_enum::value );\r\n return static_cast< std::size_t > ( e );\r\n}\r\n\r\nstatic void print_rgb(const char* log_msg, uint32_t rgb)\r\n{\r\n std::cout << log_msg << \"0x\" << std::setfill('0') << std::setw(6) << std::hex << rgb << '\\n';\r\n}\r\n\r\nint main()\r\n{\r\n\r\n constexpr auto aarr = std::make_tuple(\r\n std::make_pair(color::red, 0xFF0000U),\r\n std::make_pair(color::green, 0x00FF00U),\r\n std::make_pair(color::blue, 0x0000FFU) );\r\n typedef decltype(aarr) enum_av_aray;\r\n\r\n static_assert( 3 == std::tuple_size::value );\r\n static_assert( color::red == std::get<0>( aarr ).first );\r\n static_assert( color::green == std::get<1>( aarr ).first );\r\n static_assert( color::blue == std::get<2>( aarr ).first );\r\n\r\n\r\n std::cout << \"Compile time associative array size: \" << std::tuple_size::value << '\\n' << std::endl;\r\n\r\n print_rgb(\"\\t RED color value: \", std::get< enum_to_idx(color::red) >( aarr ).second );\r\n print_rgb(\"\\t GREEN color value: \", std::get< enum_to_idx(color::green) >(aarr).second);\r\n print_rgb(\"\\t BLUE color value: \", std::get< enum_to_idx(color::blue) >(aarr).second );\r\n\r\n std::cout.flush();\r\n}\r\n```\r\n\r\n**Antervis, 4 октября 2017, 5:55**\r\nждите метаклассы от Герба Саттера\r\n\r\n\r\n**Антон Паймышев, 6 октября 2017, 10:28**\r\nVictor Gubin,\r\n\r\n>> constexpr auto aarr = std::make_tuple(\r\n>> std::make_pair(color::red, 0xFF0000U),\r\n>> std::make_pair(color::green, 0x00FF00U),\r\n>> std::make_pair(color::blue, 0x0000FFU) );\r\n\r\nэтот способ предполагает что нужно *помнить* поддерживать список значений enum именно в двух местах, а этого как раз этого хотелесь бы избежать.\r\n\r\nКак раз для того чтобы не забыть обновить aarr новым элеменотм enum'a \"yellow\", можно было было бы написать:\r\n```cpp\r\nstatic_assert(std::foo().size() == aarr.size());\r\n```\r\nи получить ошибку 4 != 3\r\n\r\n\r\n**Victor Gubin, 6 октября 2017, 13:42**\r\nПоддерживаю. Использовать tuple, как есть неудобно.\r\n\r\nК тому-же весь алгоритм разваливается если скажем:\r\n```cpp\r\nenum class color: uint8_t {\r\n red = 0x04, green = 0x02, blue = 0x01\r\n}\r\n```\r\nНужна полноценная рефлексия на этапе компиляции, что-бы можно было пройтись по всем константам enum-а.\r\n\r\n\r\n**Antervis, 9 октября 2017, 6:07**\r\nVictor Gubin, хорошо бы и возможность пройтись по именам значений enum'ов/классов/пр.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808186867/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808187193", + "html_url": "https://github.com/cpp-ru/ideas/issues/229#issuecomment-808187193", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/229", + "id": 808187193, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODE4NzE5Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T12:45:07Z", + "updated_at": "2021-03-26T12:45:07Z", + "author_association": "MEMBER", + "body": "Близкий по духу тикет (но не дубликат) #96 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808187193/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808188281", + "html_url": "https://github.com/cpp-ru/ideas/issues/230#issuecomment-808188281", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/230", + "id": 808188281, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODE4ODI4MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T12:46:54Z", + "updated_at": "2021-03-26T12:47:45Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 5 октября 2017, 13:16**\r\nОбсудили голосом, заметки чтобы мне не забыть что к чему:\r\n\r\nСо stackfull корутинами можно написать код\r\n```cpp\r\nvoid synchronized()\r\n{\r\n schedule lock(writer_thread); // перескакиваем в специальный поток writer_thread\r\n myAction1(); // выполнится в потоке writer_thread\r\n myAction2(); // выполнится в потоке writer_thread\r\n // ~ schedule вернёт нас в изначальный поток\r\n}\r\n```\r\nсо stackless корутинами, так не получится, так как все корутинные методы должны возвращать future. Ближайший аналог\r\n```cpp\r\nfuture_t synchronized()\r\n{\r\n try {\r\n schedule lock(writer_thread); // через thread_local выставляем что надо выполняться в writer_thread\r\n co_yield; // считываем thread_local и перескакиваем в поток writer_thread\r\n myAction1(); // выполнится в потоке writer_thread\r\n myAction2(); // выполнится в потоке writer_thread\r\n // ~ schedule через thread_local выставляем что надо выполняться в изначальном потоке\r\n } catch (...) {}\r\n co_yield; // считываем thread_local и перескакиваем в изначальный поток\r\n}\r\n```\r\nПри этом возникают проблемы с thread_local, так как мы можем проснуться в другом потоке - необходимо дополнительно сбрасывать thread_local в дефолт при co_yield\r\n\r\nДополнительные проблемы:\r\n* можно забыть позвать co_yeild\r\n* второй co_yeld может не выполниться в случае исключения если забыть написать try{} catch(...)\r\n* асинхронно создать базовый класса - невозможно", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808188281/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808190810", + "html_url": "https://github.com/cpp-ru/ideas/issues/231#issuecomment-808190810", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/231", + "id": 808190810, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODE5MDgxMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T12:51:18Z", + "updated_at": "2021-03-26T12:51:18Z", + "author_association": "MEMBER", + "body": "**Victor Gubin, 9 октября 2017, 13:32**\r\nТо что \"вылетело\" из секции например, и в чем был весь смысл:\r\n```cpp\r\n#include \r\n#include \r\n\r\nnamespace jemalloc {\r\n\r\nstruct memory_traits {\r\n\r\nstatic void* allocate(std::size_t size) {\r\n void *ret = nullptr;\r\n // some while(nullptr == __builtin_expect( (ret == std::malloc) ,false) ) {\r\n while ( nullptr == (ret = je_malloc(size)) ) {\r\n std::new_handler handler = std::get_new_handler();\r\n if(nullptr == handler)\r\n throw std::bad_alloc();\r\n handler();\r\n }\r\n return ret;\r\n}\r\n\r\nstatic void* allocate(std::size_t size, const std::nothrow_t&) noexcept {\r\n void *ret = nullptr;\r\n // some while(nullptr == __builtin_expect( (ret == std::malloc) ,false) ) {\r\n while ( nullptr == (ret = ::je_malloc(size)) ) {\r\n std::new_handler handler = std::get_new_handler();\r\n if(nullptr == handler)\r\n return nullptr;\r\n handler();\r\n }\r\n return ret;\r\n}\r\n\r\nstatic void release(void* const ptr) noexcept {\r\n ::je_free( ptr );\r\n}\r\n\r\n};\r\n\r\n\r\n} // jemalloc\r\n\r\nnamespace windows {\r\n\r\nclass memory_traits {\r\npublic:\r\n static void* allocate(std::size_t size) {\r\n void *ret = nullptr;\r\n // use some __assume\r\n while ( nullptr == (ret = ::HeapAlloc( instance()->heap_, 0, size) ) ) {\r\n std::new_handler handler = std::get_new_handler();\r\n if(nullptr == handler)\r\n throw std::bad_alloc();\r\n handler();\r\n }\r\n }\r\n\r\n static void* allocate(std::size_t size, const std::nothrow_t&) noexcept {\r\n void *ret = nullptr;\r\n // use some __assume\r\n while ( nullptr == (ret = ::HeapAlloc( instance()->heap_, 0 , size ) ) ) {\r\n std::new_handler handler = std::get_new_handler();\r\n if(nullptr == handler) {\r\n errno = ENOMEM;\r\n return nullptr;\r\n }\r\n handler();\r\n }\r\n return ret;\r\n }\r\n\r\n static void release(void* const ptr) noexcept {\r\n ::HeapFree(instance()->heap_, 0, const_cast(ptr) );\r\n }\r\nprivate:\r\n\r\n static const memory_traits* instance() noexcept {\r\n static memory_traits _instance( ::HeapCreate(0,0,0) );\r\n return &_instance;\r\n }\r\n\r\n constexpr explicit memory_traits(::HANDLE heap) noexcept:\r\n heap_(heap)\r\n {}\r\n\r\n ::HANDLE heap_;\r\n};\r\n\r\n} // namesapce windows\r\n\r\n...\r\nvoid main() {\r\n\r\n // std::allocator ( new/delete in most cases )\r\n std::vector v;\r\n\r\n // red-black map with je_malloc nodes\r\n std::set< int, std::less, std::basic_allocator > s;\r\n\r\n // hash table with windows private heap allocator for buckets\r\n typedef std::unordered_map<\r\n int, std::string\r\n std::hash,\r\n std::equal_to,\r\n std::basic_allocator< std::pair, windows::memory_traits>\r\n > int_hash_map;\r\n\r\n}\r\n```\r\n\r\n**Will Code For Food, 25 октября 2017, 14:08**\r\nЭто же std::pmr::polymorphic_allocator и std::pmr::memory_resource, не?\r\n\r\n\r\n**Виктор Губин, 18 марта 2019, 17:31**\r\nWill Code For Food,\r\n\r\nНесовсем, std::pmr::polymorphic_allocator/std::pmr::memory_resource - обладают очень нежелательным свойством. get_default_resource/set_default_resource\r\n\r\nТеперь положим, у меня в программе есть пул из N потоков. Есть контейнер с бинарной кучей - priority queue, он разделятеся между всеми потоками и синхронизируется. Остальные потоки имеют множество других контейнеров, которые с специфичными аллокаторами (отдельный для строк, деревьев и хеш таблиц). Memory resource при этом глобальный (даже если он будет thread_local это не сильно поможет, если контейнеров с \"хитрыми\" аллокаторами более одного).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808190810/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808191916", + "html_url": "https://github.com/cpp-ru/ideas/issues/232#issuecomment-808191916", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/232", + "id": 808191916, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODE5MTkxNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T12:53:05Z", + "updated_at": "2021-03-26T12:53:05Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 13 октября 2017, 9:37**\r\nВопрос для затравки -- а использовать float Вы хотите разрешить?\r\nДля expression template parameters важно определить равенство, это будет пользовательский operator == или почленное сравнение структур вплоть до примитивных типов? И с тем и другим подходом есть проблемы.\r\n\r\n\r\n**ldvsoft, 18 октября 2017, 22:48**\r\nAndrey Davydov, я, если честно, плохо понимаю конкретные причины против использования float, но кажется надо быть крайне аккуратным с точностью вычислений, оно может того не стоить.\r\n\r\nА если мы скажем, что требуем trivial constexpr operator ==? Тогда он сводится к сравнению полей. Я как раз указал, что не очень понятно, какие именно требования накладывать, и да, это требует обсуждения, но как раз ради этого я и выложил идею. Обсудим, может работать будем.\r\n\r\n\r\n**Andrey Davydov, 18 октября 2017, 23:35**\r\nldvsoft,\r\n\r\n> я, если честно, плохо понимаю конкретные причины против использования float\r\n\r\ntemplate struct X {};\r\nis_same_v, X<-0.f>> это true или false?\r\nis_same_v, X> это true или false?\r\n\r\n> А если мы скажем, что требуем trivial constexpr operator ==?\r\n\r\nА что это такое? Сейчас есть только builtin, если предположить что появится возможность генерировать операторы сравнения, то возникнет следующий вопрос. Вот есть весь такой из себя constexpr класс std::string_view, но operator == у него, понятное дело, user defined. Значит, его все равно нельзя будет использовать как expression template parameter. И std::optional нельзя, по той же причине.\r\n\r\n\r\n**ldvsoft, 19 октября 2017, 0:14**\r\nAndrey Davydov, вот и надо думать и обсуждать. Спасибо за дельные комментарии.\r\n\r\n\r\n**Andrey Davydov, 19 октября 2017, 11:32**\r\nldvsoft, По-моему, если не получается придумать простое и логичное для пользователя поведение, то лучше вообще не добавлять фичу в язык, если только нет сильного мотивирующего примера, зачем это надо. Я такого не вижу. Вы говорили про optional, не уверен что, угадал, какую задачу Вы решали, но скажем, мы хотим, что у класса X было static const поле типа optional. Я бы это сделал так:\r\n```cpp\r\ntemplate class X;\r\ntemplate class X>\r\n{\r\n static const optional value { I };\r\n};\r\ntemplate<> class X\r\n{\r\n static const optional value {};\r\n};\r\n```\r\n\r\n**Павел, 15 октября 2017, 15:19**\r\nА можно мне пример, когда нужно передать \"сложный\" тип как аргумент шаблона, но нельзя для этих целей заиспользовать constexpr?\r\n\r\n\r\n**ldvsoft, 18 октября 2017, 23:10**\r\nПавел Корозевцев, кажется это два разных вопроса. Нужно было мне передать в шаблон опциональное число, у которого нет \"исключительного\" значения чтобы его считать отсутствием. Можно передать bool + value, но их приходится писать в два аргумента, а хочется вообще написать std::optional. constexpr здесь только при том что внутри шаблона можно разобрать случай наличия-отсутствия значения в compile time.\r\n\r\n\r\n**d-yaroshev, 16 октября 2017, 11:04**\r\nЭтот вопрос спрашивали на CppCon последнем: https://youtu.be/JYG5LFHkUuE (не могу сейчас указать минуту).\r\n\r\nСтрауструп сказал что проблема есть, это единственное место в языке где можно отличить пользовательские типы от встроенных. Но поскольку у нее очень узкая область применения. никто этим не занимается.\r\n\r\n\r\n**Andrey Davydov, 14 ноября 2017, 8:55**\r\nНедавние подвижки по данному вопросу:\r\n1. http://je4d.s3.amazonaws.com/D0732R0-wip.pdf -- разрешить использовать в качестве expression template parameters классы с compiler generated `operator <=>`.\r\n2. https://github.com/ldionne/wg21/blob/master/generated/d0424r2.pdf -- отдельное правило для string literals.\r\n\r\n\r\n**ldvsoft, 22 ноября 2017, 19:11**\r\nAndrey Davydov, Спасибо огромное, почитаю. <=> кажется особо удачной кандидатурой, но он, к сожалению, сам по себе не даст использовать std::optional/std::variant.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808191916/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808193095", + "html_url": "https://github.com/cpp-ru/ideas/issues/232#issuecomment-808193095", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/232", + "id": 808193095, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODE5MzA5NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T12:55:03Z", + "updated_at": "2021-03-26T12:55:03Z", + "author_association": "MEMBER", + "body": "Начиная с C++20 разрешили передавать floating point типы данных и литеральные типы со всеми публичными полями", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808193095/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808194054", + "html_url": "https://github.com/cpp-ru/ideas/issues/233#issuecomment-808194054", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/233", + "id": 808194054, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODE5NDA1NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T12:56:43Z", + "updated_at": "2021-03-26T12:56:43Z", + "author_association": "MEMBER", + "body": "**dix75, 18 октября 2017, 0:23**\r\nСудя по идее здесь также откроется широкое поле для оптимизации, но стоит подумать о всех нюансах, возможно такое предложение уже было.\r\nНо приведенный пример с const_cast не считаю показательным, а вот с шаблонным классом был бы весьма уместен\r\n\r\n\r\n**post-increment, 19 октября 2017, 0:57**\r\ndix75, не понял про шаблонный класс. Можете привести пример?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808194054/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808194756", + "html_url": "https://github.com/cpp-ru/ideas/issues/234#issuecomment-808194756", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/234", + "id": 808194756, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODE5NDc1Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T12:57:53Z", + "updated_at": "2021-03-26T12:57:53Z", + "author_association": "MEMBER", + "body": "**Клеванец Игорь, 23 октября 2017, 12:48**\r\nВы имеете в виду перегрузку по возвращаемым типам?\r\nint foo();\r\nvoid foo();\r\n\r\nОно?\r\n\r\n\r\n**ru.night.beast, 23 октября 2017, 13:11**\r\nЕсли речь об указателях на родитель/наследник, то оно и сейчас можно. Если о не связанных типах, то нафиг надо.\r\n\r\n\r\n**Antervis, 23 октября 2017, 13:50**\r\nint foo();\r\ndouble foo();\r\n\r\nauto val = foo(); // и что делать будем?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808194756/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808196120", + "html_url": "https://github.com/cpp-ru/ideas/issues/235#issuecomment-808196120", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/235", + "id": 808196120, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODE5NjEyMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T13:00:05Z", + "updated_at": "2021-03-26T13:00:05Z", + "author_association": "MEMBER", + "body": "**ru.night.beast, 30 октября 2017, 15:36**\r\nзапись m[3, 1] сломает существующий код\r\n\r\n\r\n**dix75, 30 октября 2017, 15:55**\r\nru.night.beast, Да сломает, но если вспомнить, что это в основном ошибочная запись\r\n\r\n\r\n**ru.night.beast, 30 октября 2017, 16:17**\r\ndix75, а что делать в ситуациях, когда запись не ошибочная?\r\n\r\n\r\n**Олег Ляттэ, 30 октября 2017, 17:14**\r\nru.night.beast, можно пояснить, что именно сломается? Что-то не могу сообразить.\r\n\r\n\r\n**ru.night.beast, 30 октября 2017, 17:28**\r\nОлег Ляттэ, ну, в плюсах (если оператор \",\" не перегружен), результатом выражения \"3, 1\" будет int 1. Т.е. один аргумент, а не несколько.\r\nСломается код, который использует \",\" при вычислении индекса []\r\n\r\n\r\n**Дмитрий, 30 октября 2017, 20:57**\r\nДля float& operator[](int row, int column);\r\nможно оставить такой вариант записи: m[3][1] = 0.0f;\r\nЗапятая смотрелась бы лучше, но её уже задействовали под весьма сомнительную конструкцию, в которой следовало бы использовать \";\". Теперь имеем \";\" в for, но \",\" в while.\r\n\r\n\r\n**nenomius, 30 октября 2017, 22:20**\r\nru.night.beast, такой код заслуживает быть сломаным.\r\n\r\n\r\n**ru.night.beast, 30 октября 2017, 22:54**\r\nДмитрий, и как быть если у класса перегружен оператор с одним и с двумя параметрами?\r\n\r\n\r\n**Олег Ляттэ, 31 октября 2017, 15:10**\r\nru.night.beast, как вариант - поменять семантику запятой в квадратных скобках на аналогичную той, что используется при передаче аргументов функции. Рискованное предложение, да, но вдруг комитет решит, что это изменение стоит того.\r\n\r\n\r\n**dix75, 1 ноября 2017, 12:58**\r\nru.night.beast,\r\nИмеет смысл только в variadic template (хотя и весьма сомнительный), в остальных случаях это описка(ошибка)\r\n\r\n\r\n**ru.night.beast, 1 ноября 2017, 16:09**\r\ndix75, перегрузкой \",\" можно добиться, например, передачу в operator[] многомерного индекса.\r\nпричем скобки могут использоваться не только для работы с массивами.\r\nеще до x11 делали лямбды, где [] применялось для lazy-evaluation.\r\nтак что, если вы лично этим не пользуетесь, это не значит что все, ошибка, давайте срочно переписывать.\r\n\r\n\r\n**dix75, 9 ноября 2017, 18:29**\r\nru.night.beast,\r\nХотите сказать, что у вас много кода где вы используете перегрузку ',' для []. Если да то могу только посочувствовать. Использовать не стандартное поведение - это ваше решение, почему все должны от этого страдать.\r\nМожно найти и придумать огромное кол-во перегрузок удобных для разработчиков,но выбивающихся из стандартной логики (например ^ для возведения в степень), но это не повод, не вводить в язык новые вещи которые интуитивно понятные для всех\r\n\r\n\r\n**ru.night.beast, 10 ноября 2017, 9:52**\r\ndix75, я хочу сказать, что перегрузка запятой может иметь вполне осмысленное применение и привел несколько примеров. Не понимаю, когда это перегрузка запятой стала вдруг \"не стандартным поведением\".\r\nЕсли эти самые новые вещи ломают старые правила и при этом ничего не дают взамен, то как раз таки повод.\r\n\r\n\r\n**dix75, 14 ноября 2017, 14:56**\r\nУважаемый ru.night.beast, вы правы, конечно operator , имеет смысл. Но в контексте его применения в квадратных скобках на первых порах меня бы удивило бы, возможно (точнее точно) я бы смог привыкнуть к такому поведению в проекте, но все же для большого количе-ва людей такое поведение не типично. Но если существовала такая же практика как для operator <<, то тут возражения нет.\r\nДа и еще по сути разницы в использовании operator , а не operator && или еще другого нет. Это просто синтаксический сахар\r\n\r\n\r\n**ru.night.beast, 14 ноября 2017, 16:29**\r\ndix75, дело вкуса.\r\nмне больше нравится вариант ifnull[_1, _2, _3] чем ifnull[_1 && _2 && _3]\r\nну и про приоритеты операторов не стоит забывать.\r\n\r\n\r\n**Antervis, 31 октября 2017, 6:52**\r\nперегружаемый operator , \"убивает\" большинство propolsal'ов еще в зачаточном состоянии.\r\n\r\nсинтаксис a[b, c], как уже было отмечено, может сломать существующий код. Если же делать синтаксис a[b][c], то непонятно, что делать, если помимо [] с несколькими аргументами есть еще вариант с одним аргументом, который возвращает указатель/объект с перегруженным []/объект, конвертируемый в указатель. Можно конечно определить список приоритетов так, чтобы не ломался старый код.\r\n\r\nПроще, всё-таки, решить проблему введением библиотечных многомерных range - адаптеров\r\n\r\n\r\n**post-increment, 31 октября 2017, 7:03**\r\nAntervis, поясните про \"убивает\" proposal. Что именно он \"убивает\"?\r\n\r\nИдея писать [i][j] вместо предложенного [i,j] мне не нравится в том числе и по этой причине.\r\n\r\n\r\n**Antervis, 31 октября 2017, 13:55**\r\npost-increment, в том плане, что существует много предложений, которые не могут быть реализованы из-за потенциальной порчи существовующего кода, использующего operator ,\r\n\r\n\r\n**post-increment, 31 октября 2017, 6:57**\r\nМне идея кажется интересной.\r\nЯ опасаюсь, что могут возникнуть трудности при совместимости кода.\r\nв старом коде, например, может быть такое выражение:\r\n```cpp\r\nint m[size];\r\nm[foo(i),i] = 1;\r\n```\r\nи это будет пониматься компилятором как последовательные вычисления через оператор \",\" и последующий вызов m[i]. То есть сейчас есть эквивалентность для массивов\r\n```cpp\r\nm[foo(i),i] = 10; <===> foo(i); m[i] =10;\r\n```\r\nВ вашем предложении это уже потребует другого понимания от компилятора.\r\n\r\nВ защиту можно сказать что компилятор справляется с аргументами ().\r\nпочему бы ему не справляться и с []?\r\n\r\nМожно ввести правила которые позволят сохранить старый код вида\r\nm[foo(i),i] = 10;\r\nдля, скажем, массивов величин и для классов, где есть оператор [] только с одним аргументом...\r\nНо вообще я бы рекомендовал приводить такой код к виду foo(i); m[i] =10;\r\nПри этом нововведении компилятор как раз обругает подобный старый код как ошибку, так как оператор [] оператор для 2 аргументов не был определён.\r\n\r\n\r\n**im.einio, 31 октября 2017, 11:26**\r\nВместо предложенной перегрузки оператора [] вы можете использовать перегрузку оператора ().\r\n```cpp\r\nclass Matrix\r\n{\r\npublic:\r\n float& operator()(int row, int column);\r\n};\r\n\r\nMatrix m;\r\nm(3, 1) = 0.0f;\r\n```\r\n\r\n**Олег Ляттэ, 31 октября 2017, 14:56**\r\nim.einio, да, так безусловно можно, и как обход проблемы можно делать именно так. Но тогда запись 'm(3, 1)' будет больше похожа на вызов функции, чем на доступ к элементу множества.\r\n\r\n\r\n**Дмитрий, 2 ноября 2017, 12:25**\r\nВ range-v3 этот вопрос решён достаточно легко (код сильно упрощён):\r\n```cpp\r\noperator[](slice_bounds);\r\n\r\nstruct slice_bounds\r\n{\r\n From from;\r\n To to;\r\n};\r\n\r\ncollection[{0, 10}];\r\n```\r\nАналогично можно и с матрицами поступить.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808196120/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808198494", + "html_url": "https://github.com/cpp-ru/ideas/issues/235#issuecomment-808198494", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/235", + "id": 808198494, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODE5ODQ5NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T13:03:31Z", + "updated_at": "2021-03-26T13:03:44Z", + "author_association": "MEMBER", + "body": "Работа над предложением уже идёт https://wg21.link/p2128", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808198494/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808200950", + "html_url": "https://github.com/cpp-ru/ideas/issues/236#issuecomment-808200950", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/236", + "id": 808200950, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODIwMDk1MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T13:07:00Z", + "updated_at": "2021-03-26T13:07:00Z", + "author_association": "MEMBER", + "body": "**Павел, 6 ноября 2017, 16:24**\r\nВсё, что можно сделать средствами языка, надо делать, а не тащить пропозал в ядро.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808200950/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808292406", + "html_url": "https://github.com/cpp-ru/ideas/issues/237#issuecomment-808292406", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/237", + "id": 808292406, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODI5MjQwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:07:51Z", + "updated_at": "2021-03-26T15:08:30Z", + "author_association": "MEMBER", + "body": "**ru.night.beast, 1 ноября 2017, 16:17**\r\nразговоры о uniform function call syntax давно ходят.\r\nсм. например\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4174.pdf\r\nhttp://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2015/p0079r0.pdf\r\nправда, не известно, на какой стадии это дало находится.\r\n\r\n\r\n**Игорь, 1 ноября 2017, 18:16**\r\nru.night.beast, Делать это не явно как в Dlang не хочется. Я так понял в предложениях именно о неявном преобразовании из foo(&a, arg) в a.foo(arg) идет речь. Мне кажется, такое смелое неявное преобразование без явного указания инструкции - не путь с++.\r\n\r\n\r\n**Antervis, 2 ноября 2017, 9:44**\r\nrumyancev95, полагаю, Страуструпу виднее, что \"путь с++\", а что нет. Важно на самом деле то, что UFC позволит реализовывать некоторые шаблонные/синтаксические трюки намного проще. Простой пример: существует sort(RandomAccessContainer &c). Некоторые контейнеры предоставляют свой метод sort, т.к. стандартный не подходит. Тогда в одном случае это c.sort(), а в другом sort(c), либо через обертку с sfinae-перегрузкой. С UFC можно просто писать c.sort().\r\n\r\n\r\n**Игорь, 2 ноября 2017, 14:06**\r\nAntervis, Не знаю. Мне кажется объединять в одну сущность a.foo(b) и foo(a, b) по умолчанию, если аргумент `a` есть ссылка на какой либо объект - слишком громкое новводение и оно по идее тогда будет распространяться на любые объекты или только пользовательские? И если мы определим такую внешнюю функцию, а в foo уже будет функция с той же сигнатурой, нам что, компилятор запретит cделать такую функции? или не даст вызвать ее через a.foo(b)? Введение UFC в этом формате может поломать существующий код.\r\n\r\n\r\n**Antervis, 2 ноября 2017, 14:55**\r\nrumyancev95, a.foo(b) вызовет свободную функцию foo(A&, B) только если A::foo(B) не существует и наоборот. Поэтому UFC не поломает существующий код, а лишь определит поведение ныне некорректного.\r\n\r\n\r\n**Дмитрий Назаров, 1 ноября 2017, 21:38**\r\nА не приведет ли это к тому, что отлаживать код станет еще сложнее? Сейчас, увидев код вида foo.bar(), можно утверждать, что bar является либо методом одного из классов в иерархии наследования, либо функицией/функтором. Если будет возможность добавлять новые методы на ходу, то уже сложнее будет определить, что это такое. Конечно, современные среды разработки все могут, но как минимум при беглом просмотре это будет сбивать с толку.\r\n\r\nКроме того, а как быть, если имя расширения конфликтует с именем метода в классе потомке? Явный вызов метода класса через его full qualified name поможет вызвать метод потомка. А как вызвать именно расширение?\r\n\r\n\r\n**Игорь, 2 ноября 2017, 10:04**\r\nДмитрий Назаров, при отладке мы будем падать в расширяющий метод, тут не вижу проблем.\r\n\r\nСогласен с тем, что этой новой возможностью не удастся явно узнать что такое a.foo(). Раньше мы предполагали что это может быть метод или функтор. Теперь появится третий вариант. Тут ничего не поделаешь.\r\n\r\nЕсли у класса есть метод с сигнатурой которую мы хотим расширить - то ошибка компиляции. Расширяющие методы не должны влиять на внутренний мир класса.\r\n\r\n\r\n**Игорь, 2 ноября 2017, 10:19**\r\nДмитрий Назаров, И да, расширяющий метод не добавляет по факту никакого метода классу. При наследовании объекта, который имеет расширяющий метод, не будет получено расширение. Если держать в голове, что расширение это внешний от класса метод, то все встает на свои места.\r\n\r\n\r\n**Дмитрий Назаров, 2 ноября 2017, 14:01**\r\nrumyancev95, так в том и вопрос. Если, скажем, я в наследнике определю foo, то a.foo() должно вызывать метод наследника, как я понимаю? Ведь при наследовании мы ничего не можем знать о расширении, так как оно может быть объявлено постфактум где-то еще.\r\n\r\n\r\n**Игорь, 2 ноября 2017, 14:08**\r\nДмитрий Назаров, расширения не наследуются и соответственно не могут быть вызваны через наследника. Расширение привязано строго к типу класса. Все потому, что расширения классов/структур не находсят внутри. По факту, они компилятором будут построены снаружи.\r\n\r\n\r\n**Дмитрий Назаров, 2 ноября 2017, 14:19**\r\nrumyancev95, по поводу наследования расширений тут надо подумать. Если расширения не могут использоваться потомком, то не противоречит ли это наследованию?\r\n\r\n\r\n**Дмитрий Назаров, 2 ноября 2017, 14:23**\r\nВопрос не в том, может ли потомок вызывать расширение, а в том, можно ли расширение применять к потомку. И тут интересно как вызвать именно расширение, если в потомке есть метод с таким же именем.\r\n\r\n\r\n**Игорь, 2 ноября 2017, 14:28**\r\nДмитрий Назаров, Что вы понимаете под фразой \"применить расширение к потомку\"? Мы всегда создаем расширение для конкретного типа и в результате, к указателю на этот тип будет создан внешний метод. Это все независимая от наследования конструкция. Если я ошибаюсь, приведите пожалуйста пример.\r\n\r\n\r\n**Дмитрий Назаров, 2 ноября 2017, 14:37**\r\nrumyancev95, Пример:\r\n```cpp\r\nstruct B : A\r\n{\r\n void bar();\r\n);\r\n\r\nB b;\r\nb.bar(); // тут очевидно, что вызывается B::bar\r\n```\r\nА как вызвать именно ваше расширение применительно к объекту b?\r\n\r\n\r\n**Дмитрий Назаров, 2 ноября 2017, 14:38**\r\nДмитрий Назаров, если имя выбирает компилятор, то это как минимум не переносимо.\r\n\r\n\r\n**Дмитрий Назаров, 2 ноября 2017, 14:50**\r\nДмитрий Назаров, логично было бы вызывать расширение через full qualified name для класса, для которого определялось расширение. Но тогда это выглядеть будет так себе. А если учесть, что основная цель - синтаксический сахар, то это несколько снижает ценность предложения.\r\nЕще вопрос как это должно вести себя с ODR. Если, например, я в разных заголовках объявлены разные расширения с одинаковым именем.\r\n\r\n\r\n**Дмитрий Назаров, 2 ноября 2017, 14:56**\r\nА как расширение должно вести себя с классами, для которых есть только forward declaration?\r\n\r\n\r\n**Игорь, 2 ноября 2017, 15:36**\r\nДмитрий Назаров,\r\n> А как вызвать именно ваше расширение применительно к объекту b?\r\n\r\nНикак, так как для класса B не определен расширяющий метод, даже несмотрся на то, что он наследуется от A, у которого есть расширение. Потому что расширение не расширяетв нутренний мир класса, а лишь создает внешнюю функцию на указанный тип.\r\n\r\n-> если имя выбирает компилятор, то это как минимум не переносимо.\r\nКомпилятор определяет у себя внутри мета-имена которые пользователь никогда не вызовет. Это необходимая ему справочная информация чтобы реагировать на вызов расширяющих функций у объектов через точку. Это кишки компилятора, переносимость кода здесь не причем.\r\n\r\n> А как расширение должно вести себя с классами, для которых есть только forward declaration?\r\n\r\nТакже как и с обычными функциями. Вы не сможете определить функцию для незаконченного типа. Будет ошибка компиляции. Тоже самое с расширяющими функциями.\r\n\r\n\r\n**Дмитрий Назаров, 2 ноября 2017, 15:52**\r\nrumyancev95, при наличии forward declaration можно определять функции, для которых эти объекты передаются по указателю или по ссылке.\r\nТак а почему нельзя применить расширение для наследника? Если само расширение это всего лишь синтаксис для вызова, например, bar(&a). То поясните мне, чем это противоречит вызову bar(&b).\r\n\r\n\r\n**Дмитрий Назаров, 1 ноября 2017, 21:44**\r\nВот еще интересный вопрос. Операторы присваивания и операторы преобразования типа точно такие же методы класса, как и любые другие. Можно ли добавлять их? Если да, то не сломает ли это инкапсуляцию?\r\n\r\n\r\n**Игорь, 2 ноября 2017, 10:33**\r\nДмитрий Назаров, Операторы которые вы назвали по стандарту не могут быть не членами класса. Соответственно расширять их не представится возможным.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808292406/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808293233", + "html_url": "https://github.com/cpp-ru/ideas/issues/237#issuecomment-808293233", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/237", + "id": 808293233, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODI5MzIzMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:08:59Z", + "updated_at": "2021-03-26T15:08:59Z", + "author_association": "MEMBER", + "body": "Дубликат идеи #30 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808293233/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808296139", + "html_url": "https://github.com/cpp-ru/ideas/issues/238#issuecomment-808296139", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/238", + "id": 808296139, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODI5NjEzOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:12:53Z", + "updated_at": "2021-03-26T15:12:53Z", + "author_association": "MEMBER", + "body": "**Игорь, 14 ноября 2017, 14:05**\r\nМожет быть стоит.Ну а сейчас, первое что пришло в голову, можно написать что то вроде такого например:\r\n```cpp\r\ntemplate \r\nauto to_lambda(Function&& func, Args&&... args)\r\n{\r\n return [func, args...](auto&& obj){\r\n return (obj.*func)(args...);\r\n };\r\n}\r\n```\r\nИ использовать ваш алгоритм так:\r\n```cpp\r\nauto it = std::find_if(v.begin(), v.end(), to_lambda(&std::string::empty));\r\n```\r\n\r\nЛибо с каким-угодно параметром. Как удобно.\r\n\r\n\r\n**Antervis, 15 ноября 2017, 6:27**\r\nrumyancev95, для этого есть std::mem_fn. Просто можно обойтись даже без него\r\n\r\n\r\n**Игорь, 17 ноября 2017, 11:42**\r\nAntervis, Да точно, спасибо\r\n\r\n\r\n**Антон Бикинеев, 14 ноября 2017, 15:19**\r\nВозможно, это частный юз-кейз наиболее обобщенного пропозала Unified Function Call Syntax\r\n\r\n\r\n**Andrey Davydov, 14 ноября 2017, 18:34**\r\nВ range-v3, а значит и в STL2, это уже работает.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808296139/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808298923", + "html_url": "https://github.com/cpp-ru/ideas/issues/238#issuecomment-808298923", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/238", + "id": 808298923, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODI5ODkyMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:16:18Z", + "updated_at": "2021-03-26T15:16:18Z", + "author_association": "MEMBER", + "body": "Подтверждаю, работает в C++20 с std::ranges из коробки https://godbolt.org/z/E9YG6abjh", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808298923/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808299907", + "html_url": "https://github.com/cpp-ru/ideas/issues/239#issuecomment-808299907", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/239", + "id": 808299907, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODI5OTkwNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:17:34Z", + "updated_at": "2021-03-26T15:17:34Z", + "author_association": "MEMBER", + "body": "**Дмитрий, 23 ноября 2017, 15:17**\r\nhttp://www.stroustrup.com/OpenPatternMatching.pdf\r\nhttps://github.com/solodon4/Mach7", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808299907/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808301469", + "html_url": "https://github.com/cpp-ru/ideas/issues/240#issuecomment-808301469", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/240", + "id": 808301469, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMwMTQ2OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:19:41Z", + "updated_at": "2021-03-26T15:19:41Z", + "author_association": "MEMBER", + "body": "**Antervis, 27 ноября 2017, 14:04**\r\n```cpp\r\n#define foreach(list) for (auto &&item : list)\r\n```\r\n\r\n**smertigdon, 27 ноября 2017, 15:16**\r\nУже предложили укоротить `for (auto&& x : list)` до for (x : list)\r\nКуда уж короче-то?\r\n\r\n\r\n**Р, 28 ноября 2017, 17:44**\r\nДа можно и дефайнами, но постоянно их таскать и добавлять - не очень удобно. А вот конструкция например fors(&:list) или fors(&&:list) для разных типов item-ов помогла бы сократить написание кода, сейчас тенденция идет в сторону того чтобы программист в первую очередь быстрее реализовывал свою основную идею, а не останавливался на дежурных конструкциях которые нужно вводить. Но! при этом осталась бы возможность более детализировать условия цикла.\r\nЕсли в языке \"сложно\" выражается простая мысль/замысел - то его популярности это пойдет не на пользу.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808301469/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808302594", + "html_url": "https://github.com/cpp-ru/ideas/issues/114#issuecomment-808302594", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/114", + "id": 808302594, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMwMjU5NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:21:10Z", + "updated_at": "2021-03-26T15:21:10Z", + "author_association": "MEMBER", + "body": "Аналогичная идея #239", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808302594/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808303880", + "html_url": "https://github.com/cpp-ru/ideas/issues/239#issuecomment-808303880", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/239", + "id": 808303880, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMwMzg4MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:22:48Z", + "updated_at": "2021-03-26T15:22:48Z", + "author_association": "MEMBER", + "body": "Сейчас работа идёт в https://wg21.link/P1371 Pattern Matching", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808303880/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808306169", + "html_url": "https://github.com/cpp-ru/ideas/issues/241#issuecomment-808306169", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/241", + "id": 808306169, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMwNjE2OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:24:49Z", + "updated_at": "2021-03-26T15:24:49Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 27 ноября 2017, 13:35**\r\nЭто решается на уровне стандартной библиотеки через std::optional\r\n\r\n\r\n**Р, 28 ноября 2017, 17:52**\r\nyndx-antoshkka, черз std::optional тяжелее описывать, но на любителя.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808306169/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808308475", + "html_url": "https://github.com/cpp-ru/ideas/issues/242#issuecomment-808308475", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/242", + "id": 808308475, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMwODQ3NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:26:15Z", + "updated_at": "2021-03-26T15:26:15Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 27 ноября 2017, 13:44**\r\nБоюсь что это не очень поможет сделать модули переносимыми между платформами и компиляторами, так как модуль - это нечто, полученное после препроцессинга и не содержащее информации о коде до препроцессора.\r\n\r\nДругими словами, если в исходных кодах модуля будет\r\n```cpp\r\n#if _MSC_VER < 1700\r\n// some code\r\n#else\r\n// some other code\r\n#endif\r\n```\r\nто не имеет особого смысла иметь одинаковую структура файла - код может начать неправильно работать на другом компиляторе.\r\n\r\nОднако для библиотек, которые не используют платформо зависимые макросы, это может иметь смысл. Основной разработчик модулей для C++ уже занимается чем-то подобным вот тут: https://github.com/GabrielDosReis/ipr\r\n\r\n\r\n**lobatsevichdmitry, 27 ноября 2017, 21:59**\r\nyndx-antoshkka, В перспективе от макросов нужно избавляться совсем, кроме того, старый вариант (через #include) тоже будет существовать и тем, кому нужны подобные проверки, могут использовать его.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808308475/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808311766", + "html_url": "https://github.com/cpp-ru/ideas/issues/242#issuecomment-808311766", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/242", + "id": 808311766, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMxMTc2Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:29:47Z", + "updated_at": "2021-03-26T15:29:47Z", + "author_association": "MEMBER", + "body": "Идея прорабатывается одним из автором модулей вот в этой репе https://github.com/GabrielDosReis/ipr", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808311766/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808313380", + "html_url": "https://github.com/cpp-ru/ideas/issues/243#issuecomment-808313380", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/243", + "id": 808313380, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMxMzM4MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:32:02Z", + "updated_at": "2021-03-26T15:32:02Z", + "author_association": "MEMBER", + "body": "**Antervis, 28 ноября 2017, 14:31**\r\n```cpp\r\nptr->operator[](\"name\")\r\n```\r\n\r\n**Andrey Davydov, 28 ноября 2017, 15:41**\r\nИспользовать для этих целей \"<\" самая неудачная идея из возможных, так как он уже конфликтует с шаблонными аргументами.\r\nКажется, что C++ уже достиг такой сложности, что впихнуть в него еще один оператор не получится.\r\n\r\n\r\n**Antervis, 29 ноября 2017, 7:42**\r\nAndrey Davydov, можно было бы реализовать некоторые операторы в формате:\r\np->[5], p->(), p->++, p->*= 5, вроде как никаких конфликтов не будет. Другой вопрос: нужны ли эти операторы? - код с их использованием будет тяжеловато читать.\r\n\r\nНа мой взгляд, если есть разыменования второго и более уровней, то проблема в архитектуре кода\r\n\r\n\r\n**Andrey Davydov, 29 ноября 2017, 10:03**\r\nAntervis, оператор ->* уже существует для разыменования member pointer'а, остальные операторы, вроде бы, возможны. В целом же, мне кажется, примеры автора предложения разумны, я не вижу в них архитектурных проблем, но читаемость эффективнее лечится разбиением выражения на несколько переменных чем новыми синтаксическими плюшками.\r\n\r\n\r\n**kitmouse, 29 ноября 2017, 10:30**\r\nAntervis,\r\nкод с оператором \"p->[5]\" будет читать проще чем код с оператором \"(*p)[5]\", особенно если \"p\" - это какое-то длинное выражение.\r\n\"разыменования второго и более уровней\" используются всеми и повсеместно - в виде оператора \"->\".\r\n\r\n\r\n**kitmouse, 29 ноября 2017, 10:27**\r\nК сожалению, я отправил это предложение недописав и не вычитав случайным нажатием какой-то комбинации клавиш.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808313380/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808324102", + "html_url": "https://github.com/cpp-ru/ideas/issues/244#issuecomment-808324102", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/244", + "id": 808324102, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMyNDEwMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:48:14Z", + "updated_at": "2021-03-26T15:48:14Z", + "author_association": "MEMBER", + "body": "**Игорь, 29 ноября 2017, 13:42**\r\nЕсли и делать, то предлагаю как в шарпах:\r\nfoo(id: 1, name: \"some\")\r\n\r\nДелать через знак равно не получится, такие идеи уже были.\r\n\r\n\r\n**Игорь, 29 ноября 2017, 13:44**\r\nИ ординарные кавычки выделены в с++ исключительно под char тип. Их трогать нельзя.\r\n\r\n\r\n**Игорь, 29 ноября 2017, 13:46**\r\n+ подобная инициализация есть в gcc, унаследовавший синтаксис с11, только для структур и только в правильном порядке.\r\n\r\n\r\n**mixtapex, 29 ноября 2017, 15:05**\r\nrumyancev95, Да, со знаком равно и кавычками - немного переборщил. Просто это был пример. Посмотрел в gcc. Там действительно это уже есть для структур.\r\n\r\n\r\n**mixtapex, 29 ноября 2017, 15:21**\r\nЯ нашел этот Proposal. Это N4172.\r\nОн имеет NAD статус. Так что, вероятно, это не будет.\r\n\r\n\r\n**languagelawyer, 23 мая 2018, 5:48**\r\nЯ тоже нашёл пропозал. Это N0060.\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/1991/WG21%201991/X3J16_91-0127%20WG21_N0060.pdf\r\n\r\n\r\n**yuri.pechatnov, 2 мая 2018, 23:20**\r\nВ С++20 будут designated initializers. То есть можно будет просто сделать именованные аргументы, передавая вообще все аргументы через структуру.\r\n\r\nА как аргументы функций сделать именованными не очень понятно, если сейчас в разных объявлениях функций (в декларациях, в перегрузках) названия аргументов могут быть разными.\r\n\r\n\r\n**yndx-antoshkka, 14 июня 2019, 16:17**\r\nБоюсь что в C++ это в обозримом будущем не примут. Основные причины в том, что это ломает ADL, выбор перегрузки функции и инстанцирование шаблонных функций.\r\n\r\nЕще причина - во всех имплементациях стандартых библиотек имена параметров функций не совпадают с именами в стандарте (и с именами в других стандартных библиотеках C++).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808324102/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808324919", + "html_url": "https://github.com/cpp-ru/ideas/issues/244#issuecomment-808324919", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/244", + "id": 808324919, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMyNDkxOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:49:32Z", + "updated_at": "2021-03-26T15:49:32Z", + "author_association": "MEMBER", + "body": "Дубликат #10 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808324919/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808327021", + "html_url": "https://github.com/cpp-ru/ideas/issues/245#issuecomment-808327021", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/245", + "id": 808327021, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMyNzAyMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:52:40Z", + "updated_at": "2021-03-26T15:52:40Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 29 ноября 2017, 18:35**\r\nКак разработчик Boost.LexicalCast я буду выступать категорически против принятия lexical_cast в стандарт в том виде, что он в Boost.\r\n\r\nПравильный lexical_cast, это lexical_cast использующий std::to_chars/std::from_chars и не умеющий конвертировать пользовательские типы данных. Желательно при этом ему быть constexpr :)\r\n\r\n\r\n**Игорь, 29 ноября 2017, 19:25**\r\nyndx-antoshkka, То есть, я так понимаю сейчас стоит задача переписать существующий lexical_cast где внутри будут эти std::from_chars/std::to_chars, которые не тянут как мне помниться кучу лишнего, как например локаль. И только потом рассматривать возможность включения в стандарт? А почему не конвертить пользовательские типы данных? Почему бы ему не быть универсальным? В чем проблема?\r\n\r\n\r\n**yndx-antoshkka, 30 ноября 2017, 13:23**\r\nпользовательские типы данных обычно конвертируются через basic_ostream, а он использует локаль, динамические аллокации. Получится не консистентно - обычные типы всегда будут конвертироваться в C локали, пользовательские типы - в текущей. Можно конечно для basic_ostream всегда явно задавать C локаль, но это дополнительно замедлит функцию\r\n\r\n\r\n**Сергей Трифонов, 29 ноября 2017, 22:17**\r\nМне нравится больше библиотека fmtlib. Удобнее для форматирования текста.\r\n\r\n\r\n**Антон Бикинеев, 30 ноября 2017, 16:30**\r\nСергей Трифонов, есть, кстати, предложение стандартизовать эту либу: https://stdcpp.ru/proposals/a270e3f8-3b35-4485-8e08-2ae56afdb1c3", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808327021/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808328152", + "html_url": "https://github.com/cpp-ru/ideas/issues/246#issuecomment-808328152", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/246", + "id": 808328152, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMyODE1Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:54:17Z", + "updated_at": "2021-03-26T15:54:17Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 1 декабря 2017, 11:57**\r\nВерсию стандарта можно узнать из макроса __cplusplus http://en.cppreference.com/w/cpp/preprocessor/replace и это есть в стандарте уже давно.\r\n\r\nПоддержку отдельных фич можно получить из feature testing macro http://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros\r\n\r\nВот тут http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0835r0.html идёт работа по включению feature testing macro в стандарт (все современные компиляторы и так их используют)\r\n\r\n\r\n**zamazan4ik@tut.by, 9 декабря 2017, 5:03**\r\nКстати вроде как идут разговоры о заголовочном файле , который будет содержать полезную информацию.\r\n\r\n\r\n**yndx-antoshkka, 13 июня 2018, 12:22**\r\nFeature testing macros добавили в стандарт C++20. Теперь можно портабельно проверять наличие различных фичей в языке и в библиотеке C++.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808328152/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808329121", + "html_url": "https://github.com/cpp-ru/ideas/issues/247#issuecomment-808329121", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/247", + "id": 808329121, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMyOTEyMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:55:50Z", + "updated_at": "2021-03-26T15:55:50Z", + "author_association": "MEMBER", + "body": "**Antervis, 7 декабря 2017, 14:53**\r\nтогда уж просто bool contains(const Key &key) и Value at(const Key &key, const Value &defaultValue);\r\n\r\n\r\n**Дмитрий, 7 декабря 2017, 23:01**\r\nВ set, map, unordered_set и unordered_map уже есть - count. Т.к. вариант может быть 0 или 1 (false или true), работает будет так же оптимально, как и contains, если его введут. Разница, по сути, только в типе возвращаемого значения, которое автоматически приводится к нужному.\r\n\r\n\r\n**smertigdon, 8 декабря 2017, 15:51**\r\ncontains уже одобрили, если не ошибаюсь. А вот перегрузка at - будет шикарно", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808329121/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808331054", + "html_url": "https://github.com/cpp-ru/ideas/issues/248#issuecomment-808331054", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/248", + "id": 808331054, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODMzMTA1NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T15:58:57Z", + "updated_at": "2021-03-26T15:58:57Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 15 декабря 2017, 19:40**\r\nЯ читал дискуссию по ссылке, возможно, недостаточно внимательно, но не увидел там ответов на следующие вопросы.\r\n1. Как можно сделать атрибутом то, что компилятор явно проигнорировать не может (как минимум потому что должен поменяться результат вычисления std::is_standard_layout_v)?Кажется, надо действовать по аналогии с alignment specifier.\r\n2. Почему бы, если уж вводить в стандарт понятие packing'а, то не начать с того, что де факто уже есть во всех компиляторах -- простого packing'а в том смысле как его сейчас понимают GCC, Clang, MSVC -- а не оптимизированного с переупорядочиванием полей? Мотивация для этого -- использовать #pragma pack жутко неудобно, забытый #pragma pack(pop) в header'е ведет к тому что едет layout у всех классов и программа начинает падать в runtime где-нибудь в недрах скомпилированной 3rdparty библиотеки (скажем Qt), отлаживать подобное -- удовольствие ниже среднего.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808331054/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808391056", + "html_url": "https://github.com/cpp-ru/ideas/issues/152#issuecomment-808391056", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/152", + "id": 808391056, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODM5MTA1Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T17:20:32Z", + "updated_at": "2021-03-26T17:20:32Z", + "author_association": "MEMBER", + "body": "Дубликат #239", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808391056/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808391339", + "html_url": "https://github.com/cpp-ru/ideas/issues/150#issuecomment-808391339", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/150", + "id": 808391339, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODM5MTMzOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T17:20:59Z", + "updated_at": "2021-03-26T17:20:59Z", + "author_association": "MEMBER", + "body": "Дубликат #239", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808391339/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808391707", + "html_url": "https://github.com/cpp-ru/ideas/issues/53#issuecomment-808391707", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/53", + "id": 808391707, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODM5MTcwNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T17:21:36Z", + "updated_at": "2021-03-26T17:21:36Z", + "author_association": "MEMBER", + "body": "Дубликат #239", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808391707/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808392323", + "html_url": "https://github.com/cpp-ru/ideas/issues/245#issuecomment-808392323", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/245", + "id": 808392323, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODM5MjMyMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T17:22:45Z", + "updated_at": "2021-03-26T17:22:45Z", + "author_association": "MEMBER", + "body": "Полный дубликат #59 (out of order перенос идей)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808392323/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808395113", + "html_url": "https://github.com/cpp-ru/ideas/issues/249#issuecomment-808395113", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/249", + "id": 808395113, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODM5NTExMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T17:27:32Z", + "updated_at": "2021-03-26T17:27:32Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 16 декабря 2017, 0:15**\r\nВ С++17 обязали компилятор вычислять аргументы последовательно, т.е. вычисление i-го аргумента не может перемежаться с вычислением j-го (где i < j или i > j стандарт не говорит). Это очень полезное изменение, так как оно гарантирует, что у нас не будет одновременно нескольких частично сконструированных объектов. Но то в каком порядке аргументы будут вычисляться не фиксировано, и это очень правильно ведь в зависимости от calling convention аргументы в разном порядке кладутся в стэк. То есть, если потребовать вычислять аргументы функции слево направо, а при этом в стэк они будут начиная с последнего, то достичь этого можно будет только ценой очевидной пессимизации.\r\nТо что Вы называете undefined behavior на самом деле unspecified behavior -- очень большая разница, веть от него корректность программы отнюдь не страдает.\r\n\r\n\r\n**Игорь, 16 декабря 2017, 11:01**\r\nAndrey Davydov, ничего подобного, корректность страдает. В функциональных языках программирования, в которых у функций гарантируется чистота - это бы да, сработало. В С++ же, функции могут влиять на внешний мир, к тому же, этот язык императивный, и с точки зрения логики наблюдаемого кода - должен быть порядок вычисления аргументов. Да, сейчас порядок есть, но нет направления, но все мы читаем слева направо и пишем сверху вниз. Инструкции выполняются в логическом порядке. Только не в параметрах функций, функторов, конструкторов - здесь логика исполнения кода нарушается. В одних компиляторах слева направо, в других справа на лево. Вы ошибаетесь что корректность не страдает, можно привести тысячу примеров, где страдает\r\n\r\n\r\n**Andrey Davydov, 16 декабря 2017, 12:48**\r\nrumyancev95, Вы проигнорировали почти весь мой комментарий в котором, я объяснял, почему Ваше предложение ударит по производительности, зато вцепились в последнее словосочетание \"корректность не страдает\", вырвав его из контекста :)\r\n\"Корректность программы не страдает\", было написано в том контексте, что Вы неверно употребили термин UB -- неправда что все программы на C++ вызывающие функции больше чем с одним параметром содержат UB, а значит некорректны.\r\nДействительно, программы заточенные под unspecified behavior (скажем, порядок вычисления аргументов) *логически* некорректны. Это не значит, что надо запретить в стандарте любое unspecified behavior, ведь оно там не просто так, это значит, что если в каком-то частном случае порядок вычисления аргументов принципиален, то обеспечить его ответственность программиста.\r\n\r\n\r\n**Игорь, 16 декабря 2017, 15:25**\r\nAndrey Davydov, в чем потеря производительности? Шланг выводит по порядку, а гцц нет. Следовательно гцц производительнее шланга в данном вопросе?\r\n\r\n\r\n**Andrey Davydov, 17 декабря 2017, 11:01**\r\nrumyancev95, Вы ассемблер не предъявили, но к запихиванию аргументов в стэк Ваш пример не имеет никакого отношения -- очевидно что пустая функция `some` должна быть заинлайнена, и даже если этого и не происходит, то аргументы будут переданы через регистры.\r\n\r\n\r\n**Павел, 17 декабря 2017, 13:47**\r\nrumyancev95, боюсь, в вашем случае аргументы вообще в регистры легли, поэтому порядок не важен в смысле производительности складывания на стек. но плюшки x86_64 не позволяют нам не думать о производительности на других платформах.\r\n\r\n\r\n**Игорь, 18 декабря 2017, 11:22**\r\nПавел Корозевцев, Если там и есть какие то вопросы по произведительности - ок, я не против. Но почему то поведение clang, в отличии от gcc меня полностью устраивает, так как есть логический порядок. Даже если там и действительно будут проблемы по производительности, то лично по мне, должны быть очень весомые причины, чтобы нарушать логический порядок. Я хочу, чтобы мне кто-нибудь дал внятный ответ, почему стандартом не может быть регламентирован порядок и направление вычисления аргументов. Вот один из тысячи кейсов, когда этот порядок необходим:\r\nДопустим у меня есть итератор на какой-нибудь кэш, и у него есть метод next() который двигает итератор вправо. И есть функция, которая принимает два каких-то поля из экземпляра кэша:\r\n```cpp\r\nauto it = cash.getIterator();\r\nprocess(it.next()->getName(), it->getId());\r\n```\r\nВ данном случае, если нет стандартизированного порядка вычислений, у нас в метод может попасть два поля из разных экземпляров кэша.\r\nДа, можно было бы написать вот так, и все бы заработало:\r\n```cpp\r\nauto it = cash.getIterator();\r\nit.next();\r\nprocess(it->getName(), it->getId());\r\n```\r\nНо как вы понимаете, всем хочется писать код короче. Да даже без стремления к красткости кода, можно много где наткнуться на эту проблему. Ведь есть еще всякие фабрики, функции модифицирующие указатель, выделающие память и т.п. Примеров привести можно множество.\r\n\r\n\r\n**Antervis, 18 декабря 2017, 12:02**\r\nrumyancev95, у вас результат одной операции зависит от побочного эффекта другой - не кошер\r\n\r\n\r\n**Игорь, 18 декабря 2017, 12:12**\r\nAntervis, Antervis, Какой побочный эффект? Вы в коде разобрались? .next() пердвигает итератор вправо, он просто двигает итератор на позицию вперед. Следовательно, после смещения, дальнейшие операции будут применены к следующему объекту.\r\n\r\n\r\n**Дмитрий, 18 декабря 2017, 22:03**\r\nrumyancev95, по жизни я с таким не сталкивался. Полагаю в таких редких, исключительных ситуациях, позволительно писать код в 2 строки.\r\n\r\n\r\n**Antervis, 19 декабря 2017, 5:44**\r\nrumyancev95, next() - который помимо возврата итератора изменяет состояние объекта it. Это и называется \"побочный эффект\".\r\n\r\n\r\n**languagelawyer, 23 мая 2018, 5:39**\r\n\r\n> Это очень полезное изменение, так как оно гарантирует, что у нас не будет одновременно нескольких частично сконструированных объектов.\r\n\r\nА до этого изменения могли быть такие объекты?\r\nВычисления двух функций не могут перемежаться, даже если функции заинлайнены. Для конструкторов это правило не действует?\r\n\r\n\r\n**Andrey, 23 мая 2018, 7:03**\r\nlanguagelawyer, возможно, я криво выразился, это была отсылка к классическому примеру о пользе `std::make_unique`:\r\n```cpp\r\nfoo(unique_ptr(new A), unique_ptr(new B));\r\n```\r\nВ этом коде до C++17 возможен такой порядок: `new A`, `new B` -- и если он кидает исключение, то объект `A` утечет. Проблема решалась так:\r\n```cpp\r\nfoo(make_unique(), make_unique());\r\n```\r\nНо в C++17 нет самой проблемы, так как гарантируется, что сразу после `new A` сконструируется `unique_ptr`, т.е. вычисление 1-го и 2-го аргумента `foo` перемежаться не будет.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808395113/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808396286", + "html_url": "https://github.com/cpp-ru/ideas/issues/250#issuecomment-808396286", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/250", + "id": 808396286, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODM5NjI4Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T17:29:27Z", + "updated_at": "2021-03-26T17:29:27Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 19 декабря 2017, 16:57**\r\nПредложите пожалуйста интерфейс, который всем понравится.\r\n\r\n\r\n**zamazan4ik@tut.by, 21 декабря 2017, 2:56**\r\nyndx-antoshkka, из Boost.Algorithm почему никто не брал? Неужели пропозалов не было ?:-)\r\n\r\n\r\n**Antervis, 20 декабря 2017, 6:21**\r\nв ranges-v3 есть split\r\n\r\n\r\n**zamazan4ik@tut.by, 21 декабря 2017, 2:55**\r\n1) Не хотелось бы иметь как метод класса std::string\r\n2) Я за то вариант из Boost.Algorithm.\r\n\r\n\r\n**yndx-antoshkka, 13 июня 2018, 12:20**\r\nПоявилось предложение на добавление split и join: http://wg21.link/p0540\r\n\r\n\r\n**yndx-antoshkka, 29 ноября 2018, 17:05**\r\nСделали в C++20 с принятием ranges:\r\n```cpp\r\nstring str{\"the quick brown fox\"};\r\nfor (word : str | view::split(' ') | view::common) {\r\n cout << string{begin(word), end(word)) << '*';\r\n}\r\n```\r\nВыведет:\r\n```\r\nthe*quick*brown*fox*\r\n```\r\n\r\n**Сергей Рыбин, 1 декабря 2019, 20:06**\r\nОбновлено 30 ноября 2018, 16:30\r\n\r\n\r\nЯ оказывается уже много лет использую самописный обобщенный split похожий на splitc\\splitf из p0540.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808396286/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808397269", + "html_url": "https://github.com/cpp-ru/ideas/issues/251#issuecomment-808397269", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/251", + "id": 808397269, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODM5NzI2OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T17:31:03Z", + "updated_at": "2021-03-26T17:31:25Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 20 декабря 2017, 17:03**\r\nЭто предлагалось в http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0573r0.html раздел \"Omission of type names in lambdas\". Proposal был rejected комитетом. Основная проблема, с моей точки зрения (мотивировку комитета я не знаю): для того чтобы определить является ли `x` именем аргумента (с опущенным типом) или типом аргумента придется делать дополнительный lookup. Забавное проявление этой проблемы: (аrgs...) будет означать (args _, ... /* C variadic args*/), если args резолвится в тип и (auto && ... args) иначе.\r\n\r\n\r\n**Antervis, 21 декабря 2017, 7:56**\r\nAndrey Davydov, в случае с args по идее должно быть: [](...args) { } а не [](args...) { }. А т.к. префиксное троеточие нигде не используется, объявление однозначно. Касательно lookup - по идее, такие вещи не должны сильно портить картину. Например, из-за most vexing parse код типа void a(b()); может интерпретироваться двумя способами если b - тип и еще одним если b - переменная\r\n\r\n\r\n**Andrey Davydov, 21 декабря 2017, 8:30**\r\nAntervis,\r\n> в случае с args по идее должно быть: [](...args) { } а не [](args...) { }\r\n\r\nв proposal'е на который я ссылался было постфиксное многоточие. В вашем варианте другая \"readability issue\" (на мой взгляд) -- [] (...args) -- generic-лямбда, но если опустить имя параметра (что в данный момент в C++ никогда не меняет сигнатуру функции) получается non-generic lambda с C variadic args.\r\n\r\n> Касательно lookup - по идее, такие вещи не должны сильно портить картину. Например, из-за most vexing parse...\r\n\r\nMost vexing parse был одной из мотивирующих причин uniform initialization syntax. Хочется уменьшать число случаев контекстно-зависимого parsing'а, а не увеличивать.\r\n\r\n\r\n**Antervis, 21 декабря 2017, 9:49**\r\nAndrey Davydov,\r\n\r\n> generic-лямбда, но если опустить имя параметра (что в данный момент в C++ никогда не меняет сигнатуру функции) получается non-generic lambda с C variadic args.\r\n\r\nточно так же, как и [](x){} примет такое же число таких же аргументов как и [](auto &&){}, но не такое же, как и если \"опустить\" имя параметра: [](){}. Вообще, многоточие перед именем переменной является скорее частью её определения, а не самостоятельной единицей. Нет такого контекста, где auto..., args... или ...args будет тем же самым, что и убрав auto/args\r\n\r\n\r\n**Antervis, 21 декабря 2017, 7:58**\r\nя уже писал про \"неявный return в конце лямбды\". Надо как-то гарантировать, что поведение старого кода не изменится. Моим предложением было, что неявный return если последний ; опущен: { a() } эквивалентно { return a(); }, но не эквивалентно { a(); }", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808397269/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808400600", + "html_url": "https://github.com/cpp-ru/ideas/issues/252#issuecomment-808400600", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/252", + "id": 808400600, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODQwMDYwMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-26T17:36:35Z", + "updated_at": "2021-03-26T17:36:35Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 20 декабря 2017, 19:59**\r\nЯ, наверное, не понимаю каких-то фундаментальных вещей. Я всегда думал, что NRVO работает так -- перед вызовом функции выделяется место куда положить результат и локальная переменная, возвращаемая из тела функции, выделяется сразу в этом месте. Но если локальная переменная не совпадает по типу с возвращаемым значением функции, как в Вашем примере, то что может соптимизировать компилятор?\r\n\r\n\r\n**yndx-antoshkka, 20 декабря 2017, 21:35**\r\nВы всё верно описали для NRVO. Но идея предложения не связана с NRVO напрямую, а предлагает позволить убрать лишние копирования для случаев, не попадающих под NRVO.\r\n\r\nПример того, как это может работать: компилятор заинлайнивает вызов функции и вместо копирования субобъекта - вызвает деструкторы для неиспользуемых субобъектов, а нужный субобъект использует как будто он результат вызова функции.\r\n\r\nТак в example_1_optimized() функция first_non_empty() была заинлайнена, v.first/v.second переиспользованы без копирования. (Если совсем по честному, то в данном примере перед переиспользованием должен быть вызов деструктора для неиспользуемого субобъекта; но я предположил, что компилятор достаточно умный чтобы понять что порядок удаления объектов не имеет значения, и не стал загромождать пример).\r\n\r\n\r\n**Andrey Davydov, 21 декабря 2017, 8:53**\r\nyndx-antoshkka, Прочитал Ваш proposal еще раз и, кажется, понял как предполагается subobject copy ellision должен работать. Но возникают следующие вопросы:\r\n1. Если в Вашем примере функция first_non_empty не будет проинлайнена, copy ellision не сработает и строка будет копироваться (не перемещаться!), а в случае first_non_empty_move зато точно не сработает copy ellision. Так использовать std::move или нет тому кто реализует функцию first_non_empty?\r\n2. В случае 1)\r\n```cpp\r\nauto v = produce();\r\nreturn v.first;\r\n```\r\nпредлагаемый Вами copy ellision сработает, а в случае 2)\r\n```cpp\r\nauto v = produce();\r\ndecltype(auto) v_first = std::get<0>(v);\r\ndecltype(auto) v_second = std::get<1>(v);\r\nreturn v_first;\r\n```\r\nили, что эквивалентно, 3)\r\n```cpp\r\nauto [v_first, v_second] = produce();\r\nreturn v_first;\r\n```\r\nне сработает. Получается 1) будет эффективнее чем 3), что, по меньшей мере, будет крайне неожиданно.\r\n\r\n\r\n**yndx-antoshkka, 21 декабря 2017, 17:17**\r\nДля пункта 1 я напишу отдельное предложение, по обязательному implicit move при возвращении субобъектов. Но там правила получаются намного более жёсткие, чем в случае с copy elision.\r\n\r\nВ случае с пунктом 2, проблема в данный момент присутствует и для NRVO https://godbolt.org/g/XKopwS . Чинить такое поведение думаю разом, так же в отдельном proposal.\r\n\r\n\r\n**yndx-antoshkka, 21 декабря 2017, 17:22**\r\nAndrey Davydov, а вообще \"VII. Ultimate solution\" в бумаге решает проблемы пункта 1 и 2 ( и ещё десяток случаев). Но я очень сомневаюсь что его согласятся принять в ближайшее время.\r\n\r\n\r\n**Andrey Davydov, 21 декабря 2017, 18:40**\r\nyndx-antoshkka,\r\n\r\n> Для пункта 1 я напишу отдельное предложение, по обязательному implicit move при возвращении субобъектов.\r\n\r\nОк, но с точки зрения прикладного программиста бесполезно текущее предложение без обязательного implicit move, ведь ему придется явно использовать std::move, что убьет возможность copy elision.\r\n\r\n> В случае с пунктом 2, проблема в данный момент присутствует и для NRVO.\r\n\r\nДа, но сейчас нет такого, что при механической замене на structured binding NRVO перестает работать (при переходе от моего примера #1 к #3). И нет разницы в смысле эффективности между pair и tuple, а если принять Ваш proposal, то станет эффективнее писать\r\n```cpp\r\nstd::pair v = ...;\r\nreturn v.first;\r\n```\r\nчем\r\n```cpp\r\nstd::tuple v = ...;\r\nreturn std::get<0>(v);\r\n```\r\n\r\n**yndx-antoshkka, 22 декабря 2017, 16:52**\r\nВерно. Прорабатываю более общее решение|, которое учитывает эти случаи.\r\n\r\n\r\n**Antervis, 21 декабря 2017, 7:52**\r\nможно даже несколько переформулировать: неявный move/nrvo для объектов/субобъектов, не используемых после return. Чтобы Class a {args...}; auto b = move(a); оптимизировался в Class b {args...};\r\n\r\n\r\n**Antervis, 21 декабря 2017, 7:52**\r\nпоправка: *не используемых после move/return\r\n\r\n\r\n**yndx-antoshkka, 22 декабря 2017, 16:49**\r\nПоследние 3 дня как раз прорабатываю более общее решение, оптимизирующее ещё большее количество случаев.\r\n\r\nКак приведу в должный вид - опубликую на сайте, отдельным предложением.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808400600/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808721333", + "html_url": "https://github.com/cpp-ru/ideas/issues/119#issuecomment-808721333", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/119", + "id": 808721333, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODcyMTMzMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-27T11:57:03Z", + "updated_at": "2021-03-27T11:57:03Z", + "author_association": "MEMBER", + "body": "Ребята из Интела написали предложение https://wg21.link/p2077 . Молодцы!", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808721333/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808741538", + "html_url": "https://github.com/cpp-ru/ideas/issues/44#issuecomment-808741538", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/44", + "id": 808741538, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwODc0MTUzOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-27T14:28:24Z", + "updated_at": "2021-03-27T14:28:24Z", + "author_association": "MEMBER", + "body": "Идею обсудили https://lists.isocpp.org/std-proposals/2020/08/1684.php\r\nМожно начинать писать предложение", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/808741538/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809167459", + "html_url": "https://github.com/cpp-ru/ideas/issues/254#issuecomment-809167459", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/254", + "id": 809167459, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE2NzQ1OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:07:20Z", + "updated_at": "2021-03-29T08:07:29Z", + "author_association": "MEMBER", + "body": "**Antervis, 22 декабря 2017, 8:38**\r\nref-qualifier нужен для выполнения перегрузок. Лямбды не поддерживают перегрузки. Это может быть актуально только после введения в стандарт P0051 - generic overload function, но и даже в этом случае ref-qualifier лучше задавать в виде шаблонного параметра/аргумента overload, а не сигнатуры лямбды\r\n\r\n\r\n**Andrey Davydov, 22 декабря 2017, 16:40**\r\n> ref-qualifier нужен для выполнения перегрузок\r\n\r\nНе только. Еще, если я хочу чтобы тот кто будет вызывать мою лямбду сделал это не больше одного раза (что очень естественно для callback'ов). Т.е. я хочу чтобы мою лямбду можно было вызвать из такой функции\r\ntemplate void invoke_once(F && f) { std::move(f)(); }\r\nно нельзя было бы из такой:\r\n```cpp\r\ntemplate void invoke(F && f) { f(); }\r\n```\r\n\r\n**webreh, 22 декабря 2017, 19:40**\r\nAntervis, ref-qualifier и const нужен не для выполнения перегрузок, а для указания характера передачи формального параметра в *this. Например, для внешней функции для std::unique_ptr detach(some&& object) { return std::move(object.inner_); } точная запись будет struct some { std::unique_ptr detach() && { return std::move(inner_); } std::unique_ptr inner_; };\r\n\r\n\r\n**Antervis, 25 декабря 2017, 6:12**\r\nwebreh, я так полагаю, вы хотите чтобы ref-qualifier && указывал, что лямбда может выполняться только однократно?\r\n\r\n\r\n**webreh, 25 декабря 2017, 14:05**\r\nAntervis, да, мне кажется, что это наиболее естественное в текущем языке указание однократного выполнения функции.\r\n\r\n\r\n**languagelawyer, 26 мая 2018, 7:01**\r\nAndrey Davydov, что помешает сделать\r\n```cpp\r\nstd::move(f)(); std::move(f)();\r\n```\r\n???\r\n\r\n\r\n**Andrey, 26 мая 2018, 9:31**\r\nlanguagelawyer, совесть или static analyzer (clang-tidy [bugprone-use-after-move])", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809167459/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809168876", + "html_url": "https://github.com/cpp-ru/ideas/issues/255#issuecomment-809168876", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/255", + "id": 809168876, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE2ODg3Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:09:23Z", + "updated_at": "2021-03-29T08:09:23Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 25 декабря 2017, 10:49**\r\nИдея огонь!\r\n\r\nПара хотелок:\r\n* constexpr void radix_sort\r\n* так же предложить в proposal добавить параллельные версии\r\n* burst не указывает лицензию для использования. Нужно либо добавить пермессивную лицензию, либо сделать отдельный репозиторий только с radix_sort, либо pull-request в Boost с radix_sort\r\n\r\nПопробуйте написать proposal, следуя инструкции. По любым вопросам - обращайтесь, помогу.\r\n\r\n\r\n**Дмитрий, 25 декабря 2017, 14:05**\r\nyndx-antoshkka, спасибо.\r\nНад параллельной версией уже работаю.\r\n\r\nА по вопросам как обращаться? Писать на cpp-proposal@yandex-team.ru?\r\nИли в этой теме?\r\n\r\n\r\n**yndx-antoshkka, 25 декабря 2017, 14:12**\r\nМожно на личную почту, можно на cpp-proposal@yandex-team.ru, можно тут. Как удобнее.\r\n\r\n\r\n**zamazan4ik@tut.by, 25 декабря 2017, 15:00**\r\nЯ очень сильно рекомендую заглянуть вот в этот репозиторий на гитхабе: https://github.com/Morwenn/cpp-sort\r\n\r\nЗдесь вы найдёте очень много сортировок под самые разные случаи жизни.\r\n\r\nНа самом деле в Boost.Sort реализована одна суепр-сортировка, которая состоит из 3 (или 4, не помню уже). Вы просто вызываете boost::spreadsort, а она в зависиомсти от того, что пришло на вход, вызывает либо integer_sort, либо float_sort, либо string_sort. Касательно boost::integer_sort - там реализована сортировка spreadsort, автором коей является сам мейнтейнер Boost.Sort. Она не прям чтобы слишком быстрая, но в среднем случае работает очень неплохо.\r\n\r\nОсновная проблема здесь в том, сколько сортировок стоит добавлять в Стандарт. Я вот например хочу pdqsort вместо introsort. А ещё я хочу count_sort, потому что на моих кейсах это будет быстрее. А ещё где count_sort не подходит я хотел бы radix_sort, который тоже хорош. Если я знаю, что мои данные почти отсортированы, я хочу TimSort, который очень быстрый на таких вот кейсах. Так где стоит остановиться?\r\n\r\n\r\n**Дмитрий, 25 декабря 2017, 15:56**\r\nzamazan4ik@tut.by,\r\n0. За ссылку спасибо. Но целочисленные сортировки оттуда не обладают всеми качествами, которые я здесь предлагаю.\r\n1. Я сравниваюсь конкретно с boost::integer_sort, о чём я писал и здесь, и в публикации на Хабре. Она почти всегда медленнее моей. Графики в публикации по ссылке.\r\n2. Целочисленные сортировки — это совершенно иной класс алгоритмов по сравнению с сравнивающими сортировками. Я считаю, что стандарту только выиграет от того, что появится сортировка, требующая дополнительной памяти, но работающая гораздо быстрее, чем std::sort и не требующая порядка на сортируемых элементах.\r\n\r\n\r\n**zamazan4ik@tut.by, 25 декабря 2017, 16:59**\r\ndmitriy@izvolov.ru, проблема в том, что надо найти границу, когда нам стоит остановиться. Я бы предпочёл иметь просто набор стандартных сортировок, которыми можно пользоваться. Но на такое Комитет скорее всего не пойдёт примерно по тем же причинам, почему автор Boost.Sort не хочет принимать новые сортировки: \"Нет смысла принимать все подряд сортировки, потому что только в некоторых случаях они дают выигрыш\". Я не согласен с такой точкой зрения, но что ж поделать. Стандарт описывает только интерфейсы, а вся подкапотная реализация ложится на плечи STL-писателей.\r\n\r\nПо поводу целочисленной сортировки - есть ещё ska_sort, она тоже довольно быстрая.\r\n\r\n\r\n**cpp_ape, 15 июля 2019, 18:03**\r\nska_sort ещё и не только чиселки умеет\r\n\r\n\r\n**maxim-klekovkin10, 7 мая 2018, 12:47**\r\nОбновлено 15 июля 2019, 18:04\r\n\r\n\r\nКакова алгоритмическая трудоёмкость (сложность) алгоритма в зависимости от входных данных?\r\n\r\n \r\n\r\n\r\n**Дмитрий, 11 июля 2018, 16:08**\r\nmaxim-klekovkin10, O(n).\r\n\r\n\r\n**cpp_ape, 15 июля 2019, 18:02**\r\nmaxim-klekovkin10, O(n*b) в худшем случае, где n - количествово элементов, b - количество байтов в элементе.\r\n\r\n\r\n**cpp_ape, 15 июля 2019, 17:52**\r\nвот чувак уже сделал большую часть работы: https://youtu.be/zqs87a_7zxw\r\n\r\nсортировка практически всего, что угодно, не только чиселок", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809168876/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809170990", + "html_url": "https://github.com/cpp-ru/ideas/issues/256#issuecomment-809170990", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/256", + "id": 809170990, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE3MDk5MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:12:34Z", + "updated_at": "2021-03-29T08:12:34Z", + "author_association": "MEMBER", + "body": "**копать во все это?, 40 за**\r\nОбсудили идею на встрече https://events.yandex.ru/events/cpp-party/15-jun-2018/ . Далее - стенограмма обсуждения:\r\n\r\n\r\nUltimate copy elisions\r\naaaand\r\nSubobjects copy elision\r\n\r\nНе вызывать копи или мув конструктор\r\nОграниченно сильно\r\n\r\nВ RVO\r\n```cpp\r\nstruct T {\r\n T() noexcept; T(T&&) noexcept; ~T() noexcept;\r\n void do_something() noexcept;\r\n};\r\n...\r\n\r\nT d = shrink(update(produce()));\r\n\r\n```\r\nПростыня асма.\r\nФукнции заинлайнены.\r\nОбъект создается.\r\n\r\nСоздает новую переменную, это плохо\r\nНесколько раз делает.\r\n\r\nВместо копирования Y в X можно переиспользовать Y. Используется copy elision.\r\nКод уменьшается. Нет лишних деструкторов и конструкторов.\r\nОслабить требования.\r\nПозволить смешивать оптимизации.\r\n\r\nПоднять опт. с middle до front? Или copy elision в middle?\r\n\r\nКакие проблемы решаются?\r\nКод уменьшается, больше оптимизаций. => время компиляции.\r\nПроизводительность выше, меньше бинари.\r\nПроще учить плюсам людей, не надо думать о std::move на первых порах.\r\n\r\nПродвинутое использование:\r\n```cpp\r\nreturn path(__lhs) /= __rhs; // copy elision запрещен, not compile\r\n\r\nreturn pair.second; // вызвать destructor от pair.first и продолжить\r\nraturn get<0>(tuple); // same\r\nauto [a,b] = foo(); return a; // same\r\nreturn local_aggregate_variable.name // same\r\n```\r\nРаботает часто только для inline\r\nПроблемы для не trivially_destructible\r\n```cpp\r\nreturn stringstream.str();\r\nreturn get(variant);\r\nreturn path.string();\r\n```\r\nNot only for function returns\r\nAll together\r\nCopy elision разрешен для любого non volatile объекта, распол. на стеке и его полей, если source объект не используется перед конструированием.\r\n\r\nHow far we should go?\r\nРечь о возврате по значению.\r\n\r\nПредложение скорее всего ломает пользовательский код, но скорее всего только не переносимый.\r\nЕсли нарушить условия, код нельзя перенести с одного компилятора на другой и даже на другую версию одного компилятора и нельзя переносить между импл. stl.\r\nЕсли ваши объекты посли копи или мув не равны, то вы неправильно пишите код.\r\nАлгоритмы не будут работать с такими типами, который нарушают эти условия.\r\nУже сущетсвующие правила copy elision позволяют делать такие вещи.\r\nУже сейчас нужно осторожно использовать pmr.\r\nВывод: пишите regular типы. У вас и так всё сломается, лучше не пишите на С++\r\n\r\nВопрос о странном конструкторе, который передает указатели на несуществующие объекты в свой подклассы.\r\nОтвет: в gcc такое поведение - UB. В любом случае так лучше не делать.\r\nДенис: мы говорим только про return и rvalue?\r\nОтвет: нет\r\n\r\nВопрос: пусть есть несколько локальных объектов, а ты возвр. тупл из этих объектов. Я не буду использовать эти объекты больше. Этот use case сюда входит?\r\nОтвет: входит, но это пункт о передачи аргументов в функцию, она сложная\r\nВопрос: если мы не можем делать все честно, можно ли просто сделать конвертацию в x-value?\r\nОтвет: Да, по сути можно, нужно подумать еще\r\nВопрос: Что с типами, внутри которых union?\r\nОтвет: то же самое. Копирования его не будет\r\nДенис: смущает отсутствие адреса. Быстро говорит. Отсутствие адреса смущает\r\nОтвет: Надо подумать. Ответ не особо то есть\r\nВопрос: неверное направление. Компиляторы же уже могут это делать?\r\nОтвет: нет, не умеют.\r\nВопрос: может нужно дать больше информации компилятору? На уровне стандарта. Разве сейчас уже нельзя выкинуть new и delete?\r\nОтвет: Да, сейчас что-то можно, но не так, как хотелось бы. То есть конструкторы создаются, но могут не использоваться. Наша цель - убрать конструкторы.\r\nВопрос: Пусть есть динамик объект. С 1 по 2 пункт не будет нигде гарантии о возвращении под из не под объекта.\r\nОтвет: для таких объектов нельзя такого делать. Json аллоцирует память, работать не будет\r\nВопрос: а для таких json, которые на стеке и все такое?\r\nОтвет: Не работает в случаях, если конструкторы меняют стейт программы.\r\nВопрос: про асм. Представляю немного об этом. Как объекты на стеке выделяются. Для функции мы сдвигаем стек поинтер. Вы сделали большой объект. Нам потом нужно убрать большой кусок, но оставить кусок для подобъекта.\r\nОтвет: работает только для за-inline-неных. компилятор может это разрулить\r\nВопрос: Но ведь нарушается порядок обращения к полям\r\nОтвет: не особо понятно, о чем вы говорите. Если функция не inline, то говорить не о чем. Передвигать поля не нужно.\r\n\r\nОтвет: elision - это убирание мув и копи конструктра.\r\nВопрос: не получится ли так, что при попытке заинлайнить деструктор, сген. компилем, что эффект уменьшения кода будет компенс. необходимостью многое удалять\r\nОтвет: все зависит от разработчиков компилятора. Все зависит от них. Может только с О3, а может и с О0\r\nДенис: что такое dd\r\nОтвет: знать, что написано = default. Или что его нет вообще.\r\nДенис: я отнасл. от вектора.\r\nОтвет: хз\r\n\r\nНе только для ретурнов:\r\nВопрос: пусть где-нибудь исключение и раскрутка стека. Как будет соглас. все удаления.\r\nОтвет: таблицы свертки будут меньше, за счет того, что будет меньше кода. А дальше все компилятор думает.\r\nВопрос: часто говорите о компилятора\r\nОтвет: ну да, им лучше знать\r\nВопрос: сейчас take by copy берет значение по копии. То, что вы обозначили на первых строчках решается с использованием universal reference. То есть мы научилсь договаривать.\r\nОтвет: ну да, можно сделать мув. Но если работаем со старым кодом, ничего не получится улучшить. Если работаем с кодом, где пользователь использовал мув, то компилятор и так соптимизирует.\r\nВопрос: может поговорим о том, что если переменная используется последний раз, то пусть и так будет std::move.\r\nОтвет: а если это цикл? и тд\r\nВопрос: Я этого так ждал!\r\nОтвет: ура...\r\nДенис: У двух копий должны быть разные адреса. Или все ломается.\r\nОтвет: Сейчас работает в rvo так работает\r\nДенис: если раньше взяли адрес от переменной, которую потом хотим заслать\r\nОтвет: сложно, нужно следить за временем жизни. Эт рили сложно. Если адресная арифметика, компилятор может не делать ничего. Если ему сложно.\r\nДенис: Оч мало случаев, когда адреса можно сравнивать\r\nОтвет: ну да\r\nВопрос: Не понятно время жизни объекта, который внутрь инлайнится. Допустим T - это гард. Его деструктор в каком блоке вызывается? В функции или в блоке, из которого вызвана?\r\nОтвет: функция заинлайнится, поэтому будет общий скоуп. Опять же, обязана заинлайниться.\r\nВопрос: как меняется время жизни объекта? в 3 пункте. Про умные указатели говорю. Там всякие каунтеры.\r\nОтвет: надо как-то жестче специфицировать, как деструкторы должны пересекаться. Иначе в этом случае временный объект живет до конца выражения. Может нельзя деструкторы менять местами. Тут должен любой деструктор срабатывать.\r\nВопрос: про смарт птр. Я понимаю, что все работает со стандартными. А если не стандартные. Какая-то жесть.\r\nОтвет: если у тебя что-то странное с внешними эффектами, не делай так. Покажи этот код ПОКАЖИ ЕГО НАМ\r\nВопрос: Я придумал юз кейс, когда код может сломаться, который раньше работал. Если тип Т - это некий таймер, который при констр. взводиться и в дестр. записывает в лог. То в первой строчке вызовится не там и 2 раза.\r\nОтвет: обычно таймеры не копируются.\r\nВопрос: но иногда копируются\r\nОтвет: покажите нам этот код, пришлите нам, мы на него посмотрим.\r\nВопрос: может просто добавить аттрибут\r\nОтвет: есть такая штука volatile, то для нее ничего не сработает\r\nВопрос: протухший код можно детектить?\r\nОтвет: можно, будет млн сообщений и придется кучу кода менять. Вообще уже в стандарте кучу кода придется менять, делать trivially_destructible и тд.\r\nВопрос: думал, как сломать. Договорились, что сайд эффекты - это плохо. Допустим я считаю в компайлтайме. Так уже можно copy elision?\r\nОтвет: да, там уже это можно\r\nВопрос: не может ли за из-за copy elision в ран и компайл тайме отличаться поведение\r\nОтвет: это возможно уже сейчас\r\n\r\nГолосование:\r\n\r\n\r\n**15 почти за, 5 нейтрально**\r\n**0 против, 0 строго против**\r\n**, 1 пункт:**\r\n=> копай дальше\r\n\r\n\r\n**17 за, 27 почти за**\r\n**3 нейтрально, 0 против**\r\n**, 2 пункт:**\r\n0 строго против\r\n\r\n\r\n**нужно ли копать в него?, 15 за**\r\nнет смысла голосовать\r\n\r\n\r\n**15 почти за, 6 нейтрально**\r\n**3 против, 2 строго против**\r\n**, 4 пункт(посылать в функции аргументы):**\r\nЧеловек: против, потому что нарушает дух языка. С выиграл, потому что язык, который работал везде и позволял запихать биты туда, куда надо. Выше предложение это нарушает. Духа нет. Бездушно.\r\nОтвет: Свойство это уже сейчас есть. С++ такой.\r\nАнтон: Не согласен, так как все оптимизации, невидимые пользователю, разрешены.\r\n\r\nЧеловек: я против, потому что не понимаю, как это можно сделать\r\n\r\n\r\n**26 за, 24 почти за**\r\n**7 нейтрально, 4 против**\r\n**yndx-antoshkka, 25 июня 2018, 12:38**\r\n0 строго против\r\n\r\n\r\n**Mikhail Shostak, 27 июня 2018, 0:22**\r\nОбновлено 25 июня 2018, 12:41\r\n\r\n\r\nТут попался код из std::thread:\r\n```cpp\r\nstd::invoke(decay_copy(std::forward(f)), decay_copy(std::forward(args))...);\r\n```\r\nwhere decay_copy is defined as\r\n```cpp\r\ntemplate \r\nstd::decay_t decay_copy(T&& v) { return std::forward(v); }\r\n```\r\nhttps://en.cppreference.com/w/cpp/thread/thread/thread\r\n\r\nЯ так понимаю с этим предложением подобный код может поломаться и перестать копировать. Но, видимо, предложенный copy elision в случае с потоками не будет срабатывать даже если там всё заинлайнится т.к. decay_copy будет вызывается на стеке нового потока и f и args уже не будут являться \"локальными\" переменными. Возможно где-то еще есть подобное копирование, но где такое может понадобиться с ходу придумать не получилось.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809170990/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809174089", + "html_url": "https://github.com/cpp-ru/ideas/issues/257#issuecomment-809174089", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/257", + "id": 809174089, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE3NDA4OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:16:57Z", + "updated_at": "2021-03-29T08:16:57Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 27 декабря 2017, 13:18**\r\nИдея в принципе хорошая, но надо её сильно доработать:\r\n* итераторы basic_string_view могут быть чем угодно, не только указателями. Поэтому такая сигнатура может работать на одной стандартной библиотеке и не работать на другой. Такое поведение недопустимо\r\n* Если заменить пару указателей на пару итераторов, то наталкиваемся на старую проблему - в стандартной библиотеке нет категории итераторов которая говорит, что данные располагаются в памяти последовательно. Получается, что можно будет случайно создать string_view от std::deque и схлопотать неприятностей\r\n* Если добавить множество сигнатур, для итераторов std::string, std::vector, std::array, то получается плохо масштабируемое решение, не работающее с пользовательскими контейнерами\r\n\r\nНужно придумать как обойти все выше озвученные проблемы\r\n\r\n\r\n**Antervis, 27 декабря 2017, 13:35**\r\nyndx-antoshkka, \"в стандартной библиотеке нет категории итераторов которая говорит, что данные располагаются в памяти последовательно\" - а как же RandomAccessIterator?\r\n\r\n\r\n**Дмитрий, 27 декабря 2017, 13:46**\r\nyndx-antoshkka, можем ли мы декомпозировать проблему на две части:\r\n1. Конструктор с указателями;\r\n2. Конструктор с итераторами?\r\n\r\nНасчёт первого из них всё выглядит так, как будто его просто забыли добавить. Я имею в виду, что он нужен независимо от варианта с итераторами.\r\nСо вторым действительно всё сложнее. А работы над подобной категорией итераторов в принципе уже ведутся?\r\n\r\n\r\n**Дмитрий, 27 декабря 2017, 13:50**\r\nAntervis, итератор деки является произвольным.\r\n\r\n\r\n**Antervis, 28 декабря 2017, 6:47**\r\ndmitriy@izvolov.ru, я вас понял. Однако, подходящая категория итераторов все-таки существует: ContiguousIterator. В motivation части его propolsal'а даже указано, что он нужен для реализации string_view от пары итераторов:\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3884.pdf\r\n\r\n\r\n**Дмитрий, 28 декабря 2017, 9:02**\r\nAntervis, действительно, спасибо за уточнение.\r\nВозможно, Антон имел в виду, что невозможно на этапе компиляции проверить, что итератор непрерывный. В предложении действительно упоминается contiguous_iterator_tag, но в текущем черновике стандарта я его не вижу.\r\n\r\n\r\n**zamazan4ik@tut.by, 30 декабря 2017, 4:19**\r\ndmitriy@izvolov.ru, его в Стандарт ещё не включили ведь, эту категорию итераторов.\r\n\r\n\r\n**Дмитрий, 30 декабря 2017, 11:28**\r\nzamazan4ik@tut.by, и не включат, как я понял. Вот тут нашёл объяснение: https://stackoverflow.com/questions/42851957/contiguous-iterator-detection\r\n\r\nТак что надо ждать концептов.\r\n\r\n\r\n**yndx-antoshkka, 21 июля 2020, 9:27**\r\nДобавили в C++20 конструктор от двух continius итераторов basic_string_view::basic_string_view (пара указателей подходят под концепт continius итераторов)\r\n\r\n ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809174089/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809176961", + "html_url": "https://github.com/cpp-ru/ideas/issues/259#issuecomment-809176961", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/259", + "id": 809176961, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE3Njk2MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:21:19Z", + "updated_at": "2021-03-29T08:21:19Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 января 2018, 12:40**\r\nИдея интересная но в таком виде работать не будет:\r\n* вызывающей стороне нужно знать, какие регистры ассемблерная функция использует и не восстанавливает\r\n* вызывающей стороне нужно знать memory order ограничения вашей ассемблерной функции\r\n* copy elision на x86 использует rdi регистр, а не просто eax при возврате больших значений\r\n* такая ассемблерная функция должна иметь internal linkage, иначе будут весёлые проблемы при её вызове сторонней библиотекой\r\n* ...\r\n\r\nНачните продумывать идею с https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html\r\nТам описаны дополнительные подсказки при ассемблерной вставке, необходимые компилятору для генерации эффективного кода вокруг ассемблерной вставки.\r\n\r\n\r\n**smertigdon, 12 января 2018, 15:20**\r\nС текущей реализацией все ключевые слова ассемблера автоматически становятся ключевыми словами C++. Это сильно раздувает стандарт и грамматику, добавляет неоднозначности.\r\nТянуть один язык в другой - не шибко хорошая идея, хоть я и сам пользуюсь асм-вставками.\r\n\r\n\r\n**Fihtangolz, 18 июля 2018, 0:30**\r\nsmertigdon, в чем проблема сделать inbrace лексику, просто берем написанно и с небольшими изменениями выплевываем ассеблеру тоже самое по сути что мс, каша в виде \"\" в гцц откровенно говоря выглядит не слишком дружелюбно для чтения. Давно пора стандартиировать ситаксис вставок, конечно эту проблему можно решить внешней библиотекой с парой макросов, но ассемблерная вставка самом по себе громозкая нехватаеет туда еще пары макросов для консистентности \r\n\r\n\r\n**Виктор Губин, 28 марта 2018, 14:42**\r\nПочему-бы не стандартизировать сам синтаксис ассемблерных вставок?\r\n\r\nВ GCC имеем:\r\n```\r\n__asm__ ( \"addq %rbx,%rax\\n\" : \"=a\"(ret), \"a\"(lsh), \"b\"(rhs) : );\r\n```\r\nВ MS VC++\r\n```cpp\r\n__asm \r\n{\r\n mov rax,lsh\r\n mov rbx,rhs\r\n add rax,rbx\r\n mov ret,rax\r\n}\r\n```\r\nАссемблерный код понятное дело зависит от целевого процессора, но синтаксис самой вставки разный от компилятора к компилятору.\r\n\r\nВ итоге идетичный код нужно дублировать как - для типа CPU или OS, так и для разных компиляторов.\r\n\r\n\r\n**vlad-ger-m, 28 апреля 2018, 15:11**\r\nХорошая идея -\r\n\r\n(\"вариант реализации функции с внутренним ассемблерным кодом, которая сможет встроиться в наш код с помощью компилятора. В современном gcc, есть возможность вызова некоторых команд процессора напрямую с помощью специальных intrinsic-функций\". ) ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809176961/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809178147", + "html_url": "https://github.com/cpp-ru/ideas/issues/260#issuecomment-809178147", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/260", + "id": 809178147, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE3ODE0Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:22:59Z", + "updated_at": "2021-03-29T08:22:59Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 12 января 2018, 21:21**\r\nhttp://en.cppreference.com/w/cpp/experimental/ostream_joiner\r\n\r\n\r\n**Antervis, 15 января 2018, 9:13**\r\nЕще есть ranges-v3::view::join\r\n\r\n\r\n**d-yaroshev, 18 января 2018, 21:54**\r\nНадо сказать, что написание этой функции - это целая история.\r\n\r\nНапример, упражнения в abseil: https://github.com/abseil/abseil-cpp/blob/master/absl/strings/internal/str_join_internal.h#L226", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809178147/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809184410", + "html_url": "https://github.com/cpp-ru/ideas/issues/260#issuecomment-809184410", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/260", + "id": 809184410, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE4NDQxMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:31:57Z", + "updated_at": "2021-03-29T08:31:57Z", + "author_association": "MEMBER", + "body": "Пока можно обходиться парой строчек с ranges: https://godbolt.org/z/h8E9oMdvs\r\nНо есть над чем работать", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809184410/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809186021", + "html_url": "https://github.com/cpp-ru/ideas/issues/261#issuecomment-809186021", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/261", + "id": 809186021, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE4NjAyMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:34:20Z", + "updated_at": "2021-03-29T08:34:20Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 22 января 2018, 14:06**\r\nАналогичное предложение: #58 \r\n\r\n**Айдар Фаттахов, 22 января 2018, 17:37**\r\n1) почему бы не использовать PODы если нужен относительно прямой доступ к членам?\r\nЕсли же нужна инкапсуляция обычно не стоит ваще показывать ВСЕ свое состояние наружу (тем более позволять изменять), этим любят злоупотреблять в джаве и сишарпе\r\n2) метаклассы сделают эту штуку легко имплементируемой", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809186021/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809187100", + "html_url": "https://github.com/cpp-ru/ideas/issues/262#issuecomment-809187100", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/262", + "id": 809187100, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE4NzEwMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:35:55Z", + "updated_at": "2021-03-29T08:35:55Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 22 января 2018, 14:09**\r\nНе очень понял, что именно вы предлагаете?\r\n\r\n\r\n**d-yaroshev, 28 января 2018, 20:20**\r\n@Антон\r\n\r\nВиноват, если не понятно получилось.\r\nПри написании алгоритмов часто возникает необходимость обращаться к зависимым типам:\r\ndifference_type, value_type etc.\r\n\r\nЭти типы надо доставать через traits, причем для разных концептов это разные traits, те если нужно работать с аллокаторами, итераторами и контейнерами, начинается страдание.\r\n\r\nБыло бы не плохо иметь type functions которые бы делали то что надо и были короткие.\r\n\r\nЧто-нибудь:\r\n\r\n```\r\ntemplate \r\nrequires Iterator\r\nstd::difference_type count_all_entries(I f, I l, std::const_ref v);\r\n```\r\n\r\n```\r\ntemplate\r\nrequires Allocator && Iterator\r\nvoid allocate_with_padding(A& a, I f, I l, std::size_type padding);\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809187100/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809191164", + "html_url": "https://github.com/cpp-ru/ideas/issues/262#issuecomment-809191164", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/262", + "id": 809191164, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE5MTE2NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:41:49Z", + "updated_at": "2021-03-29T08:41:49Z", + "author_association": "MEMBER", + "body": "В ranges добавлили подобные хелперы, например std::ranges::range_value_t https://eel.is/c++draft/ranges\r\n\r\nНо на мой взгляд не хватет некоторых вещей\r\n* std::rvalue_ref - чтобы отключать forwarding reference\r\n* std::lvalue_ref - чтобы отключать вывод `T=const Type` для функций наподобие `template void foo(T&);` ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809191164/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809192488", + "html_url": "https://github.com/cpp-ru/ideas/issues/263#issuecomment-809192488", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/263", + "id": 809192488, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE5MjQ4OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:43:41Z", + "updated_at": "2021-04-02T18:20:40Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 5 февраля 2018, 11:25**\r\nconstexpr они в ближайшем будущем не станут, так как используют локали.\r\nПринимать string_view - это хорошая идея, но нужен протитип\r\n\r\n\r\n**ru.night.beast, 5 февраля 2018, 13:48**\r\nyndx-antoshkka, а нужны ли локали для преобразования строки в число? может есть смысл в дополнительных функциях нормализации строки, а конвертеры пусть работают уже с нормализованной.\r\n\r\n\r\n**yndx-antoshkka, 5 февраля 2018, 14:27**\r\nВы предлагаете std::to_chars/std::from_chars :)\r\n\r\nЯ перепроверил, ваше предложение на использование string_view уже рассматривается вот тут http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0506r2.pdf и скорее всего попадёт в C++20\r\n\r\nА вот сделать std::to_chars/std::from_chars constexpr - очень хорошая задача!\r\n\r\n\r\n**ru.night.beast, 5 февраля 2018, 15:02**\r\nyndx-antoshkka, ну, предложение не мое :) просто пять копеек добавил...\r\n\r\n\r\n**Antervis, 6 февраля 2018, 14:03**\r\nyndx-antoshkka, а string_view версия не будет медленнее const char * аналога?\r\n\r\n\r\n**yndx-antoshkka, 8 февраля 2018, 12:52**\r\nПерегрузка с const char* остаётся, при передаче char* и const char*, выбирается именно она, так что медленнее не будет.\r\n\r\n\r\n**neondev9, 31 марта 2019, 19:18**\r\nДвумя руками за, ибо пришлось писать самому constexpr-конвертер вида:\r\n```\r\ntemplate\r\nstd::optional FromString(std::string_view str);\r\n\r\ntemplate\r\nstd::optional FromString(std::wstring_view str);\r\n```\r\n \r\n\r\nКлассно работает с std::optional, ибо если возвращать std::nullopt, то с вызывающей стороны intellisence подсвечивает ошибку при неудачной constexpr конвертации.\r\n\r\n \r\n\r\nДля int-ов и bool реализовал constexpr из char, wchar_t (char16_t, char32_t не делал). \r\n\r\nДля float, временно, подцепил не constexpr функции из std(strtof/wcstof, strtod/wcstod, strtold/wcstold), поэтому сама функция FromString пока не constexpr, в отличии от конвертеров int-ов и bool.\r\n\r\n\r\n**yndx-antoshkka, 22 июля 2020, 11:51**\r\nОбновлено 31 марта 2019, 19:20\r\n\r\n\r\nИдея была представлена в бумаге https://wg21.link/P0506 и отклонена комитетом:\r\n\r\n* если заменять const std::string& на string_view, то ломается пользовательский код с неявными преобразованиями\r\n\r\n* если добавлять перегрузки, то необходимо иметь по 3 перегрузки для каждого метода или много шаблонного безобразия\r\n\r\n* если добовлять новые методы, с новыми именами... то производительность это не особо улучшает, т.к. большая часть времени тратится на локали, а конструирование малой строки как правило происходид без динамической аллокации\r\n\r\n \r\n\r\nТак что P0506 отклонили в 2017 году. Но возможно с C++20 и концептами можно придумать хорошее решение, без недостатоков 2017 года.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809192488/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809195570", + "html_url": "https://github.com/cpp-ru/ideas/issues/265#issuecomment-809195570", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/265", + "id": 809195570, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE5NTU3MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:48:07Z", + "updated_at": "2021-03-29T08:48:07Z", + "author_association": "MEMBER", + "body": "**Antervis, 6 марта 2018, 7:13**\r\nдля ОС-специфичных задач вам скорее всего придется инклюдить разные header'ы. Вообще, в случае с++ диспатчинг по ОС - скорее задача системы сборки\r\n\r\n\r\n**yndx-antoshkka, 14 марта 2018, 21:36**\r\nПервоначальное предложение на constexpr if как раз позволяло такие конструкции. После обсуждения решено было запретить подобное, так как возникало множествво нерешаемых вопросов. Самое первое предложение по теме: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3322.pdf\r\n\r\nВ нём можно было делать подобное:\r\n```cpp\r\ntemplate< class T >\r\nclass C\r\n{\r\n void common( ) { ... }\r\n\r\nstatic_if( has_property1() ) {\r\n void f1( ) { ... }\r\n}\r\n\r\nstatic_if( has_property2() ) {\r\n void f2( ) { ... }\r\n} else {\r\n void f2( ) = delete;\r\n}\r\n\r\n};\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809195570/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809196583", + "html_url": "https://github.com/cpp-ru/ideas/issues/266#issuecomment-809196583", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/266", + "id": 809196583, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE5NjU4Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:49:37Z", + "updated_at": "2021-03-29T08:49:37Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 5 марта 2018, 20:16**\r\nС помощью гипотетической функции (которая должна появиться в рамках Ranges TS) Ваш пример можно будет выразить так:\r\n```cpp\r\nfor (auto [i1, i2, i3] : std::zip(a, b, c)) {\r\n std::cout << i1 << \", \" << i2 << \", \" << i3 << \"\\n\";\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809196583/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809197413", + "html_url": "https://github.com/cpp-ru/ideas/issues/266#issuecomment-809197413", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/266", + "id": 809197413, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTE5NzQxMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:50:48Z", + "updated_at": "2021-03-29T08:50:48Z", + "author_association": "MEMBER", + "body": "std::view::zip был холодно встречен комитетом", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809197413/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809200402", + "html_url": "https://github.com/cpp-ru/ideas/issues/268#issuecomment-809200402", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/268", + "id": 809200402, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTIwMDQwMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:55:06Z", + "updated_at": "2021-03-29T08:55:06Z", + "author_association": "MEMBER", + "body": "**Виктор Губин, 27 марта 2018, 18:14**\r\nИМХО asio вообще не стоит стандартизировать в том виде в котором она есть.\r\n\r\nНедостатки:\r\n\r\nОчень сложный API\r\n\r\nПространства имен в 4-ре уровня, скажем boost::asio::ip::tcp к тому-же не бывает непонятно в конце цепочки пространство имен или имя типа.\r\n\r\nexperimental::net::v1::ip::std - как этим вообще пользоватся ? \r\n\r\nМножество служебных классов \r\n\r\nнапример открытие клиентского сокета:\r\n```cpp\r\n boost::asio::io_context io_context;\r\n boost::asio::ip::tcp::resolver resolver(io_context);\r\n boost::asio::ip::tcp::resolver::results_type endponints = resolver.resolve(\"localhost\", \"http\");\r\n boost::asio::ip::tcp::socket socket(io_context);\r\n boost::asio::connect(socket, endpoints);\r\n```\r\nТоже в С:\r\n```c\r\n struct addrinfo hints = {AF_UNSPEC,SOCK_STREAM};\r\n struct addrinfo *res;\r\n getaddrinfo(\"localhost\",\"80\", &hints, &res);\r\n int s = socket(res->ai_family,res->ai_socktype,res->ai_protocol);\r\n connect(s,res->ai_addr,res->ai_addrlen); \r\n```\r\nТоже в Java:\r\n```java\r\nSocket socket = new Socket(\"localhost\", 80);\r\nInputStream is = socket.getInputStream();\r\n```\r\nИ ничего не мешает сделать 2-х строковый вариант в объектно-ориентированном С++\r\n\r\nСтроковые константы типа \"http\" - зачем ?\r\n\r\nОтдельные сущьности для ip_v4 и ip_v6\r\n```cpp\r\n asio::tcp::endpoint endpoint(asio::tcp::v4(), \"localhost\" ));\r\n\r\n asio::tcp::endpoint endpoint(asio::tcp::v6(), \"localhost\" ));\r\n```\r\nОт объектно-ориентированной билиотеки подобного рода вещей не ждешь.\r\n\r\n \r\n\r\nСовременная сетьевая библиотека без поддержки защищенных соединений (SSL/TLS) выглядит странно.\r\n\r\n\r\n**yndx-antoshkka, 27 марта 2018, 19:30**\r\nНапишу письмо авторам Networking TS, послушаем что они скажут по вашим замечаниями.\r\n\r\n\r\n**Andrey Davydov, 27 марта 2018, 23:37**\r\nПункт 2, как я понимаю, автоматически следует из Executors TS, а Networking TS зависит от и будет переделан под Executors TS.\r\n\r\n\r\n**yndx-antoshkka, 29 марта 2018, 10:49**\r\nПоговорил с авторами.\r\n\r\nПункты 1 и 2 будут решены во время слияния TS в стандарт. Я предложил убрать namespace net:: в принципе, чтобы буферы, таймеры, база для соектов и прочие вещи оказались в namespace std, а всё что связано с сетью - в namespace std::ip. Возражений не последовало. Свзяей между буфером и асинхронностью нет.\r\n\r\nПо поводу пункта 3. Есть подозрение, что не нравится не столько связь сокетов с io_context, сколько то что в текущей имплементации конструктор io_context достаточно тяжёлый, с динамическими аллокациями и т.п. Автор предлагает продемонстрировать возможность создания zero overhead имплементации io_context. Интересно? Или нужно именно оторвать сокеты от io_context?\r\n\r\n\r\n**dreverser, 29 марта 2018, 12:45**\r\nОбновлено 29 марта 2018, 11:06\r\n\r\n\r\nМне asio тоже не нравится, в большей степени из за его тяжелой имплементации.\r\n\r\nНо хочу я или нет, я вижу что asio все равно втянут в стандарт. Так почему бы не по критиковать в каком виде он в стандарте будет выглядеть более логичным.\r\n\r\nИ я надеюсь что стандарт оговаривает интерфейс а не имплементацию.\r\n\r\nИ каждый отдельный компилятор напишет свои имплементации и имплементация asio не войдет во все компиляторы.\r\n\r\n \r\n\r\nВот от части из за таких сложностей АПИ многие и пишут свои велосипеды.\r\n\r\n \r\n\r\nПункт два уже разбили. Конкурент группа забрала екзекуторы в отдельный пропозл.\r\n\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0443r5.html\r\n\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0761r2.pdf\r\n\r\n \r\n\r\nВ networking TS мне не нравится что это обсуждается в целом одним пучком. Но если они дали добро на разбиение на части в финальной коммите то хорошо.\r\n\r\nБуферы связаны с ректором через асинхронные операции.\r\n\r\n\"17 Buffer-oriented streams\"\r\n\r\nЯ не смотрел имплементацию. Но не понятно эти streams шаблонные и никак не прибитые к буферам или там какой то интерфейс и он прибит к реактору ?\r\n\r\nИ где объявлены эти самые буферы. В файле буфера или где то в отдельном файле ?\r\n\r\nЧего именно хочется. Что бы включив к себе куда то в код буфера для своих нужд, оно не потянуло еще один хидер ректора итд. Вот это и хочется отцепить - разбить.\r\n\r\n \r\n\r\nПо сокетам аналогично. Если как я понял буферы не прибиты к реактору. А асинхронка на шаблонах, То почему так же не сделать и с сокетами ?\r\n\r\nУ меня должна быть возможность сконструировать сокет или создать блокированый ИО не затягивая весь реактор и тем более нехочу к нему привязываться.\r\n\r\nЯ сейчас не смотрю на имплементацию, Я смотрю на дизайн который мне навязывают. И я не смогу никак заюзать сокет без реактора.\r\n\r\nХочет кто то юзать прибитыми к конструктору сокеты. Ну ок, пусть в стандарт введут async_socket унаследованый от сокета, где в конструкторе будет реактор.\r\n\r\nХотя у меня тут же вопрос. А почему тогда не сделать async_buffer ? Ну или опять же, не плодить async_socket а сделать шаблоны асинхронки как это сделано для буфера.\r\n\r\n\r\n**dreverser, 29 марта 2018, 12:49**\r\nМожет вместо \"Buffer oriented streams\" сделать \"async oriented streams\" ? которые смогут работать и для буферов и для сокетов. Тогда надобность в реакторе для конструктора сокета отпадает. И сокет становится таким же легким как и буфер.\r\n\r\n\r\n**dreverser, 29 марта 2018, 12:53**\r\nПро отцепили екзекуторс вот ссылка\r\n\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0958r0.html\r\n\r\n\r\n**yndx-antoshkka, 31 марта 2018, 19:48**\r\nПоискал embedded устройства с сетью, на которых нет асинхнонной работы с соединениями. Не нашёл. Нашёл лишь примеры embedded устройств на которых сетевое взаимодействие выполняется очень похоже на Networking TS.\r\n\r\nНикаких упоминаний реактора, проактора и прочих деталей реализации в io_context (и в Networking TS) не нашел. Проблем с внедрением на embedded не вижу.\r\n\r\nНабросал интерфейс с разделёнными sync и async классами, где второе наследуется от первого. Получилось переусложнённо и не красиво.\r\n\r\nНабросал интерфейс где async классы не обладает синхронными методами. Пострадал use case, кодга после асинхронной операции мы синхронно забираем данные из сокета, зная что данные в сокете уже есть (классический реактор). Итог: стало сильно хуже.\r\n\r\n \r\n\r\nВ связи со всем выше перечисленными вопрос: для чего вы хотите пункт 3) и как именно предлагаете его реализовывать?\r\n\r\n\r\n**dreverser, 1 апреля 2018, 12:44**\r\nВ контекте моих мыслей реактор = io_context и все что у него под капотом\r\n\r\nasio сам по себе является реактором в большинстве имплементаций и проактором только для iocp виндового.\r\n\r\nНа мой взгляд asio усложнена изза ее интрузивности сокета и таймера.\r\n\r\nОсновная мыль была не в том что бы дать отдельно блочный и асинхронный сокет. А в том что бы дать простую сущность типа socket в которой только пару полей - хендл и ошибка. и методы send/receive/sendAddress/receiveAddress/open/close/итд\r\n\r\nА уже потом этот socket заюзать во внутренностях asio. \r\n\r\nЗачем это и что это даст. Велосипеды все равно будут писаться. Примеров я видел достаточно. Один из тот же scraps из битторента. Так почему тем что хочет работать с \"простым\" сокетом не дать наконецто стандартный интерфейс ? Что бы они наконец то ушли от прямого сетевого апи ?\r\n\r\nВ asio я нашел socket_holder. Но он к сожалению ничего кроме закрыть хендл - не умеет. Я бы как минимум добавил в него все возможные методы send/receive/sendAddress/receiveAddress/open/close/итд унивицировал все socket_ops::* \r\n\r\nА сам socket_ops::* в большей части(особенно там где он использует хендл), перевел на обновленный socket_holder. Сам socket_ops::* тоже сильно переусложнен, но сложные части тянуть в socket_holder не стоит.\r\n\r\nСам socket_holder вытянул в стандарт. Пусть люди пользуются. Хватит уже этих апи.\r\n\r\n \r\n\r\nКасательно самой архитектуры asio, я в размышлениях, зачем такая интрузивность. \r\n\r\nВсе это можно было хранить и в реакторе, а после регистрации в реакторе отдавать ссылку на туже самую структуру. Сейчас очень странно видеть как async_result::get отдает void\r\n\r\n\r\n**dreverser, 1 апреля 2018, 19:36**\r\nЕсть еще некоторые пожелания насчет имплементации ендпоинт адресов v4 v6\r\n\r\nПо моим наблюдениям за свой многолетний опыт. Трансформация IP+PORT происходит только около сетевых айпи. В остальном коде это не требуется.\r\n\r\nТак зачем в address_v4/v6 пихать платформо зависимый тип ?\r\n\r\nПочему бы не вставить туда обычный набор типов IP+PORT\r\n\r\nи для трансформации в sockaddr_in/6 создать пару функций address2sock/sock2address ?\r\n\r\nЭто полностью избавит от функций network_to_host_short/host_to_network_short network_to_host_long/host_to_network_long в endpoint.\r\n\r\nИ я почти уверен что данные 2 функции больше чем в socket_holder имлементации для преобразования данных к апи вызовов использоваться не будут.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809200402/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809201945", + "html_url": "https://github.com/cpp-ru/ideas/issues/269#issuecomment-809201945", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/269", + "id": 809201945, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTIwMTk0NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:57:08Z", + "updated_at": "2021-03-29T08:57:08Z", + "author_association": "MEMBER", + "body": "**Artalus, 27 марта 2018, 12:04**\r\nПропускать \"неинтересные\" параметры - хочется, но мне более удобным кажется вариант с\r\n```cpp\r\ntypedef std::unordered_map >\r\n```\r\n\r\n**dreverser, 29 марта 2018, 12:21**\r\nА если абстрактный шаблон имеет два одинаковых типа ? тогда отличить к чему резолвить указанный тип невозможно\r\n\r\nЯ искал любой способ добраться до указания нужного мне аргумента.\r\n\r\nЕсли уже все значения аргументов определены в декларации. То почему бы просто их не пропускать.\r\n\r\nВозможно можно придумать некоторый квалификатор который бы коротким.\r\n\r\nИ указывал компилятору использовать значение по умолчанию если такое существует, лиюбо выдавал ошибку.\r\n\r\n\r\n**A, 4 апреля 2018, 8:21**\r\nВсегда можно упростить запись, например так\r\n```cpp\r\ntemplate < typename _Key, typename _Value, typename _Alloc >\r\nusing my_map = std::unordered_map< _Key, _Value, std::hash< _Key >, std::equal_to< _Key >, _Alloc >;\r\n\r\nmy_map > value;\r\n```\r\nИ использовать сокращеный вариант шаблона. А лишние запятые приведут только к ошибкам и отсутствию наглядности.\r\n\r\n\r\n**dreverser, 4 апреля 2018, 22:57**\r\nДа я в курсе про алиясинг, он может спасти только в одном случае, если этот шаблон алиясинга мы применяем очень много раз\r\n\r\nНа практике у меня такое редко встречается. Каждый контейнер уникальный\r\n\r\nЯ все же считаю что С++ должен эволюционировать в сторону уменьшения избыточности а не наоборот.\r\n\r\nКак альтернатива я уже предложил придумать какой то кейворд для стандарта, который бы означал использовать значение по умолчанию\r\n\r\n\r\n**al-mission-2016, 11 июня 2018, 2:16**\r\n \r\n\r\nГодная идея!\r\n\r\nКстати, dreverser, такой «кейворд» уже есть => «default»\r\n\r\n \r\n\r\n\r\n**al-mission-2016, 11 июня 2018, 2:22**\r\n \r\n\r\nСтоит обобщить идею «пропуска параметров, заданных по умолчанию».\r\nНужно заметить, что та же проблема стоит и для фактических аргументов функций (шаблонных и не шаблонных), если она имеет формальные параметры, заданные по умолчанию.\r\n\r\nПредложение таково. Использовать ключевое слово «default» для указания компилятору использовать в точке вызова функции параметр по умолчанию, e.g. foo(0, default, 1). Причём это расширение C++ должно использоваться и для фактических аргументов функций, и для фактических аргументов шаблонов.\r\n\r\nАргументы в пользу этой feature.\r\n0) востребовано (по сути - всегда, когда имеется более одного параметра по умолчанию)\r\n1) ключевое слово уже есть: default\r\n2) наглядность (вплоть до синтаксической подсветки в IDE);\r\nсинтаксис лучше чем с пропуском параметров через запятую(0, default, 1) vs (0,,1);\r\nпоследний синтаксис компактнее, но путанее\r\n3) не конфликтует с имеющимися языковыми конструкциями ибо «default» не может возникнуть в контексте передачи аргументов;\r\nв частности, нет конфликта с перегруженными параметрами\r\n4) относительно легко реализуется :) ~> в парсере фактических аргументов добавить:\r\nif ( atom == KW_DEFAULT ) { substitute_with_default_formal_param() ; }\r\n5) возможность эфективнее пользоваться уже имеющийся в языке возможностью задавать параметры по умолчанию.\r\n\r\nНа практике, при использовании более одного параметра по умолчанию, разработчику интерфейса нельзя однозначно выбрать порядок следования defaul-arguments. В результате, хотя значения по умолчанию имеются, использовать их вызывающей стороной не всегда возможно, т.е. приходится дублировать значения аргументов, что снижает ценность default-parameters-feature.\r\n\r\nExample with function.\r\n```cpp\r\n// declaration\r\nvoid foo(int a1 = 1, short a2 = 2, double a3 = 3.14);\r\n// invocation point\r\nfoo(default, default, 2.71);\r\n```\r\nExample with template:\r\n```cpp\r\nusing Bar = std::unordered_map>;\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809201945/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809202923", + "html_url": "https://github.com/cpp-ru/ideas/issues/270#issuecomment-809202923", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/270", + "id": 809202923, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTIwMjkyMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T08:58:23Z", + "updated_at": "2021-03-29T08:58:23Z", + "author_association": "MEMBER", + "body": "**Дмитрий, 28 марта 2018, 12:31**\r\nВ stl структура std::vector (std::string) точно определена. У остальных контейнеров реализация может меняться в широких пределах. Текущая stl абстрагирована от реализации. Она предполагает, что разработчика не будет заботить внутреннее устройство контейнеров.\r\n\r\n\r\n**dreverser, 29 марта 2018, 12:25**\r\nА причем здесь структура ? я предлагаю добавить метод capacity()\r\n\r\nА какая будет имплементация пусть думают в каждом конктретном стл те кто его реализуют - МС ГЦЦ Кланг итд\r\n\r\n \r\n\r\n\r\n**Дмитрий, 29 марта 2018, 14:16**\r\nНа мой взгляд это задача для \"stl 2.0\", - отойти от концепции асбтрактных требований к полному описанию структур контейнеров. То, что в рамках стандарта могут быть разные имплементации под одним именованием, - нехорошо. Это доказал size() для листа, который до c+11 на gcc вычислялся через полный обход контейнера. Его приходилось избегать. У Microsoft же была реализация с отдельным счетчиком. И вызов size() происходил без задержек.\r\nВычислить capacity() у std::vector - не проблема. Как capacity() будет считаться для unordered_map - не понятно и не очевидно.\r\n\r\n\r\n**dreverser, 29 марта 2018, 20:52**\r\nДмитрий, для вас не очевидно, для меня очевидно, но мне нужен доступ к ноде что бы получить ее размер, а она в привате.\r\n\r\nПоэтому не вижу проблем в самих контейнерах это имплементировать.\r\n\r\nСобственно почему велосипеды и пишутся. Потому что легче написать свое, чем потратиь время на убеждения других что бы добавить что то с стандартное.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809202923/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809204497", + "html_url": "https://github.com/cpp-ru/ideas/issues/270#issuecomment-809204497", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/270", + "id": 809204497, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTIwNDQ5Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T09:00:22Z", + "updated_at": "2021-03-29T09:00:22Z", + "author_association": "MEMBER", + "body": "Дубликат #69", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809204497/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809266099", + "html_url": "https://github.com/cpp-ru/ideas/issues/267#issuecomment-809266099", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/267", + "id": 809266099, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTI2NjA5OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T10:25:06Z", + "updated_at": "2021-03-29T11:55:32Z", + "author_association": "MEMBER", + "body": "Идея была заброшена автором, но есть наработки \r\n* https://github.com/ZaMaZaN4iK/ConfsANDProps/blob/master/Proposals/apply_permutation/apply_permutation.bs\r\n* https://www.boost.org/doc/libs/1_68_0/boost/algorithm/apply_permutation.hpp\r\n\r\nМожно брать и дорабатывать", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809266099/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809629497", + "html_url": "https://github.com/cpp-ru/ideas/issues/271#issuecomment-809629497", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/271", + "id": 809629497, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTYyOTQ5Nw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T18:56:20Z", + "updated_at": "2021-03-29T18:56:20Z", + "author_association": "MEMBER", + "body": "**_NN_ 16 мая 2019, 9:57**\r\nЧем существующие and, and_eq, not_eq, or_eq, xor, xor_eq не подходят ?\r\nhttps://www.tutorialspoint.com/Cplusplus-Keywords\r\n\r\n\r\n**Oleg Vorobiov 17 мая 2019, 6:07**\r\n_NN_, здравствуйте!\r\n\r\nТем, что среди вышеперечисленных нет оператора для ==.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809629497/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809646260", + "html_url": "https://github.com/cpp-ru/ideas/issues/272#issuecomment-809646260", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/272", + "id": 809646260, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTY0NjI2MA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T19:22:48Z", + "updated_at": "2021-03-30T06:40:25Z", + "author_association": "MEMBER", + "body": "**Дмитрий Бравиков 8 мая 2019, 14:24**\r\nstringstream не может заменить шаблоны строк, когда нужна интернационализация.\r\n\r\n\r\n**Alexander 8 мая 2019, 17:29**\r\nУже можно делать такие вещи при помощи , который завезли в C++20.\r\n\r\n\r\n**Дмитрий Бравиков 8 мая 2019, 18:47**\r\nAlexander, Вы об этом Text Formatting? Это дает типобезопасность, но не дает интерполяции.\r\n\r\n\r\n\r\n**Alexander 17 мая 2019, 7:31**\r\nДмитрий Бравиков, посмотрел ещё раз, что такое интерполяция. И не понял, зачем оно нужно в C++\r\n\r\n\r\n**Владимир Топунов 19 июля 2019, 19:14**\r\nПрикрутить рефлексию с перебором объявленных переменных. Полезно будет. Я за фичу, но только в library\r\n\r\n\r\n**Maxim Kapitonov 30 октября 2019, 13:48**\r\nВладимир Топунов, это не рефлексия.\r\n\r\nЯ так понимаю выражение на этапе компиляции должно развернуться в \r\n\r\nstd::cout << \"Hello. My name is\" << name << \". I'm\" << age << \".\" << std::endl;\r\n\r\n**yndx-antoshkka 20 июля 2020, 20:20**\r\nУ Зверовича были идеи реализовать подобное, но оно требует рефлексии, которую ещё не приняли\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809646260/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809647338", + "html_url": "https://github.com/cpp-ru/ideas/issues/273#issuecomment-809647338", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/273", + "id": 809647338, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTY0NzMzOA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T19:24:36Z", + "updated_at": "2021-03-29T19:24:36Z", + "author_association": "MEMBER", + "body": "Дубликат https://github.com/cpp-ru/ideas/issues/199", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809647338/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809648288", + "html_url": "https://github.com/cpp-ru/ideas/issues/274#issuecomment-809648288", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/274", + "id": 809648288, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTY0ODI4OA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T19:26:02Z", + "updated_at": "2021-03-29T19:26:02Z", + "author_association": "MEMBER", + "body": "**Игорь Шаповал 1 мая 2019, 13:57**\r\nЭто похоже на partial class в С#. Было б классно если добавили.\r\n\r\n\r\n**Alexey Kreschuk 4 мая 2019, 0:43**\r\nВ приведённом примере ломается изоляция: новый код может получить доступ к приватным членам класса. Если это починить, становится непонятно, зачем добавлять классу новые методы? Чем они лучше свободных функций?\r\n\r\n\r\n**Дмитрий 6 мая 2019, 21:51**\r\nХотелось бы увидеть сценарии, где подобное усложнение языка необходимо или оправдано. На мой взгляд в некоторых случаях \"расширение\" типов может усложнить разбор кода.\r\n\r\n\r\n**Айдар Фаттахов 14 мая 2019, 14:44**\r\nВ сишарпе нет свободных функций\r\n\r\nУ нас есть, поэтому чтобы сделать расширение foo.bar() нужно стандартизировать uniform call syntax bar(foo) а не вот этот вот костыль\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809648288/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809649370", + "html_url": "https://github.com/cpp-ru/ideas/issues/275#issuecomment-809649370", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/275", + "id": 809649370, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTY0OTM3MA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T19:27:47Z", + "updated_at": "2021-03-29T19:27:47Z", + "author_association": "MEMBER", + "body": "**Antervis 25 апреля 2019, 16:22**\r\nemplace_iterator кажется не самой практичной идеей. Он не сможет удобно покрыть случай, когда T конструируется из нескольких аргументов, а если T конструируется из одного, то и copy/move итераторы подойдут, не так ли?\r\n\r\n\r\n**Nate Reinar Windwood 25 апреля 2019, 23:00**\r\nAntervis, а если из одного аргумента другого типа? Он гарантированно вызовет конструктор (при наличии), а не вывалится на компиляции?\r\n\r\nНу и, как минимум, бывают explicit конструкторы.\r\n\r\nЕсли заполняешь контейнер каким-нибудь transform, совершенно не улыбается лишний раз оборачивать функцию в лямбду с явным вызовом конструктора. К тому же, это дублирование информации о типе. Контейнер и сам знает, что в нем хранится.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809649370/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809650517", + "html_url": "https://github.com/cpp-ru/ideas/issues/276#issuecomment-809650517", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/276", + "id": 809650517, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTY1MDUxNw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T19:29:36Z", + "updated_at": "2021-03-29T19:29:36Z", + "author_association": "MEMBER", + "body": "**languagelawyer 22 апреля 2019, 11:33**\r\nhttp://wg21.link/p0535\r\n\r\n\r\n**_NN_ 14 мая 2019, 7:30**\r\nlanguagelawyer, Эх, хотелось бы в следующей версии языка увидеть это :)\r\n\r\n\r\n**yndx-antoshkka 20 июля 2020, 20:38**\r\nВ C++23 практически приняли wg21.link/P1061\r\n\r\nС ним можно будет писать:\r\n```cpp\r\nvoid f(int a, char c) {}\r\n\r\nauto [...t] = make_tuple(1, 'a');\r\nf(t...);\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809650517/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809651427", + "html_url": "https://github.com/cpp-ru/ideas/issues/277#issuecomment-809651427", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/277", + "id": 809651427, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTY1MTQyNw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T19:30:57Z", + "updated_at": "2021-03-29T19:30:57Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 12 апреля 2019, 15:36**\r\nКажется можно уже сейчас нечто подобное получить с ranges (код не проверял):\r\n\r\n`auto arr = ranges::view::iota(0, 9) | ranges::to>;`\r\nНо написать функцию - намного читаемее, чем два предложеных подхода.\r\n\r\n\r\n**Denis 12 апреля 2019, 17:45**\r\nyndx-antoshkka, спасибо за наводку.\r\nДействительно, с помощью ranges похоже можно делать то, что хотел, правда не понятно, будет ли возможность делать это compile-time в C++20\r\n\r\n\r\n**yndx-antoshkka 31 июля 2019, 13:25**\r\nDenis, ranges помечены как constexpr, поэтому будет возможность делать это в компайл тайме.\r\n\r\n \r\n\r\nОднако ranges::to не успел попасть в C++20, так что прижётся ждать C++23\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809651427/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809652423", + "html_url": "https://github.com/cpp-ru/ideas/issues/278#issuecomment-809652423", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/278", + "id": 809652423, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTY1MjQyMw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T19:32:35Z", + "updated_at": "2021-03-30T06:28:57Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 10 апреля 2019, 22:26**\r\nСпрошу в рассылках, кажется что проблема не обсуждалась.\r\n\r\n\r\n**Andrey Davydov 10 апреля 2019, 23:01**\r\nА что мешает этому в текущей версии стандарта? Корутины это обычные функции.\r\n\r\n**yndx-antoshkka 10 апреля 2019, 23:10**\r\nAndrey Davydov, лично мне не очень понятно:\r\n* в какой момент контракт будет проверяться (например если корутина всегда засыпает при входе, когда проверится контракт - при первом пробуждении или при создании корутины)\r\n* действительно ли согласно стандарту они как обычные функции обрабатываются в этом месте.\r\n\r\nНадо почитать стандарт.\r\n\r\n\r\n**Andrey Davydov 11 апреля 2019, 0:10**\r\nyndx-antoshkka, в стандарте очень мало что специфицировано про контракты: http://eel.is/c++draft/dcl.attr.contract. Кажется, что для проверки предъусловия тело функции вообще не нужно, т.е. эти проверки можно вставлять в место вызова, где даже не известно, что вызываемая функция является корутиной.\r\n\r\n\r\n**Andrey Davydov 11 апреля 2019, 0:20**\r\nПоэтому для меня очевидно, что predondition должно проверяться в момент создания корутины, а не в момент первого пробуждения. Скажем корутина пораждаящая генератор не будет пробуждена, если никто не запросит значение из генератора, но это же не значит, что можно нарушать контракт передавая ей на вход любые значения.\r\n\r\nА вот с postcondition-м ситуация, действительно, интереснее, так как фраза \"A postcondition is checked by evaluating its predicate immediately before returning control to the caller of the function.\" (http://eel.is/c++draft/dcl.attr.contract#cond-5) с корутинами явно не очень сочетается.\r\n\r\n\r\n**yndx-antoshkka 31 июля 2019, 13:26**\r\nКонтракты отложены, в C++20 их не будет.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809652423/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809656075", + "html_url": "https://github.com/cpp-ru/ideas/issues/279#issuecomment-809656075", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/279", + "id": 809656075, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTY1NjA3NQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T19:36:48Z", + "updated_at": "2021-03-29T19:37:03Z", + "author_association": "MEMBER", + "body": "**languagelawyer 9 апреля 2019, 18:03**\r\nhttp://wg21.link/p0200\r\n\r\n\r\n**Vyacheslav Meshkov 10 апреля 2019, 11:39**\r\nСинтаксис ещё страшнее, чем я написал. Хотелось бы как раз простоты и прозрачности, а не ещё одного std::do_pretty_thing\r\n\r\n\r\n**Antervis 10 апреля 2019, 14:58**\r\nпроблема лямбды в том, что её тип может быть не выводим до попытки рекурсивного использования:\r\n```cpp\r\n[](Integral x) {\r\n return x > 1\r\n ? this_lambda(x) // Ошибка: тип лямбды еще не выведен\r\n : 1;\r\n}();\r\n```\r\nЗаодно надо покрыть случай когда у лямбды на каждое использование разные сигнатуры (разворачивание variadic pack, например). В общем, эта задача чуть сложнее, чем \"просто добавить this для лямбды\"\r\n\r\n\r\n**Vyacheslav Meshkov 11 апреля 2019, 9:57**\r\nAntervis, Всё понимаю. Но с одной стороны активно форсят функциональщину в плюсы, с другой бегают по граблям, которых в этой самой функциональщине нет.\r\n\r\nИМХО, если что-то в функциональных ЯП пишется красиво и кратко, а в плюсы протолкнули с тоннами оборачивающего кода, я считаю в данном случае цель не достигнута. Ведь ФЯП в частности ценят за их лаконичность в передаче весьма сложных идиом.\r\n\r\nЕсли так всё плохо с возвращаемым типом, можно разрешить рекурсивный вызов при указании этого типа [](...)->result_t{...}. Для обычных же функций такой проблемы нет. ИМХО именно автовыведение типа надо понизить в приоритетах, и делать только тогда, когда это возможно. А если оно мешает, то запрещать автовыведение типа в пользу более приоритетного функционала.\r\n\r\n\r\n\r\n**Antervis 14 апреля 2019, 22:05**\r\nVyacheslav Meshkov,\r\n> Для обычных же функций такой проблемы нет.\r\n\r\nу обычных функций тип полностью известен.\r\n\r\n> ИМХО именно автовыведение типа надо понизить в приоритетах, и делать только тогда, когда это возможно\r\n\r\nвыводить тип необходимо в любом случае, с++ всё-таки язык со статической типизацией\r\n\r\n\r\n\r\n**al-mission-2016 16 апреля 2019, 23:07**\r\n\r\nСинтаксически, изящно было бы так:\r\n `[](..)`\r\n или\r\n `operator()(..)` // т.к. лямбда - это объект сгенерерованного класса у которого определён operator()\r\nНапример\r\n```cpp\r\n cout <<\r\n []( int n ) -> int {\r\n return ( n < 2 )\r\n ? 1\r\n : []( n - 1 ) * n // <- NB [](...). Пока невозможно :(\r\n ;\r\n } (5)\r\n << endl;\r\n```\r\nВопрос обсуждался здесь (эта ссылка уже была выше)\r\nproposal 2016-p0200\r\nи здесь\r\nstackoverflow.com - \"can lambda-functions be recursive\"\r\n\r\nJason Turner в недавнем C++ Weekly - Ep 162 - Recursive Lambdas\r\nтоже про рекурсивные лямбды через введение именованной лямбды (и возможно внешней обёртки) в таком ключе:\r\n```cpp\r\nconstexpr auto fib = []( const int n ) {\r\n constexpr auto f_ = []( const auto f_, const int n ) -> int {\r\n return\r\n (n > 1)\r\n ? f_(f_, n - 1) + f_(f_, n - 2)\r\n : 1;\r\n };\r\n return f_(f_, n);\r\n};\r\n\r\nauto main() -> int\r\n{\r\n std::cout << \"Hello, C++\" << (__cplusplus / 100) << '\\n'; // Expected C++17+\r\n\r\n const int n = 4;\r\n const auto f = fib(n);\r\n\r\n std::cout << \"fib(\" << n << \") = \" << f << '\\n';\r\n\r\n return f;\r\n}\r\n```\r\nК сожалению C++ и вправду пока не имеет средств, позволяющих использовать\r\nбезымянные рекурсивные лямбды. Например в качестве функторов.\r\n\r\n\r\n**al-mission-2016 17 апреля 2019, 1:11**\r\nУточнение.\r\nБезымянные рекурсивные лямбды всё же возможны - технология\r\n\"лямбда в лямбде\" :) Правда вряд ли она простая и прозрачная :).\r\nИдея в том, чтобы внутри внешней безымянной лямбды (напр. функтора) создать\r\nвнутреннюю \"именованную\" лямбду, коротая уже может ссылаться на себя при рекурсии.\r\nПри этом имя внутренней лямбды наружу естественно не вытекает.\r\n```cpp\r\n// g++-8 -std=c++17 ./lambda_in_lambda.cpp\r\nstatic_assert(__cplusplus > 201700, \"C++17 required!\");\r\n\r\n#include \r\n#include \r\n\r\nauto main() -> int {\r\n using std::cout, std::endl, std::accumulate, std::begin, std::end;\r\n\r\n // Calculate sum of factorials of numbers in arr.\r\n constexpr int arr[] { 1, 2, 3, 4 }; // 1! + 2! + 3! + 4! == 33\r\n const auto sum =\r\n accumulate( begin(arr), end(arr), 0,\r\n [](auto init, auto n) {\r\n auto fac_ = [] ( auto fac_, auto x ) -> int {\r\n return (x > 1) ? x * fac_(fac_, x - 1) : 1;\r\n };\r\n return init + fac_(fac_, n);\r\n } );\r\n\r\n cout << sum << endl;\r\n\r\n return sum;\r\n}\r\n```\r\n\r\n**Vyacheslav Meshkov 22 апреля 2019, 12:28**\r\nЕсли уж говорить о чистой красоте и изящности, то взять по аналогии с функциями чтобы работало:\r\n```cpp\r\nauto fact = [](std::size_t const val)->int {\r\n return val ? val*fact(val-1) : 1;\r\n}{3};\r\n```\r\n\r\n\r\n**languagelawyer 1 мая 2019, 1:09**\r\nВ C++17 с можно покрасивее оформить http://wg21.link/p0200:\r\n```cpp\r\n#include \r\n#include \r\n\r\ntemplate\r\nstruct letrec : F {\r\n\tletrec(const F& f) : F(f) {}\r\n\tletrec(F&& f) : F(std::move(f)) {}\r\n\r\n\ttemplate\r\n\tdecltype(auto) operator()(Args&&... args) {\r\n\t\treturn F::operator()(std::ref(*this), std::forward(args)...);\r\n\t}\r\n};\r\n\r\nletrec fact = [](auto self, int i) -> int {\r\n\treturn i <= 0 ? 1 : i * self(i - 1);\r\n};\r\n```\r\n\r\n**Vyacheslav Meshkov 2 мая 2019, 16:08**\r\nlanguagelawyer, Финал выглядит вполне себе прилично. Но поправьте меня, если я понимаю неправильно: эта красота достаётся ценой +1 параметра в стек на каждый вызов рекурсивной функции.\r\n\r\n\r\n\r\n**languagelawyer 2 мая 2019, 20:25**\r\nЗависит от ABI. Кроме 32-битных интелов немного где все аргументы передаются через стек. 2-4 первых аргумента в регистрах передаются.\r\n\r\nНо да, способ не без оверхеда.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809656075/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809658435", + "html_url": "https://github.com/cpp-ru/ideas/issues/280#issuecomment-809658435", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/280", + "id": 809658435, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTY1ODQzNQ==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-29T19:39:03Z", + "updated_at": "2021-03-29T19:39:03Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov 4 апреля 2019, 16:09**\r\nНа этом сайте предлагалось как минимум трижды:\r\n\r\n1. https://stdcpp.ru/proposals/ca25e663-71b4-45da-a8ab-9ed7deb17c6d\r\n\r\n2. https://stdcpp.ru/proposals/b02ce2fb-5e59-4f15-b21c-a2cb8e25aaa0\r\n\r\n3. https://stdcpp.ru/proposals/b41bac7b-f618-4ae0-b0fa-c3744ba26b9b\r\n\r\nАктуальный proposal: http://wg21.link/p0847\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809658435/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809948758", + "html_url": "https://github.com/cpp-ru/ideas/issues/280#issuecomment-809948758", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/280", + "id": 809948758, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTk0ODc1OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T06:27:24Z", + "updated_at": "2021-03-30T06:27:24Z", + "author_association": "MEMBER", + "body": "Закрыто как дубликат #148 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809948758/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809952157", + "html_url": "https://github.com/cpp-ru/ideas/issues/274#issuecomment-809952157", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/274", + "id": 809952157, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTk1MjE1Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T06:33:24Z", + "updated_at": "2021-03-30T06:33:24Z", + "author_association": "MEMBER", + "body": "Аналогичная идея с другим синтаксисом #30 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809952157/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809954388", + "html_url": "https://github.com/cpp-ru/ideas/issues/273#issuecomment-809954388", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/273", + "id": 809954388, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTk1NDM4OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T06:37:51Z", + "updated_at": "2021-03-30T06:37:51Z", + "author_association": "MEMBER", + "body": "Другая похожая идея #248 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809954388/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809955889", + "html_url": "https://github.com/cpp-ru/ideas/issues/272#issuecomment-809955889", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/272", + "id": 809955889, + "node_id": "MDEyOklzc3VlQ29tbWVudDgwOTk1NTg4OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T06:40:48Z", + "updated_at": "2021-03-30T06:40:48Z", + "author_association": "MEMBER", + "body": "Аналогичное предложение #87", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/809955889/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810015934", + "html_url": "https://github.com/cpp-ru/ideas/issues/283#issuecomment-810015934", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/283", + "id": 810015934, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAxNTkzNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:14:35Z", + "updated_at": "2021-03-30T08:14:35Z", + "author_association": "MEMBER", + "body": "**WPMGPRoSToTeMa, 2 апреля 2018, 4:52**\r\nЯ думаю в этом нет смысла, т.к. сейчас ведётся активная работа над модулями.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810015934/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810016771", + "html_url": "https://github.com/cpp-ru/ideas/issues/284#issuecomment-810016771", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/284", + "id": 810016771, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAxNjc3MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:15:41Z", + "updated_at": "2021-03-30T08:15:41Z", + "author_association": "MEMBER", + "body": "**zamazan4ik@tut.by, 29 марта 2018, 16:06**\r\nБыли такие мысли по этому поводу. Основные аргументы были такие: математические формулы обычно выражаются через тангенс -> котангенс не так часто встречается. Но с сакмим предложением я полностью согласен.\r\n\r\n \r\n\r\nНадо поискать, может уже пропозал такой есть. Если нет, то можем написать.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810016771/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810018078", + "html_url": "https://github.com/cpp-ru/ideas/issues/285#issuecomment-810018078", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/285", + "id": 810018078, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAxODA3OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:17:18Z", + "updated_at": "2021-03-30T08:17:18Z", + "author_association": "MEMBER", + "body": "**Антон Бикинеев, 27 марта 2018, 12:57**\r\nИдея хороша. Возможно, стоит сделать не в виде макросов и также привязать к готовящимся идеям по wide_int и unbound_int, чтобы получить мультиточные константы, как в boost.multiprecision.\r\n\r\n\r\n**nenomius, 29 марта 2018, 9:04**\r\nОбновлено 27 марта 2018, 12:58\r\n\r\n\r\nhttp://wg21.link/p0631\r\n\r\n\r\n**zamazan4ik@tut.by, 29 марта 2018, 16:05**\r\nУже такое предложение есть, так что не актуально.\r\n\r\n\r\n**yndx-antoshkka, 21 октября 2019, 18:36**\r\nВ C++20 приняли заголовочный файл numbers с необходимыми константами http://eel.is/c++draft/numbers#syn", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810018078/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810019017", + "html_url": "https://github.com/cpp-ru/ideas/issues/286#issuecomment-810019017", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/286", + "id": 810019017, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAxOTAxNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:18:35Z", + "updated_at": "2021-03-30T08:18:35Z", + "author_association": "MEMBER", + "body": "**Antervis, 30 марта 2018, 10:35**\r\nнекоторые приложения могут использовать нынешнее поведение в отладочных целях. Например, использующие google breakpad.\r\n\r\n\r\n**Олег Ляттэ, 15 апреля 2018, 14:57**\r\nВы уверены, что просто грохнуть один поток в многопоточном приложении - безопасно? Это UB всего приложения в целом.\r\n\r\nА вдруг этот поток взаимодействовал с другим потоком (как это часто и бывает), и внезапная смерть первого может привести к непредсказуемым последствиям во втором из-за нарушений структур данных, к примеру. В том числе это может открыть дыры в безопасности.\r\n\r\nНельзя так делать.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810019017/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810022216", + "html_url": "https://github.com/cpp-ru/ideas/issues/286#issuecomment-810022216", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/286", + "id": 810022216, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAyMjIxNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:23:07Z", + "updated_at": "2021-03-30T08:23:07Z", + "author_association": "MEMBER", + "body": "В предложенном виде не примут - для критичного к жизни ПО лучше полностью перезапуститься, чем жить с потоком, который, например, захватил мьютекс и умер.\r\n\r\nБолее менее близкий аналог добавили в C++20 [std::jthread](http://eel.is/c++draft/thread.jthread.class)\r\nОн позволяет прерывать выполнение потока и защищает от std::terminate из-за забытого вызова `join()`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810022216/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810024419", + "html_url": "https://github.com/cpp-ru/ideas/issues/287#issuecomment-810024419", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/287", + "id": 810024419, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAyNDQxOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:26:23Z", + "updated_at": "2021-03-30T08:26:23Z", + "author_association": "MEMBER", + "body": "**Олег Ляттэ, 15 апреля 2018, 14:46**\r\nНо ведь можно уже сейчас в начале объявления класса D написать using base = B2. Поскольку это рядом с описанием базового класса (или классов), то есть довольно высокий шанс исправить этот using, если вдруг поменяется базовый тип.\r\n\r\nНа мой взгляд было бы больше смысла стандартизировать что-то вроде майкрософтовского __super.\r\n\r\n__super::show() тут вызовет show() у базового класса даже в случае, если базовых классов несколько. Если неоднозначность - ошибка.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810024419/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810028422", + "html_url": "https://github.com/cpp-ru/ideas/issues/288#issuecomment-810028422", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/288", + "id": 810028422, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAyODQyMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:32:08Z", + "updated_at": "2021-03-30T08:32:08Z", + "author_association": "MEMBER", + "body": "Начиная с C++20 появился нужный синтаксис\r\n```cpp\r\nstruct options {\r\n bool opt0 = false, opt1 = true, opt2 = false;\r\n};\r\noptions value{.opt0 = true}; //defaults + opt0 == true\r\n```\r\nhttps://godbolt.org/z/8KWWbGvMz\r\n\r\nНе позволяет вызывать функции в блоке инициализации, но это и не особо нужно - их можно вызвать отдельно.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810028422/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810030614", + "html_url": "https://github.com/cpp-ru/ideas/issues/289#issuecomment-810030614", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/289", + "id": 810030614, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAzMDYxNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:35:17Z", + "updated_at": "2021-03-30T08:35:17Z", + "author_association": "MEMBER", + "body": "**Виктор Губин, 29 марта 2018, 22:01**\r\nПосмотрите суда:\r\n\r\nUnbounded integers: #264\r\n\r\nint128_t, int256_t, и т.д. #84\r\n\r\n\r\n**Antervis, 30 марта 2018, 10:12**\r\nя конечно плоховато знаю ассемблер, но как реализовать целочисленное 128-битное деление \"одной командой процессора\"?\r\n\r\n\r\n**Виктор Губин, 30 марта 2018, 11:56**\r\nAntervis, Intel/AMD начиная с SSE2 SIMD . В современных процессорах Intel через AVX).\r\n\r\nКомпиляторы давно поддерживают процессоры, но как-то по разному\r\n\r\nGCC https://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html\r\n\r\nMS МС++ - https://msdn.microsoft.com/en-us/library/26232t5c.aspx\r\n\r\nIntel C++ https://software.intel.com/en-us/articles/introduction-to-intel-advanced-vector-extensions\r\n\r\n\r\n**Antervis, 30 марта 2018, 15:32**\r\nВиктор Губин, во-первых, команд целочисленного деления в SSE/AVX попросту нет. Во-вторых, SIMD деление реализуется через каст в float/double, деление и каст обратно. Вещественное 128-битное деление процессоры тоже не умеют. Мой вопрос был риторическим.\r\n\r\n\r\n**Виктор Губин, 30 марта 2018, 19:51**\r\nAntervis,\r\n\r\nПоигрался тут малость с GCC, что-бы посмотреть что собсвенно происходит на ассемблерном уровне.\r\n\r\nТ.е. соводит-ли компилятор деление к умножению, при зарание известном делителе, как в случае с int[8..64]_t\r\n\r\nВот так выглядит код:\r\n```cpp\r\n#include \r\n#include \r\n\r\nconstexpr const unsigned __int128 radix = 10;\r\n\r\nint main()\r\n{\r\n\r\n char str[43];\r\n __builtin_memset(str, 0, 43 );\r\n\r\n unsigned __int128 octoword = __UINT64_MAX__;\r\n octoword <<= 8;\r\n\r\n uint8_t divend;\r\n char *c = &str[42];\r\n do {\r\n divend = uint8_t(octoword % radix);\r\n octoword /= 10ULL;\r\n * (c--) = '0' + divend;\r\n } while(0 != octoword );\r\n\r\n __builtin_memmove( str, (c+1), std::size_t(&str[42] - c) );\r\n\r\n std::printf( str );\r\n return 0;\r\n}\r\n```\r\nЕсли скомпилировать с ключами -mtune=native -Ofast -mavx -S получим ассемблерный вывод.\r\n\r\nПохоже что GCC переклыдывает деление 128-ми битных целых вообще на библиотеку, в случае с Intel (Windows GCC 7.2), имеем:\r\n\r\n...\r\n\r\ncall __umodti3\r\n\r\n...\r\n\r\ncall __udivti3\r\n\r\nИ того получим в итоге не самый быстрый код, деление идет не только не одной инструкцией, но еще и перекидывает процессор в другие области памяти - возможно за кеш.\r\n\r\nВ общем пока стандарта длинной арифметики нет, имеет смысл критические алгоритмы писать на ассемблере и \"подлинковывать\".\r\n\r\n\r\n**sergeyyankovich2@tut.by, 30 марта 2018, 16:43**\r\nя конечно плоховато знаю ассемблер, но как реализовать целочисленное 128-битное деление \"одной командой процессора\"?\r\n\r\n \r\n\r\nЕсли деление 128-битного числа на 128-битное, то в случае делителся не больше чем\r\n\r\n2^64-1 - процессор делает одной командой. Уже в этом выигрыш есть по производительности. Если делитель больше, тогда компилятор реализует деление как вызов некой встроенной функции на асемблере.\r\n\r\nВ принципе, подобное было, когда существовали 32-битные компьютеры, а в c++ уже были типы __int64.\r\n\r\nА __int128 уже даже зарезервировали как особенное определение в Visual Studio, оно даже другим цветом подствечивается. Но в стандарт языка C++ пока не входит. \r\n\r\nХотя уже многие предлагали, я далеко не первый.\r\n\r\n \r\n\r\n \r\n\r\n\r\n**sergeyyankovich2@tut.by, 31 марта 2018, 13:11**\r\nИ того получим в итоге не самый быстрый код, деление идет не только не одной инструкцией, но еще и перекидывает процессор в другие области памяти - возможно за кеш.\r\n\r\nТак это GCC. Кто сказал, что в GCC - лучший компилятор? Или может у вас x86 режим\r\n\r\nв GCC ? Дизасм показывает, что используются регистры rax-rbx и т.д., или eax-ebx и т.д.?\r\n\r\n \r\n\r\nВот если в студии 2015 дизассемблировать такой код -\r\n```cpp\r\n#include \r\n#pragma intrinsic(_umul128) \r\n// .....\r\n\r\nunsigned __int64 aaa = 1111222333444555666;\r\n\r\nunsigned __int64 bbb = 1111222333444555;\r\n\r\nunsigned __int64 c, d;\r\nd = _umul128(aaa, bbb, &c);\r\n ```\r\n\r\nто последняя функция преобразуется вот во что --\r\n```\r\n //00007FF7D9005F77 mov rax, qword ptr[aaa]\r\n //00007FF7D9005F7B mov qword ptr[rbp + 178h], rax\r\n //00007FF7D9005F82 mov rcx, qword ptr[bbb]\r\n //00007FF7D9005F86 mov rax, rcx\r\n //00007FF7D9005F89 mov rcx, qword ptr[rbp + 178h]\r\n //00007FF7D9005F90 mul rax, rcx\r\n //00007FF7D9005F93 mov qword ptr[c], rdx\r\n //00007FF7D9005F97 mov qword ptr[d], rax\r\n```\r\n \r\n\r\nЕсть один вызов mul, умножаются 64-битное на 64-битное, с получение\r\n\r\n128-битного результата. Не знаю почему, но для деления 128-битного целого (находится в регистрах RDX:RAX) на 64-битный делитель,\r\n\r\nподобной intrinsic-функции нет.\r\n\r\n \r\n\r\nГлавное же, что при введении в стандарт C++, __int128, лучшее и наибыстрейшее использование будет реализовано уже на уровне компилятора, ну и как я писал,\r\n\r\nбудут свои преимущества -\r\n\r\n \r\n\r\nЛюбая длинная арифметка, всякие задачи факторизации и другие, будут работать на порядок быстрее, если\r\nиспользовать один mul-div , вместо \"простыни иструкций процессора\", либо разбиении длинных целых на меньшие \"порции\" по int32. Причём разница (соотношение производительностей), с увеличением длины используемых чисел -\r\nрастёт с экспоненциальной зависимостью. \r\n\r\n \r\n\r\nИ возможности 64-битного процессора будут использоваться наиболее полно.\r\n\r\n \r\n\r\n\r\n**vlad-ger-m, 28 апреля 2018, 15:16**\r\nОбновлено 31 марта 2018, 13:13\r\n\r\n\r\nПреимущество в том что для команды div (128 бит на 64 бит) нет intrinsic-функции; во-вторых, при делении 128 бит на 128 бит, код может быть оптимизированным на уровне компилятора. \r\n\r\n\r\n**Антон Петров, 18 мая 2020, 11:29**\r\nИдея не плоха... я вообще считаю что в C/С++ оч много недоработок... Прсото он много тет не развивался и был в изначально кривом состоянии. Я могу перечислить все недоработки если хотите. Насчёт int128 согласен и ещё uint128 и наверное тогда уж и типы с размерами 256 и 512 бит. Аппаратная поддержка их есть в AVX технологиях. Они умеют выполнять все основные операции с этими числами. Если у вас есть компилятор gcc последних версий, т овы можете их подключить. Но в синтаксисе есть поддержка только чисел __inn128, с использованием этого типа. И коли этот разговор начат то было бы грешно забыть про типы с плавающей точкой. Они вообще незаслуженно забыты. А зря... Аргументы странные типа когда я пишу duble a = 5.0; а потом смотрю в отладчике, то вижу не 5.0 а 4.999999999999999999999999999999... И дальше гворят, что они не точны... Но не думают, что точные чисал это действительные. А в компе рациональные числа. да там вооще набор чсиел на числовой оси представляющий отдельные точки идущие с возрастающим интервалом от нуля. числа 5.0 среди их вообще нет. нельзя записать в комп такое число... только в константе которая при присвоении получит значение ближайшего представимого. Компьютерные действительные числа от целых по сути не отличаются. Прсто такой формат. и они оч подходят где не надо оч точно считать. Т.е. практически везде.. Венёмся к нашим баранам. Есть библиотека gmp там вообще могут быть тюбые числа пока памяти хватит. Нор поддежка __int128 не полна. нет для них литерала чтобы записаь константу. Это оч неудобно... Конечно можно извратиться и путём сдвигов представить ег ока 2 long константы которые склеиваются. А вот для __float128 они поддериваются Этот литерал Q. В фортране вообше всё поддерживается что поддерживает процессор. И там не изобретают имена как в C/C++ а пишут прсото integer(16) и вуаля, у вас тип __int128 Можно и intger(32) написать и у вас __int256. там указывается длтна в бвйта. Есть функция которая проверит поддерживается ли такая длина или нет... там есть такое что ни к каком другом языке кроме pyton нет. C/C++ оч ущербный в этом плане. В строку вы это число(__int128) не переведёте надо писать свою прогу. В bin формат вообще никакое число не переводится... В фортане всё делается с помощью 2 комманд read и write. Правда они намного сложнее sprintf и sscanf. заметьте, В фортране вообще одни и теде операторы независимо от того куда пишешь и откуда ичтаешь. В С/С++ это разные функции. Заметьте в фортране они все работают безукоризненно. В C/C++ часто вылетают ошибки.. ну чт овы хотите, фотрану 60 с лишним лет, там всё отлажено до совершенного идеала... Я не призываю переходить на фортран или R а брать с них пример. Функции перевода в строку вам придётся писать самому и с литералами надо что-то деалть если хотите работать с 128 битными типами. там много ручной работы. А это нехорошо само по себе. Один написал так. другой этак, непртестиролвали как следует в результате ничё не работает или со сбоями непонятно где, что ещё хуже... Базовый фунционал дб стандартизован и работать безукоризненно а главное он должен быть! Понятно что США со своими вычурными походами порой бебаппеляционными не до нас и они не будут под нас подстраиваться. Наши вообще не входят в комитет по стандартизации ISO нас никто не спрашиваеть и не будет. Но нам надо. и поэтом предлагается разработать свой стандарт и свой язык С/С++. За основу взять ихний и подправит что надо и где надо. и ксли уж пощёл разговор то первое надо следать тип встренным сторки не нультерминированные потому что это тормоза иногда оч большие. за основу взять паскалевские строки но с большей длинной. Это можно сделать у нас будут быстрые строки... И я бы добавил такуие штуки как property и delegate как в c#. Пусть они к нам подстраиваются а не мы делаем по ихним стандартам есл ихотят с нами работать... И вообше писать по русски и ascii коды переделать чтобы там были русские буквы выкинув первые 28 символов которые остались для управленяи матричных принтеров ещё с тех времён... Эта таблица давно морально устарела... всё поместится в 1 байт. а как быть с китайцами у них иероглифы... Ну почему мы должны к ним подстраимваться? Поменять utf-8 чтобы там были руские вместо английских а английские на месте русских а первая часть(32 символа вообще ничего не меняет...) вобщем настало время менят ьстандарты и менят ьязыки так чтобы было удобно нам а не им...Если мы будем писать по русски от этого будет только лучше. Хотя я представляю объём работы, который надо прделать чтобы это всё заработало... Но надо постараться для себя же делаем и для своих потомков. Это национальный инетерс если угодно...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810030614/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810031515", + "html_url": "https://github.com/cpp-ru/ideas/issues/290#issuecomment-810031515", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/290", + "id": 810031515, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAzMTUxNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:36:37Z", + "updated_at": "2021-03-30T08:36:37Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 31 марта 2018, 21:01**\r\nА как можно сделать такую проверку?\r\n\r\n\r\n**edc0a91c24342ae88891, 7 апреля 2018, 7:21**\r\nAndrey Davydov, элементарно.\r\n\r\n\r\n**Andrey Davydov, 7 апреля 2018, 12:41**\r\nedc0a91c24342ae88891, спасибо за развернутый ответ.\r\n\r\nСудя по другим Вашим ответам, Вы предлагаете, чтобы is_str() содержал UB, скажем, для такого случая:\r\n\r\nconst char c = 'x'; string_view(&c, 1).is_str();\r\n\r\n\r\n**yndx-antoshkka, 3 апреля 2018, 16:08**\r\nВы предлагаете сделать, чтобы string_view запоминал строчку с терминирующим 0 а при запросе size() приверял последний символ и вычитал при необходимости 1 из хранимого внутри size_? Или что-то другое?\r\n\r\n\r\n**edc0a91c24342ae88891, 7 апреля 2018, 7:29**\r\nyndx-antoshkka,нет, string_view может \"запоминать\" какую угодно строку, но при c_str() проверял, что символ за последним - ноль. Такое может не прокатить для стандартизации, т.к. это может быть \"выход за границы\"(хотя это и обходится на уровне реализации, но всё же - может где-то не обходится).\r\n\r\n \r\n\r\n \r\n\r\nБолее общее решение - это добавить флаг, который может быть констекпр(если нам когда-то завезут нормальный констекспр). Либо, можно добавить c_str_view(), который будет прозрачно приводиться к string_view.\r\n\r\n\r\n**Дмитрий, 3 апреля 2018, 19:59**\r\nЯ так понял при доступе через c_str() предлагается проверять, инициализирован ли std::string_view?\r\n\r\n\r\n**edc0a91c24342ae88891, 7 апреля 2018, 7:32**\r\nДмитрий, нет, string_view может в себе хранить си-строку, но мы не может знать, что она там есть. Таким образом, string_view не может быть заменой char *( как он везде рекламировался), а только заменой char *, size_t.\r\n\r\n \r\n\r\nА c_str() должна проверять - находится ли в string_view си-строка, либо нет. \r\n\r\n\r\n**Дмитрий, 8 апреля 2018, 12:44**\r\nedc0a91c24342ae88891, string_view хранит указатель на начало строки и её размер. Что значит \"мы не можем знать, что она там есть\"? На сколько я знаю, string_view всегда инициализирован строкой?\r\n\r\n\r\n**edc0a91c24342ae88891, 19 апреля 2018, 8:04**\r\nДмитрий, элементрно. Тут я хотел рассказать про контекст, но ладно. Если попроще. Вопрос задан в контексте си-строки, c_str() возвращает си-строку. Указатель+длинна может указывать на какой угодно кусок строки, либо строку, которая никак не обязана заканчиваться нулём.\r\n\r\n \r\n\r\n \r\n\r\nТаким образом мы никогда не знаем - что находится в string_view. Допустим, мы делаем constexpr std::string_view{\"hello\"}, и казалось бы - мы точно знаем, что это си-строка и можем использовать ::data() как си-строку, но это бекдор.\r\n\r\n \r\n\r\nЗачем это нужно я говорил выше. string_view претендует на замену char *, но он не умеет работать с си-строками. Да, он может быть инициилизирован из си-строки, но получить си-строку обратно - нельзя. В этом проблема.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810031515/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810033827", + "html_url": "https://github.com/cpp-ru/ideas/issues/291#issuecomment-810033827", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/291", + "id": 810033827, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAzMzgyNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:39:59Z", + "updated_at": "2021-03-30T08:39:59Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 3 апреля 2018, 18:56**\r\nВ С++17 добавили функцию as_const с помощью которой Ваш пример с alias станет покороче. К тому же получается консистентно с выбором перегрузки с нужным ref-qualifier:\r\n```cpp\r\nstd::move(value).method() // для выбора method() &&\r\nstd::as_const(value).method() // для выбора method() const &\r\n```\r\nЯвное указание template нужно только в dependent коде для правильного парсинга, но не для выбора нужной перегрузки функции.\r\n\r\n\r\n**A, 3 апреля 2018, 21:19**\r\nAndrey Davydov, такой подход как ::std::as_const я использую давно и нахожу его неудобным и плохо читаемым.\r\n\r\nВот такой пример, предположим неконстантные методы создают экземпляр объекта на который возвращается указатель, если он еще не создан.\r\n```cpp\r\nusing namespace std;\r\n\r\nstruct A\r\n{\r\n void method ();\r\n void method () const;\r\n};\r\n\r\nstruct B\r\n{\r\n A * getA ();\r\n A * getA () const;\r\n};\r\n\r\nstruct C\r\n{\r\n B * getB ();\r\n B * getB () const;\r\n};\r\n\r\n\r\nvoid foo ()\r\n{\r\n C c;\r\n\r\n // с использованием as_const\r\n as_const( *as_const( *as_const( c ).getB() ).getA() ).method();\r\n \r\n // с указанием квалификатора\r\n c.const getB()->const getA()->const method();\r\n}\r\n```\r\nИспользование as_const добавляет код слева и трудно сказать к чему он относится, когда указание const в месте вызова метода интуитивно понятно.\r\n\r\nНасчет template - это был пример схожей семантики, но не способа применения.\r\n\r\n\r\n**A, 3 апреля 2018, 21:33**\r\nОбновлено 3 апреля 2018, 21:19\r\n\r\n\r\nAndrey Davydov, не понял контекст применения\r\n```cpp\r\nstd::move(value).method() // для выбора method() &&\r\n```\r\n\r\n**Andrey Davydov, 3 апреля 2018, 21:42**\r\nstepsoft, а почему в Вашем примере константные методы возвращат неконстантные указатели?\r\n\r\n\r\n**Andrey Davydov, 3 апреля 2018, 21:48**\r\nstepsoft,\r\n\r\n> не понял контекст применения\r\n\r\n```cpp\r\nstruct X { ... };\r\n\r\nstruct Y {\r\n X & x() &; // #1\r\n X const & x() const &; // #2\r\n X && x() &&; // #3\r\n};\r\n\r\nvoid test(Y y) {\r\n y .x(); // #1\r\n std::as_const(y).x(); // #2\r\n std::move(y) .x(); // #3\r\n}\r\n```\r\n\r\n\r\n**A, 3 апреля 2018, 21:58**\r\nAndrey Davydov, такое бывает и не редко, например\r\n\r\n- предполагается создание члена класса при первом обращении к неконстантному методу.\r\n- реализуется COW и неконстантный метод может перераспределить член класса.\r\n- может возвращаться указатель для формирования ассоциативной связи с членом класса.\r\n\r\nНе всегда константный метод должен возвращать константный тип. И можно в примере указатель заменить на сам тип.\r\n```cpp\r\nusing namespace std;\r\n\r\nstruct A\r\n{\r\n void method ();\r\n void method () const;\r\n};\r\n\r\nstruct B\r\n{\r\n A getA ();\r\n A getA () const;\r\n};\r\n\r\nstruct C\r\n{\r\n B getB ();\r\n B getB () const;\r\n};\r\n\r\n\r\nvoid foo ()\r\n{\r\n C c;\r\n\r\n // с использованием as_const\r\n as_const( as_const( as_const( c ).getB() ).getA() ).method();\r\n \r\n // с указанием квалификатора\r\n c.const getB().const getA().const method();\r\n}\r\n```\r\n\r\n**A, 3 апреля 2018, 22:07**\r\nAndrey Davydov, Использование разных видов ссылок и применение квалификаторов (mutable, const, volatile) - это взаимодополняющие вещи. Применение одного не исключает применение другого.\r\n\r\n\r\n**languagelawyer, 23 мая 2018, 6:42**\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/1992/WG21%201992/X3J16_92-0136%20WG21_N0212.pdf", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810033827/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810036619", + "html_url": "https://github.com/cpp-ru/ideas/issues/291#issuecomment-810036619", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/291", + "id": 810036619, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAzNjYxOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:44:07Z", + "updated_at": "2021-03-30T08:44:07Z", + "author_association": "MEMBER", + "body": "`std::as_const` в С++17 вырос как раз из обсуждения похожей идеи. Чтобы воскресить обсуждение решения данной проблемы на уровне языка надо найти кейс, который не покрывается `std::as_const` и `std::move` и не имеет решения через библиотекчные методы.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810036619/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810037532", + "html_url": "https://github.com/cpp-ru/ideas/issues/292#issuecomment-810037532", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/292", + "id": 810037532, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAzNzUzMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:45:25Z", + "updated_at": "2021-03-30T08:45:25Z", + "author_association": "MEMBER", + "body": "**nenomius, 4 апреля 2018, 11:14**\r\nБыло бы ещё хорошо, чтобы неинты не вели себя как инты.\r\n\r\n\r\n**Antervis, 4 апреля 2018, 11:49**\r\nне совсем так. char != signed char, ровно как и char != unsigned char. Ваше предложение может сломать код, опирающийся на нынешнее поведение.\r\n\r\n\r\n**ldvsoft, 4 апреля 2018, 15:29**\r\nКстати, в стандарт добавили `char8_t`, это надо учитывать.\r\n\r\n\r\n**WPMGPRoSToTeMa, 6 апреля 2018, 16:05**\r\nint8_t и int_least8_t это скорее signed char, чем просто char, также и uint8_t с uint_least8_t, они скорее unsigned char.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810037532/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810039521", + "html_url": "https://github.com/cpp-ru/ideas/issues/293#issuecomment-810039521", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/293", + "id": 810039521, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDAzOTUyMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:48:14Z", + "updated_at": "2021-03-30T08:48:24Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 10 апреля 2018, 13:01**\r\nПочему не так?\r\n```cpp\r\nstd::unique_ptr openFile(const std::string& filename);\r\nstd::unique_ptr openFile(const std::string& filename, std::nothrow_t);\r\n\r\nauto file_with_except = openFile(\"SomeFile.txt\");\r\nauto file_no_except = openFile(\"SomeFile.txt\", std::nothrow);\r\n```\r\n\r\n**Андрей Марцинкевич, 10 апреля 2018, 17:55**\r\nAndrey Davydov, потому что это выглядит как костыль, а не как часть языка. new же это умеет как-то обходить\r\n\r\n\r\n**Andrey Davydov, 10 апреля 2018, 18:06**\r\nАндрей Марцинкевич, что значит \"new это умеет как-то обходить\"? У operator new есть именно что перегрузки с параметром std::nothrow_t.\r\n\r\n\r\n**Андрей Марцинкевич, 10 апреля 2018, 19:09**\r\nAndrey Davydov, действительно. Но все равно было бы наверно красивее сделать это элементом языка все же. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810039521/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810041342", + "html_url": "https://github.com/cpp-ru/ideas/issues/294#issuecomment-810041342", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/294", + "id": 810041342, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA0MTM0Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:50:57Z", + "updated_at": "2021-03-30T08:50:57Z", + "author_association": "MEMBER", + "body": "**Павел, 17 апреля 2018, 19:25**\r\nне нужен ли подобный механизм сразу и для shared?\r\n\r\n\r\n**Андрей Марцинкевич, 20 апреля 2018, 19:22**\r\nПавел Корозевцев, есть std::allocate_shared\r\n\r\n ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810041342/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810044535", + "html_url": "https://github.com/cpp-ru/ideas/issues/294#issuecomment-810044535", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/294", + "id": 810044535, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA0NDUzNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:55:31Z", + "updated_at": "2021-03-30T08:55:31Z", + "author_association": "MEMBER", + "body": "Работа над идеей идёт полным ходом, в C++23 должен появиться std::allocate_unique из http://wg21.link/p0211", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810044535/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810046497", + "html_url": "https://github.com/cpp-ru/ideas/issues/295#issuecomment-810046497", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/295", + "id": 810046497, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA0NjQ5Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T08:58:14Z", + "updated_at": "2021-03-30T08:58:14Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 апреля 2018, 15:50**\r\nКакие именно умные указатели вы хотите увидеть в стандартной библиотеке?\r\n\r\nthread_local разве не лучше чем boost::thread_specific_ptr?\r\n\r\n\r\n**ru.night.beast, 10 апреля 2018, 16:10**\r\nyndx-antoshkka, (голос из зала) linked_ptr, cow_ptr, intrusive_ptr\r\n\r\n \r\n\r\n\r\n**Виктор Губин, 10 апреля 2018, 16:27**\r\nyndx-antoshkka, thread_local это не совсем то-же что и thread_specific_ptr\r\n\r\nthread_local http://en.cppreference.com/w/cpp/language/storage_duration\r\n\r\nthread_specific_ptr https://www.boost.org/doc/libs/1_66_0/doc/html/thread/thread_local_storage.html\r\n\r\nВторое можно получить используя первое.\r\n\r\n\r\n**Виктор Губин, 10 апреля 2018, 16:21**\r\nПростите, не boost::shared_ptr а boost::intrusive_ptr. (отредактировать сайт не дает :( )\r\n\r\n\r\n**yndx-antoshkka, 11 апреля 2018, 16:08**\r\nОбновлено 10 апреля 2018, 16:22\r\n\r\n\r\nintrusive_ptr многие люди хотят.\r\n\r\nПопробуйте набросать черновое предложение, следуя вот этой инструкции https://stdcpp.ru/podgotovka-predlozheniya-v-standart-c-instruktsiya", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810046497/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810049021", + "html_url": "https://github.com/cpp-ru/ideas/issues/295#issuecomment-810049021", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/295", + "id": 810049021, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA0OTAyMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:01:53Z", + "updated_at": "2021-03-30T09:01:53Z", + "author_association": "MEMBER", + "body": "* Над Hazard pointer работа уже во всю идёт.\r\n* `boost::thread_specific_ptr` эквивалентен `thread_local std::unique_ptr`\r\n\r\nА вот над интрузивным указателем стоит поработать", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810049021/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810049968", + "html_url": "https://github.com/cpp-ru/ideas/issues/296#issuecomment-810049968", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/296", + "id": 810049968, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA0OTk2OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:03:18Z", + "updated_at": "2021-03-30T09:03:18Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 11 апреля 2018, 15:45**\r\nЭту тему очень долго обсуждали в международном комитете. Если вы передаёте нулевой указатель и std::string падает - это проблема того, что в вашей программе есть ошибка и она нарушает инвариант использования строки. Можно сделать так, чтобы строка не падала, однако это не исправит ошибку выше по коду (то место где сформировался нулевой указатель, когда он не должен был создаваться).\r\n\r\nВ приведённом выше примере можно исправить ситуацию:\r\n```cpp\r\nstd::string s;\r\n\r\nif(myService.isOnline()){\r\n\r\n s = myService.name();\r\n\r\n}\r\n\r\n// Не нужно: std::string s = str;\r\n```\r\nили\r\n```cpp\r\nconst char *str = \"\";\r\n```\r\nОба этих исправления не добавляют накладных расходов, в отличие от проверки на nullptr в констурукторе строки.\r\n\r\n\r\n**Andrey Davydov, 23 мая 2018, 19:04**\r\nОбновлено 11 апреля 2018, 15:46\r\n\r\n\r\nЕще одна попытка:\r\n\r\nhttp://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p0903r2.pdf\r\n\r\n\r\n**yndx-antoshkka, 4 июня 2018, 15:06**\r\nПроголосовали против этой идеи в Рапперсвиле:\r\n\r\n* В C строка - это нуль терминированный массив символов (не nullptr! nullptr - не строка). Конструктор basic_string_view(const Char*) предназначен для работы со строками, и соответственно nullptr нарушает этот контракт.\r\n\r\n* Если добавить проверку на nullptr - лучше не ставновится. Старый (до C++20) код по прежнемоу должен проверять на nullptr. Итого в переносимых библиотеках будет больше макросов или по прежнему будут проверки на nullptr\r\n\r\n* Проблемы с консистентностью и мучения с обучением. В текущей ситуации можно учить людей, что все строки нельзя создвавть от nullptr. Если разрешить создавать string_view от nullptr, то придётся отвечать на вопросы \"А почему у нас std::string от nullptr не конструируется? А почему мы не можем char*{nullptr} выводить в поток?\"", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810049968/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810051711", + "html_url": "https://github.com/cpp-ru/ideas/issues/297#issuecomment-810051711", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/297", + "id": 810051711, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA1MTcxMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:05:49Z", + "updated_at": "2021-03-30T09:05:49Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 12 апреля 2018, 7:59**\r\n#148 \r\n\r\nhttps://github.com/atomgalaxy/isocpp-template-this/blob/master/template-this.pdf", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810051711/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810052886", + "html_url": "https://github.com/cpp-ru/ideas/issues/298#issuecomment-810052886", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/298", + "id": 810052886, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA1Mjg4Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:07:35Z", + "updated_at": "2021-03-30T09:07:35Z", + "author_association": "MEMBER", + "body": "**zamazan4ik@tut.by, 24 апреля 2018, 12:02**\r\nМне идея нравится. Я готов взяться за написание пропозала насчёт этого алгоритма. \r\n\r\nТакже предлагаю добавить этот алгоритм в Boost.Algorithm (с этим тоже могу помочь). Если Вы не знаете, как это сделать - я могу сделать это за Вас.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810052886/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810054233", + "html_url": "https://github.com/cpp-ru/ideas/issues/299#issuecomment-810054233", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/299", + "id": 810054233, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA1NDIzMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:09:22Z", + "updated_at": "2021-03-30T09:09:22Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 7 мая 2018, 11:05**\r\nЗавели issue на стандартную библиотеку: https://cplusplus.github.io/LWG/issue3106\r\n\r\nПостараемся на ближайшем заседании форсировать исправление.\r\n\r\n\r\n**yndx-antoshkka, 13 июня 2018, 12:16**\r\nРазработчики стандартных библиотек перепроверят, что данная правка не ломает ABI, и скорее всего примут изменение на одном из ближайших заседаний.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810054233/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810055531", + "html_url": "https://github.com/cpp-ru/ideas/issues/299#issuecomment-810055531", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/299", + "id": 810055531, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA1NTUzMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:11:09Z", + "updated_at": "2021-03-30T09:11:09Z", + "author_association": "MEMBER", + "body": "В https://cplusplus.github.io/LWG/issue3106 говорят, что это может сломать бинарную совместимость ABI. Надо либо придумать, как это сделать без слома, либо распрощаться с идеей :(", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810055531/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810058596", + "html_url": "https://github.com/cpp-ru/ideas/issues/300#issuecomment-810058596", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/300", + "id": 810058596, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA1ODU5Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:15:15Z", + "updated_at": "2021-03-30T09:15:15Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 3 мая 2018, 14:44**\r\nИдея хорошая, но стоит ещё сделать и другие типы данных (физические типы данных, например скорость, ускорение, масса и т.д.)\r\n\r\n\r\n**Artalus, 3 мая 2018, 17:08**\r\nВ качестве отправной точки можно также взять [вот такое чудо](https://github.com/nholthaus/units).\r\n\r\n\r\n**neondev9, 3 мая 2018, 17:16**\r\nArtalus, отличная библиотека. Используется та же концепция, но объём впечатляет)\r\n\r\nСегодня еще искал в boost подобные штуки, нашёл [boost::units](https://www.boost.org/doc/libs/1_65_0/doc/html/boost_units.html), суть практически та же, но подход другой и внешний вид не впечатляет.\r\n\r\n\r\n**Andrey Davydov, 4 мая 2018, 20:48**\r\nОбновлено 3 мая 2018, 17:19\r\n\r\n\r\nЭто ж можно будет писать\r\n```cpp\r\nstd::byte buffer[4mb / 1byte];\r\n```\r\n\r\nвообще красота!\r\n\r\nА `1byte / 1bit` предлагаете сделать платформозависимой константой?\r\n\r\nИ еще, если сама идея такой библиотеки продвинется до обсуждения в комитете, то по поводу именования суффиксов будут очень жаркие дебаты.\r\n\r\n\r\n**A, 6 июля 2018, 14:52**\r\nЕсть красивая реализация\r\nhttps://github.com/nholthaus/units", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810058596/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810059542", + "html_url": "https://github.com/cpp-ru/ideas/issues/300#issuecomment-810059542", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/300", + "id": 810059542, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA1OTU0Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:16:38Z", + "updated_at": "2021-03-30T09:16:38Z", + "author_association": "MEMBER", + "body": "Mateusz Pusz сейчас работает над этой проблемой. Попрбуйте его библиотеку, дайте feedback если что-то не так https://github.com/mpusz/units", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810059542/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810061419", + "html_url": "https://github.com/cpp-ru/ideas/issues/302#issuecomment-810061419", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/302", + "id": 810061419, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA2MTQxOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:19:23Z", + "updated_at": "2021-03-30T09:19:23Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 13 июня 2018, 12:14**\r\nПоявилось предложение на эту тему http://wg21.link/p0796 , но оно сильно привязано к Executors, которые в C++20 скорее всего не попадут.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810061419/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810063488", + "html_url": "https://github.com/cpp-ru/ideas/issues/304#issuecomment-810063488", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/304", + "id": 810063488, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA2MzQ4OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:22:23Z", + "updated_at": "2021-03-30T09:22:23Z", + "author_association": "MEMBER", + "body": "**zamazan4ik@tut.by, 3 мая 2018, 16:55**\r\nА разве ещё не убедили избежать дублирования?\r\n\r\n\r\n**yndx-antoshkka, 3 мая 2018, 17:14**\r\nУбедили. Поэтому у задачи тег \"сделано в РГ21\"\r\n\r\n\r\n**edc0a91c24342ae88891, 18 мая 2018, 5:34**\r\nyndx-antoshkka, а есть какие-то подвижки в сторону \"снятия константности\" с constexpr?\r\n\r\n\r\n**yndx-antoshkka, 18 мая 2018, 12:46**\r\nНадо писать бумагу с подробностями. Опишите где это мешает, что хочется починить. Пока кажется что комитет идею отбросит, как ломающую обратную совместимость\r\n\r\n\r\n**edc0a91c24342ae88891, 28 мая 2018, 14:22**\r\nyndx-antoshkka, Я уже описал основные моменты в предложении, да и тут множество костылей на эту тему существует: https://stdcpp.ru/proposals/f0075759-68a5-47e4-b39b-8cfc76c33448 , if constexpr, https://stdcpp.ru/proposals/3bf4d05f-e934-4e0e-a1f9-c46b44341980 - моё предложение.\r\n\r\n \r\n\r\n \r\n\r\nХорошо, я накидаю примеров. Их миллионы и они очевидны - тот же constexpr счётчик. Нужность его сложно переоценить. Тот же constexpr for выше.\r\n\r\n\r\n**languagelawyer, 1 июня 2018, 13:28**\r\n> Убедили. Поэтому у задачи тег \"сделано в РГ21\"\r\n\r\nА когда убедили? Идеи разрешить new в константных выражениях (что позволит сделать constexpr аллокаторы и следовательно constexpr контейнеры) гуляют года с 13-го.\r\n\r\n\r\n**yndx-antoshkka, 1 июня 2018, 20:30**\r\nlanguagelawyer, идея гуляла. Один из разработчиков компиляторов в течение 2х лет пытался реализовать эту идею и хороший результат не получил. После чего решил сосредоточиться на создании специального constexpr_ контейнера. Данный путь в дальнейшем вёл к дублированию всех контейнеров и классов с приставкой constexpr_.\r\n\r\nВ итоге в бумаге мы показали, что можно обойтись только constexpr аллокатором и добавлением constexpr к имеющимся контейнерам. Посмотрев на код аллокатора, разработчик нашёл для себя фишку: можно заставить аллокатор сразу конструировать нужный тип данных при аллокации. Это избавляет от основной проблемы - слежением в constexpr контексте за типом (который erased при возвращении алокатором void*/char*) и временем жизни type erased объекта.\r\n\r\nДальнейшие изыскания позволили разработчику пойти дальше и сделать constexpr new вместо constexpr_allocator. Такой new просто оставляет за бортом все type erased случаи и не считает их constexpr (этого достаточно для создания constexpr контейнеров, как было показано в бумаге от РГ21).\r\n\r\n\r\n**languagelawyer, 2 июня 2018, 10:44**\r\n\r\n> можно заставить аллокатор сразу конструировать нужный тип данных при аллокации\r\n\r\nИ насколько это совместимо с требованиями к аллокаторам?\r\n\r\n\r\n**yndx-antoshkka, 13 июня 2018, 12:12**\r\nlanguagelawyer, это ещё предстоит обсудить. Возможно, что вместо использования std::allocator контейнеры будут допатчены std::is_constexpr_evaluated(). Это уберёт зависимость на std::allocator (что обрадует embedded разработчиков) но добавит немного кода в стандартные контейнеры", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810063488/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810064387", + "html_url": "https://github.com/cpp-ru/ideas/issues/298#issuecomment-810064387", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/298", + "id": 810064387, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA2NDM4Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:23:48Z", + "updated_at": "2021-03-30T09:23:48Z", + "author_association": "MEMBER", + "body": "Алгоритм полезный, предложение ещё никто не написал.\r\n\r\nУчтите, что придётся писать ещё и алгоритм для std::ranges", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810064387/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810067792", + "html_url": "https://github.com/cpp-ru/ideas/issues/306#issuecomment-810067792", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/306", + "id": 810067792, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA2Nzc5Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:28:07Z", + "updated_at": "2021-03-30T09:28:07Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 4 мая 2018, 10:34**\r\nОбщий вопрос: насколько актуально менять функции из сейчас, а не ждать нового дивного std2 с ranges? Мне не нравится, то что сейчас функции принимающие пару итераторов ожидают, что они будут одного типа, в то время как для range-based for loop разрешили begin-, end-итераторам быть разного типа. В результате в C++17 для некоторых своих классов я могу написать\r\n```cpp\r\nint sum(Range && range) {\r\n int res = 0;\r\n for (int i : range)\r\n res += i;\r\n return i;\r\n}\r\n```\r\nно не могу\r\n```cpp\r\nint sum(Range && range) {\r\n return std::accumulate(range.begin(), range.end(), 0);\r\n}\r\n```\r\nВ Ranges TS я знаю эта проблема исправлена, а на сколько, как Вы считатете, актуально было бы исправлять \r\n```cpp\r\ntemplate< class InputIt, class T >\r\nT accumulate( InputIt first, InputIt last, T init );\r\n```\r\nна \r\n```cpp\r\ntemplate< class InputIt, class Sentinel, class T >\r\nT accumulate( InputIt first, Sentinel last, T init );\r\n```\r\nв С++20?\r\n\r\n\r\n**yndx-antoshkka, 4 мая 2018, 18:34**\r\nВы подняли много интресных вопросов:\r\n\r\nУ меня есть необоснованный страх, что Ranges не успеют попасть в C++20. Поэтому constexpr добавляю к существующему . Однако, надо такие же constexpr добавить и для Ranges. Займусь этим в скором времени.\r\n\r\nИсправлять имеющиеся алгоритмы не опираясь на Ranges комитет точно не будет. Это огромная работа и такое исправление будет дублировать работу по Ranges. В итоге просто оба предложения замедлятся.\r\n\r\nИнтереснее другое: можно ли Ranges влить в namespace std, чтобы существующий код начал использовать Ranges из коробки, а алгоритмы не дублировались в двух разных namespace. Задам этот фопрос авторам Ranges.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810067792/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810069159", + "html_url": "https://github.com/cpp-ru/ideas/issues/307#issuecomment-810069159", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/307", + "id": 810069159, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA2OTE1OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:30:15Z", + "updated_at": "2021-03-30T09:30:15Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 30 мая 2018, 19:23**\r\nИдея мне нравится. Есть придирки:\r\n* operator!() не нужен\r\n* downcast() и upcast() надо заменить на *_pointer_cast\r\n* Возможно что будет лучше, если intrusive_ptr_release и intrusive_ptr_add_ref будут принимать ссылки, а не указатели (это упростит жизнь пользователям, им не придётся гадать \"А может ли мне прийти nullptr?\").\r\n* Конструкторы должны быть от шаблонных параметров, а не от T. Это спасёт например от implicit deduction guides (которые тут могут навредить). См http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr\r\n* operator* не должен быть noexcept (разыменовывание nullptr ведёт к UB, при UB noexcept не пишется)\r\n\r\nОтдельно стоит расписать, почему свободные функции используются для кастомизации (а не какой-то шаблонный параметр). И добавить требование, что функции intrusive_ptr_release и intrusive_ptr_add_ref должны быть noexcept, иначе - ошибка компиляции.\r\n\r\n\r\n**languagelawyer, 1 июня 2018, 11:21**\r\n> при UB noexcept не пишется\r\n\r\nОткуда такое правило?\r\n\r\n\r\n**yndx-antoshkka, 1 июня 2018, 13:43**\r\nв некоторых компиляторах есть различные флаги, позволяющие в случае UB например кидать исключение. Если помечать функции с UB как noexcept, то вместо исключения будет вызван std::terminate.\r\n\r\n\r\n**languagelawyer, 1 июня 2018, 14:03**\r\nyndx-antoshkka, noexcept у std::shared_ptr::operator* - это дефект?\r\n\r\n\r\n**yndx-antoshkka, 1 июня 2018, 14:43**\r\nОбновлено 1 июня 2018, 14:03\r\n\r\n\r\nlanguagelawyer, да. К несчастью не устранимый https://cplusplus.github.io/LWG/issue2337\r\n\r\nДля консистентности думают сделать правки в другие части стандартной библиотеки https://cplusplus.github.io/LWG/issue2762 но пока что их не приняли. Так что лучше пока не добавлять noexcept по аналогии с большинством operator*()\r\n\r\n\r\n**neondev9, 31 мая 2018, 15:16**\r\nподдерживаю\r\n\r\n\r\n**Виктор Губин, 18 марта 2019, 18:52**\r\nКласс малость по-сложенее будет. Нехватает операторов сравнения, проверок на соместимость типов (p_enable_if_convertible) и xxx_pointer_cast функций.\r\n\r\n\r\n**Alexander Enaldiev, 18 марта 2020, 17:36**\r\nДа, добавить было бы неплохо.\r\n\r\nК сожалению, предложена частная реализация (+ в камментах ссылка на yet another из boost), а не требования.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810069159/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810071145", + "html_url": "https://github.com/cpp-ru/ideas/issues/295#issuecomment-810071145", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/295", + "id": 810071145, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA3MTE0NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:33:10Z", + "updated_at": "2021-03-30T09:33:10Z", + "author_association": "MEMBER", + "body": "На intrusive_ptr есть отдельный тикет #307\r\nЗакрываю этот в пользу #307", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810071145/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810073528", + "html_url": "https://github.com/cpp-ru/ideas/issues/308#issuecomment-810073528", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/308", + "id": 810073528, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA3MzUyOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:36:44Z", + "updated_at": "2021-03-30T09:36:44Z", + "author_association": "MEMBER", + "body": "**Андрей Руссков, 1 июня 2018, 7:07**\r\nпоправка: \"в случае доступности копирующих операторов присваивания\"\r\n\r\n\r\n**languagelawyer, 1 июня 2018, 11:46**\r\nПредлагается в неявном операторе присваивания делать placement new с конструктором копирования поверх константного члена? После такого этим объектом, или по крайней мере константным подобъектом, нельзя будет пользоваться без std::launder. И std::launder нужен не в том месте, как написано у автора предложения.\r\n\r\nПохоже, предложение родилось из неправильного понимания std::launder.\r\n\r\n\r\n**Андрей Руссков, 1 июня 2018, 12:43**\r\nlanguagelawyer, launder тут ни при чем, ровно как и placement new. Предложение призвано упростить работу со структурами/классами с const members. Например, есть у нас простая запись о сотруднике:\r\n```cpp\r\nstruct Record {\r\n const int id {0};\r\n const Date dateOfBirth {};\r\n string name;\r\n Position position;\r\n // ...\r\n};\r\n```\r\n\r\nпредполагается, что в процессе работы приложения у сотрудника могут измениться имя (вдруг поменяет) и должность, но не могут измениться дата рождения и id записи. Однако при таком подходе одну запись нельзя заменять другой, что сильно ограничивает возможность их применения:\r\n```cpp\r\nvector employees;\r\nemployees.push_back({id, date, name, position, ...}); // Легально\r\nsort(employees.begin(), employees.end(), dateLess); // Ошибка\r\nemployees.erase(it); // Ошибка\r\npartition(employees.begin(), employees.end(), [](auto &r) { return r.sex == Male; }); // Ошибка\r\n```\r\n\r\n**Pavel Verutin, 11 июня 2018, 18:40**\r\nА если есть такая структура:\r\n```cpp\r\nstruct TestStruct\r\n{\r\n TestStruct(int someInt = 0) \r\n : m_someInt(someInt), m_pInt(&m_someInt) {}\r\n TestStruct(TestStruct const & other)\r\n : m_someInt(other.m_someInt), m_pInt(&m_someInt) {}\r\n\r\nprivate:\r\n int m_someInt;\r\n int * const m_pInt;\r\n};\r\n```\r\nчто должно произойти с указателем при вызове оператора присваивания?\r\n\r\n\r\n**Андрей Руссков, 13 июня 2018, 5:59**\r\nPavel Verutin, этот случай не попадает под условия генерации неявного оператора присваивания\r\n\r\n\r\n**languagelawyer, 14 июня 2018, 1:43**\r\n\r\n> Предлагаю: не удалять неявный оператор копирующего присваивания из-за наличия const полей в случае доступности копирующих операторов присваивания этих полей.\r\n\r\nВ случае константных полей-классов неявный оператор и так не удаляется, если копирующий оператор для поля можно вызвать: https://wandbox.org/permlink/J5qKwNxMPEYwwF8F\r\nПравда, он для этого должен быть с const-квалификатором, что довольно бессмысленно.\r\n\r\nЕсли есть в классе есть \"a non-static data member of const non-class type\", то тогда да, неявный оператор определяется удалённым (http://eel.is/c++draft/class.copy.assign#7.2). Только о какой \"доступности\" копирующего оператора присваивания может идти речь, например, для `const int`?\r\n\r\n\r\n**WPMGPRoSToTeMa, 20 июня 2018, 18:05**\r\nЯ думаю такую структуру проще обернуть в std::variant с одним типом.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810073528/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810075842", + "html_url": "https://github.com/cpp-ru/ideas/issues/309#issuecomment-810075842", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/309", + "id": 810075842, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA3NTg0Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:40:07Z", + "updated_at": "2021-03-30T09:40:07Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 8 июня 2018, 15:48**\r\nПервый пример уже сейчас можно сильно сократить: https://godbolt.org/g/pEm57Y\r\n\r\nВторой пример через алиасы не записать https://godbolt.org/g/BixZb4\r\n\r\nДонести ваше предложение до стандарта будет безумно трудно, не уверен что игра стоит свечь... Надо прорабоать ситуации, когда struct и implementation различаются по полям/сигнатурам, можно ли объявлять вспомогательные вещи в implementation и какая у них будет область видимости, может ли быть несколько секций implementation в одной еднице трансляции и многое другое.\r\n\r\nВы готовы к трудностям?\r\n\r\n\r\n**Mikhail Shostak, 8 июня 2018, 16:45**\r\nyndx-antoshkka, изначально подразумевалось, что implementation будет просто сокращать написание определений. В случае, если программист пытается что-то определить через implementation секцию, чего нет в объявлении, то компилятор будет бросать теже ошибки, что и сейчас, если программист попытается сделать тоже самое с помощью текущего синтаксиса (выше я писал примеры с несколькими ошибками).\r\n\r\nБыли мысли, что в implementation блоке компилятор может разрешать писать, например, приватные и статические методы. Но это похоже на дополнительную фунциональность, которой сейчас нет в c++, если это стоит добавлять в рамках текущего предложения, то - да, надо подумать и проработать что и как можно реализовать. Это введёт pimpl идиому в язык.\r\n\r\nТрудности не проблема\r\n\r\nЕсли отказаться от дополнительного функционала, то поступило предложение сделать синтаксис следующим: namespace class object {...} в таком случае можно исключить введения нового ключевого слова.\r\n\r\n\r\n**Mikhail Shostak, 8 июня 2018, 16:58**\r\nТочнее что-то похожее на pimpl\r\n\r\n\r\n**yndx-antoshkka, 13 июня 2018, 12:04**\r\nMikhail Shostak, начать стоит откуда-то отсюда http://eel.is/c++draft/basic.def . Посмотрите, насколько просто будет добавить вашу идею.\r\n\r\nПодготовьте примеры покороче, попробуйте оформить вашу идею на английском и закиньте на обсуждение ещё вот сюда: https://groups.google.com/a/isocpp.org/forum/#!forum/std-proposals\r\n\r\nТам сидят разработчики компиляторов, они смогут дать поелзную критику о возможности имплементировать данное предложение и о непротиворечивости предложенной грамматики.\r\n\r\nЕсли всё будет ок - то чтоит начать писать предложение, ка кописано вот тут: https://stdcpp.ru/podgotovka-predlozheniya-v-standart-c-instruktsiya\r\n\r\nГотов консультировать по любым вопросам :)\r\n\r\n\r\n**WPMGPRoSToTeMa, 20 июня 2018, 18:02**\r\nБудет ли в этом смысл если добавят модули?\r\n\r\n\r\n**Виктор Губин, 20 июня 2018, 20:01**\r\nКак-то больно ObjectPacal получается (и его NexT/Apple и Borand наследники).\r\n\r\nТогда и with (заменив на using) добавить до кучи :) Что-бы можно было делать что-то вроде\r\n```cpp\r\nstruct Vec3 {\r\n\r\n int x,y,z;\r\n\r\n};\r\n\r\nVec3 v = {-1,0,1};\r\n\r\nusing(v) {\r\n\r\n x *= 2;\r\n\r\n y *= 2;\r\n\r\n z *= 2;\r\n\r\n}\r\n\r\n// foo.hpp\r\n\r\nnamespace bar {\r\n\r\nclass Foo {\r\npublic:\r\n Foo(const Foo&) = default;\r\n Foo& operator=(const Foo&) = default;\r\n Foo& operator+(const Foo& rhs); \r\n Foo(); \r\n ~Foo();\r\n void foo();\r\n};\r\n\r\n}\r\n\r\n// foo.cpp\r\n\r\nnamespace bar {\r\n\r\nusing(Foo) { \r\n \r\n Foo() \r\n {\r\n // TODO: implement\r\n }\r\n\r\n ~Foo() \r\n {\r\n // TODO: implement\r\n } \r\n \r\n void foo() \r\n {\r\n // TODO: implement\r\n }\r\n\r\n // compile time error Foo::foo already defined\r\n static void foo () {\r\n }\r\n\r\n Foo& operator+(const Foo& rhs) {\r\n // TODO: implement\r\n return *this;\r\n } \r\n\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810075842/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810077510", + "html_url": "https://github.com/cpp-ru/ideas/issues/310#issuecomment-810077510", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/310", + "id": 810077510, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA3NzUxMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:42:35Z", + "updated_at": "2021-03-30T09:42:35Z", + "author_association": "MEMBER", + "body": "**Виктор Губин, 14 июня 2018, 13:33**\r\nБыло-бы здорово имень что-то вроде\r\n```cpp\r\nuint8_t b = 0xBF;\r\n\r\nbool bi0 = a[0]; bool bi1 = b[1]; ... bool bi7 = b[7];\r\n```\r\nЕще-бы непомешало ввести в стандарт раширения типа __builtin_clz, __builtin_clrsb, __builtin_popcount, __builtin_parity, __builtin_bswap16 ... __builtin_bswap64 от GCC и __lzcnt, _BitScanForward,_BitScanReverse, _bittest, _byteswap_ushort ... _byteswap_uint64 от MS VC++\r\n\r\n\r\n**Alexander, 15 июня 2018, 20:25**\r\nВиктор Губин, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0553r2.html", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810077510/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810078704", + "html_url": "https://github.com/cpp-ru/ideas/issues/310#issuecomment-810078704", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/310", + "id": 810078704, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA3ODcwNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:44:23Z", + "updated_at": "2021-03-30T09:44:23Z", + "author_association": "MEMBER", + "body": "Хорошая идея - добавить алгоритмы в стандартную библиотеку. Учтите что надо будет добавить и в std::ranges", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810078704/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810081437", + "html_url": "https://github.com/cpp-ru/ideas/issues/311#issuecomment-810081437", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/311", + "id": 810081437, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA4MTQzNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:48:21Z", + "updated_at": "2021-03-30T09:48:21Z", + "author_association": "MEMBER", + "body": "**languagelawyer, 18 июня 2018, 16:07**\r\nА почему atomic_view переименовали в atomic_ref?\r\n\r\n\r\n**Александр Рыбалка, 5 июля 2018, 12:01**\r\nПроголосовал за консистентность, но, по-моему, лучше бы сделали не *_view, а *_ref. Потому что view ассоциируется с паттерном MVC, а ref - с reference, что, на мой взгляд, лучше отражает суть класса.\r\n\r\n\r\n**Vladimir Smirnov, 6 июля 2018, 13:33**\r\nАлександр Рыбалка, поддерживаю ваше предложение\r\n\r\n\r\n**Semen Martynov, 9 июля 2018, 14:37**\r\nАлександр Рыбалка, разумно\r\n\r\n\r\n**webreh, 5 июля 2018, 13:03**\r\nЗа все, кроме, возможно, atomic_ref. Идея использовать специальный суффикс _view для семантических ссылок крайне привлекательна (в частности, мы используем).\r\n\r\nО коллизиях с паттернами поздно рассуждать, потому что уже есть string_view.\r\n\r\n\r\n**gbug, 5 июля 2018, 13:47**\r\nОднообразие -- это хорошо и правильно, но только хочется не *_view, а *_ref. Как уже здесь высказывались, так лучше передается суть. ИМХО, разумеется.\r\n\r\n\r\n**vladsavostin, 5 июля 2018, 16:13**\r\nЕсли невладеющий класс не допускает изменения объекта, на который он ссылается, то его логично называть view, когда же невладеющий класс допускает изменения, то это, безусловно, ref. Смешивать эти названия мне кажется плохой идеей.\r\n\r\n\r\n**Ilya Popov, 6 июля 2018, 14:17**\r\nВообще-то есть принципиальная разница между `*_view` и `*_ref`. `*_view` только для чтения, через них нельзя изменить объкт на который они ссылаются (только константный доступ). Через `_ref` объект можно изменять.\r\n\r\n\r\n**Yurii Zubrytskyi, 10 июля 2018, 5:28**\r\nНе надо. Сейчас как раз всё консистентно - _view предоставляет только константный доступ (можно посмотреть), а _ref - чистая ссылка (можно менять)\r\n\r\n\r\n**Вадим Усольцев, 25 июля 2018, 23:17**\r\nПрисоединяюсь к ораторам за _ref - как-то более адекватно. view - это откуда-то из другой области все же.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810081437/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810082991", + "html_url": "https://github.com/cpp-ru/ideas/issues/311#issuecomment-810082991", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/311", + "id": 810082991, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA4Mjk5MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:50:41Z", + "updated_at": "2021-03-30T09:50:41Z", + "author_association": "MEMBER", + "body": "Со std::span мы опоздали (хотелось бы, чтобы его имя было самой большой проблемой!)\r\n\r\nВ остальном, как мне подсказали, консистентность уже есть\r\n* view - для всех немутирующих классов\r\n* ref - для мутирующих", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810082991/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810084305", + "html_url": "https://github.com/cpp-ru/ideas/issues/312#issuecomment-810084305", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/312", + "id": 810084305, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA4NDMwNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:52:28Z", + "updated_at": "2021-03-30T09:52:28Z", + "author_association": "MEMBER", + "body": "**Виктор Губин, 14 июня 2018, 13:07**\r\nТ.е. - смержить regexp (бывший boost regexp) и boost xpressive, или заменить реализацию на xpressive с портированием на С++ 20 без MPL, или заставить компилятор генерировать код конечного автомата на этапе компиляции наподобие Bison или Antlr только сразу в машинных кодах? У xpressive и Spirit есть существенные недостатки - очень внушительное время компиляции, сложность определения ошибки в регулярном выражении и т.п. (ко всему нельзя отключить исключения и RTTI, т.е. Проблемы для embedded/device drivers/kernel development и т.п.)\r\n\r\n\r\n**yndx-antoshkka, 14 июня 2018, 18:13**\r\nВиктор Губин, да, заставить компилятор генерировать код конечного автомата в машинных кодах на этапе компиляции. При этом бинарная совместимость и все имеющиеся интерфесы [boost|std]::regex останутся старыми.\r\n\r\n\r\n**neondev9, 16 июня 2018, 12:12**\r\nДобрый день. Немного не по теме, но где можно почитать про constexpr новинки?\r\n\r\n\r\n**yndx-antoshkka, 5 июля 2018, 12:43**\r\nneondev9, либо вот тут выискивать нужные бумаги.\r\n\r\nЛибо можно обзоры новинок брать из постов на хабре (пример).\r\n\r\n\r\n**Evgeny Basargin, 18 июля 2018, 17:57**\r\nи литерал до кучи std::literals::regex_literals::operator\"\"r", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810084305/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810086220", + "html_url": "https://github.com/cpp-ru/ideas/issues/312#issuecomment-810086220", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/312", + "id": 810086220, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDA4NjIyMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T09:55:27Z", + "updated_at": "2021-03-30T09:55:27Z", + "author_association": "MEMBER", + "body": "`std::regex` слишком сломан... в комитете не особо желают его чинить.\r\n\r\nВместо этого, Hana Dusíková предлагает создать отдельный тип для регулярных выражений с constexpr посторением автомата в https://wg21.link/P1433", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810086220/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810356163", + "html_url": "https://github.com/cpp-ru/ideas/issues/313#issuecomment-810356163", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/313", + "id": 810356163, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM1NjE2Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:29:13Z", + "updated_at": "2021-03-30T15:29:13Z", + "author_association": "MEMBER", + "body": "**AlexanderFadeev, 5 июля 2018, 14:48**\r\nС такими названиями будет происходить путаница с std::move\r\n\r\n\r\n**Саша Зайцев, 6 июля 2018, 15:42**\r\nЯ против, так как из названия не понятно, что оно делает. А std::shift_куда сразу понятно, что мы будем делать.\r\n\r\nИ что-то мне вспоминается, что такой вариант предлагали уже в обсуждении в гуглогруппах.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810356163/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810356395", + "html_url": "https://github.com/cpp-ru/ideas/issues/313#issuecomment-810356395", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/313", + "id": 810356395, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM1NjM5NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:29:31Z", + "updated_at": "2021-03-30T15:29:31Z", + "author_association": "MEMBER", + "body": "C++20 случился, менять уже что-либо поздно", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810356395/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810358243", + "html_url": "https://github.com/cpp-ru/ideas/issues/314#issuecomment-810358243", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/314", + "id": 810358243, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM1ODI0Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:31:55Z", + "updated_at": "2021-03-30T15:31:55Z", + "author_association": "MEMBER", + "body": "**webreh, 5 июля 2018, 12:57**\r\nВсеми руками за, но эта идея уже отвергнута комитетом по гениальной причине: непонятно, в какой кодировке записаны соответствующие строковые литералы.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810358243/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810359598", + "html_url": "https://github.com/cpp-ru/ideas/issues/315#issuecomment-810359598", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/315", + "id": 810359598, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM1OTU5OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:33:48Z", + "updated_at": "2021-03-30T15:33:48Z", + "author_association": "MEMBER", + "body": "**Саша Зайцев, 6 июля 2018, 15:45**\r\nМне кажется, что на это дело забьют в комитете с формулировкой \"Ждите модулей, ребята. Скоро выкатим\"\r\n\r\n\r\n**Nate Reinar Windwood, 14 июля 2018, 19:39**\r\nА смысл? Все равно модулей ждем. А препроцессор надо убивать, а не расширять.\r\n\r\n\r\n**Fihtangolz, 17 июля 2018, 20:52**\r\nNate Reinar Windwood, зачем? Давайте goto тогда еще похороним. Пусть будет \r\n\r\n\r\n**Nate Reinar Windwood, 12 декабря 2018, 23:14**\r\nFihtangolz, а goto и так только для обратной совместимости нужен.\r\n\r\n\r\n**Владислав Петров, 26 июня 2019, 9:21**\r\nкакие прагмы? препроцессор надо выпиливать!", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810359598/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810360541", + "html_url": "https://github.com/cpp-ru/ideas/issues/315#issuecomment-810360541", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/315", + "id": 810360541, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM2MDU0MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:34:59Z", + "updated_at": "2021-03-30T15:34:59Z", + "author_association": "MEMBER", + "body": "Дубликат #283 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810360541/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810362843", + "html_url": "https://github.com/cpp-ru/ideas/issues/316#issuecomment-810362843", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/316", + "id": 810362843, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM2Mjg0Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:37:09Z", + "updated_at": "2021-03-30T15:37:09Z", + "author_association": "MEMBER", + "body": "**Игорь Шаповал, 6 июля 2018, 9:30**\r\nЯ думаю не нужно добавлять новое ключевое слово или изменять.\r\nНа много лучше будет добавить атрибут, который будет используется\r\nвместе с constexpr. \r\nНапример, [[static_only]] или [[constexpr_only]].\r\nОн будет указывать, что вычисление будет выполняться\r\nтолько во время компиляции.\r\nЗоопарк в виде constexpr, constexpr! или staticexpr мне кажется через чур.\r\n```cpp\r\n[[static_only]]\r\nconstexpr int sum(int a, int b) {\r\n return a + b;\r\n}\r\n```\r\n\r\n**neondev9, 6 июля 2018, 12:27**\r\nсогласен с вашими словами. Но в идеале это всё нужно было определить сразу, в 11-ом стандарте когда только вводили constexpr и тогда сразу чётко определить ключевые слова для обоих случаев.\r\n\r\n\r\n**Саша Зайцев, 6 июля 2018, 15:46**\r\nИгорь Шаповал, кстати мне тоже идея с атрибутом нравится.\r\n\r\n\r\n**yndx-antoshkka, 12 июля 2018, 12:57**\r\nПока подлил масла в огонь, и передал ваши коментарии (из этой темы и из https://stdcpp.ru/proposals/37161dcc-eeaf-4d8d-8556-b3f7a4e64954) в приватные обсуждения ISO.\r\n\r\nМногим новое слово constexpr! не нравится. Пока люди перебирают варианты для замены.\r\n\r\n\r\n**neondev9, 24 июля 2018, 16:20**\r\nесть какие-то новости? \r\n\r\n\r\n**WPMGPRoSToTeMa, 27 июля 2018, 1:50**\r\n\r\n> содержит в себе восклицательный знак, что абсолютно противоречит стилю именования ключевых слов в С++.\r\n\r\nНу, кстати, нечто подобное уже есть - sizeof...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810362843/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810363634", + "html_url": "https://github.com/cpp-ru/ideas/issues/316#issuecomment-810363634", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/316", + "id": 810363634, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM2MzYzNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:37:35Z", + "updated_at": "2021-03-30T15:37:35Z", + "author_association": "MEMBER", + "body": "В C++20 приняли `consteval`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810363634/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810367844", + "html_url": "https://github.com/cpp-ru/ideas/issues/317#issuecomment-810367844", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/317", + "id": 810367844, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM2Nzg0NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:40:18Z", + "updated_at": "2021-03-30T15:41:02Z", + "author_association": "MEMBER", + "body": "**Андрей Руссков, 6 июля 2018, 7:42**\r\nтокен constexpr сам по себе длинный, для его задач хорошо бы подошло занятое слово static. Какой-нибудь force_constexpr был бы слишком непечатным\r\n\r\n\r\n**nenomius, 6 июля 2018, 14:16**\r\n\r\n> Как это вообще проговорить - \"констэкспр восклицательный знак\"?\r\n\r\nвот так: https://i.imgflip.com/2dhylk.jpg\r\n\r\n\r\n**ZzZombo, 8 июля 2018, 8:32**\r\nПредлагаю использовать `comp[ile]time`. Согласен с возражениями полностью.\r\n\r\n\r\n**michail.vms, 9 июля 2018, 0:00**\r\nПоддерживаю и, как где-то уже писали, лучше добавить просто атрибуты к constexpr.\r\n\r\n\r\n**Yauheni Akhotnikau, 9 июля 2018, 15:16**\r\nМожет быть constexpr и constexpr для старого поведения constexpr. И constexpr<strong> для нового, когда вычисление должно быть только в compile-time. Ну или какие-то другие значения в уголовых скобках, но применить именно template-подобный синтаксис как максимально знакомый для С++ников.\r\n\r\nНапример, constexpr -- можно вычислять и там, и там. А constexpr -- только во время компиляции.\r\n\r\n\r\n**Dmitry Volosnykh, 10 июля 2018, 17:50**\r\nМожет static_constexpr по аналогии с static_assert?\r\n\r\n\r\n**yndx-antoshkka, 12 июля 2018, 12:54**\r\nЭто предложение дублирует #316\r\n\r\nПредлагаю дальнейшее обссуждение проводить в нём.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810367844/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810370041", + "html_url": "https://github.com/cpp-ru/ideas/issues/318#issuecomment-810370041", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/318", + "id": 810370041, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM3MDA0MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:42:47Z", + "updated_at": "2021-03-30T15:42:47Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 9 января 2019, 21:45**\r\nМне ответил автор bit_cast приблизительно следующее:\r\n\r\nЕму не кажется данное предложение хорошей идеей, т.к. bit_cast это no-op меняющий тип у битов. Alignment ортогонален bit_cast, так как проблема не возникает при представлении битов, а лишь при попытке такой указатель разадресовать. Подобное ловится санитайзерами, и может быть вполне валидным кодом в ряде случаев, где полученные указатели не разадресоввываются. В добавок, добавление подобного SFINAE пагубно повлияет на переносимость кода, так как alignment сильно различается на ряде платформ.\r\n\r\nУ кого какие идеяи/коментарии?\r\n\r\n\r\n**Andrey Davydov, 23 января 2019, 0:07**\r\nyndx-antoshkka, в первой ревизии bit_cast ведь в принципе не мог работать с указателями. И хотя от этого решили отказаться, конвертирование указателей по-прежнему не имеет смысла, разыменование сконвертированного указателя все так же нарушает aliasing rules, так что какой смысл накладывать ограничения на alignment?\r\n\r\n\r\n**yndx-antoshkka, 24 января 2019, 17:12**\r\nAndrey Davydov, может не нарушать aliasing rules если конвертирование идёт от/к char/unsigned char/byte. Но это скорее граничные случаи.\r\n\r\nКажется что имеет смысл наложить ограничение и на aliasing... Но получается как-то стрёмненько. Может просто забанить конвертирование указателей?\r\n\r\n\r\n**Andrey Davydov, 24 января 2019, 17:30**\r\n\r\n> Может просто забанить конвертирование указателей?\r\n\r\nТак в R0 оно было забанено, но от этого отказались в R1. Мотивация тут: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0476r1.html#rev, то что заворачивание указателя в структуру ломает этот запрет.\r\n\r\n\r\n**yndx-antoshkka, 20 июля 2020, 20:08**\r\nПредложение отклонили, сказав что заворачивание в структуру слишком легко ломает этот кейс. Так же сказали, что кастование из std::byte* например в int* является нормой, и проверять должна не эта функция, а сам пользователь (функция низкоуровневая и не должна иметь оверхед)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810370041/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810371835", + "html_url": "https://github.com/cpp-ru/ideas/issues/319#issuecomment-810371835", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/319", + "id": 810371835, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM3MTgzNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:45:18Z", + "updated_at": "2021-03-30T15:45:18Z", + "author_association": "MEMBER", + "body": "**Андрей Руссков, 9 июля 2018, 7:01**\r\nможно подождать метаклассы - с их помощью можно будет создавать подобное", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810371835/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810372588", + "html_url": "https://github.com/cpp-ru/ideas/issues/319#issuecomment-810372588", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/319", + "id": 810372588, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM3MjU4OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:46:17Z", + "updated_at": "2021-03-30T15:46:17Z", + "author_association": "MEMBER", + "body": "Дубликат #70 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810372588/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810373742", + "html_url": "https://github.com/cpp-ru/ideas/issues/320#issuecomment-810373742", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/320", + "id": 810373742, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM3Mzc0Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:47:53Z", + "updated_at": "2021-03-30T15:47:53Z", + "author_association": "MEMBER", + "body": "**Андрей Руссков, 9 июля 2018, 12:49**\r\nхоть это и является признаком дурного тона, компараторы тоже могут кидать исключения.\r\n\r\n\r\n**WPMGPRoSToTeMa, 27 июля 2018, 1:45**\r\nАндрей Руссков, в таком случае можно выставлять noexcept в зависимости от того является ли компаратор noexcept.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810373742/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810376951", + "html_url": "https://github.com/cpp-ru/ideas/issues/321#issuecomment-810376951", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/321", + "id": 810376951, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM3Njk1MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:52:17Z", + "updated_at": "2021-03-30T15:52:17Z", + "author_association": "MEMBER", + "body": "**Данил Луценко, 9 июля 2018, 22:44**\r\nДополнительно предлагаю разрешить перегрузку функции для контекстов времени компиляции и исполнения, как альтернатива магической std::is_constant_evaluated\r\n```cpp\r\nconstexpr(false) int atoi(const char *S);\r\nconstexpr(true) int atoi(const char *S) { /*...*/ }\r\nstatic_assert(atoi(\"5\") == 5); //Вызывает constexpr(true) int atoi(const char *S)\r\nint main()\r\n{\r\n assert(atoi(\"5\") == 5); //Вызывает constexpr(false) int atoi(const char *S)\r\n}\r\n```\r\nтогда constexpr(auto) можно сделать лучше:\r\n\r\nНапример пусть следующий код\r\n```cpp\r\nconstexpr(auto) int atoi(const char *c)\r\n{\r\n return std::atoi(c);\r\n}\r\n```\r\nаналогичен следующему коду\r\n```cpp\r\nconstexpr(false) int atoi(const char *c)\r\n{\r\n return std::atof(c);\r\n}\r\n```\r\nт.к. нет перегрузки функции std::atoi c constexpr(true)\r\n\r\n\r\nИ\r\n```cpp\r\nconsexpr(auto) int atoi(const char *S) {\r\n\r\n int result = 0;\r\n while (*S) {\r\n result = result * 10 + (*S - '0');\r\n ++S;\r\n }\r\n return result;\r\n}\r\n```\r\nаналогичен следующему, \r\n```cpp\r\nconsexpr(false) int atoi(const char *S) {\r\n int result = 0;\r\n while (*S) {\r\n result = result * 10 + (*S - '0');\r\n ++S;\r\n }\r\n return result;\r\n}\r\nconsexpr(true) int atoi(const char *S) {\r\n int result = 0;\r\n while (*S) {\r\n result = result * 10 + (*S - '0');\r\n ++S;\r\n }\r\n return result;\r\n}\r\n```\r\nт.к. функция может быть выполнена на этапе компиляции\r\n\r\n\r\n**Fihtangolz, 17 июля 2018, 20:50**\r\nconstexpr! <- давайте без ! как нибудь constexpr_hard ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810376951/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810378827", + "html_url": "https://github.com/cpp-ru/ideas/issues/321#issuecomment-810378827", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/321", + "id": 810378827, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM3ODgyNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:54:49Z", + "updated_at": "2021-03-30T15:54:49Z", + "author_association": "MEMBER", + "body": "А зачем это нужно? Есть реальный пример, где `constexpr(false)` и `constexpr(true)` действительно полезны?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810378827/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810380374", + "html_url": "https://github.com/cpp-ru/ideas/issues/322#issuecomment-810380374", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/322", + "id": 810380374, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM4MDM3NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T15:56:55Z", + "updated_at": "2021-03-30T15:56:55Z", + "author_association": "MEMBER", + "body": "**Антон Санаров, 26 июля 2018, 12:48**\r\nСтандарт это уже разрешает: http://open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#727. Изменение включено в C++17 и бэкпортировано на C++14.\r\n\r\nGCC, к сожалению, пока не поддерживает подобные объявления. На эту тему открыт баг-репорт https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85282", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810380374/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810385061", + "html_url": "https://github.com/cpp-ru/ideas/issues/323#issuecomment-810385061", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/323", + "id": 810385061, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM4NTA2MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T16:02:50Z", + "updated_at": "2021-03-30T16:02:50Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 16 июля 2018, 20:08**\r\nВ скром времени должны будут подъехать контракты в стандартную библиотеку. Тогда [подобные requires](http://eel.is/c++draft/string.cons#12) превратятся в контракт и можно будет регулировать поведение конструкторов std::string в случае нарушения контракта (например при передачи в него nullptr).\r\n\r\n\r\n**Айдар Фаттахов, 31 июля 2018, 10:47**\r\nОверхед же", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810385061/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810385829", + "html_url": "https://github.com/cpp-ru/ideas/issues/323#issuecomment-810385829", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/323", + "id": 810385829, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDM4NTgyOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T16:03:52Z", + "updated_at": "2021-03-30T16:03:52Z", + "author_association": "MEMBER", + "body": "Дубликат #188", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810385829/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810401752", + "html_url": "https://github.com/cpp-ru/ideas/issues/324#issuecomment-810401752", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/324", + "id": 810401752, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQwMTc1Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T16:26:24Z", + "updated_at": "2021-03-30T16:26:24Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 16 июля 2018, 11:16**\r\nТакие операторы уже сть в стандарте: http://eel.is/c++draft/string.op+#5\r\n\r\nКажется, что недочёт в вашей стандартной библиотеке. Каким компилятором и стандартной библиотекой вы пользуетесь?\r\n\r\n\r\n**Evgeny Basargin, 16 июля 2018, 11:22**\r\nyndx-antoshkka, скорее мой пробел в познаниях стандартной библиотеки. Действительно так, можно снять с голосования.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810401752/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810406253", + "html_url": "https://github.com/cpp-ru/ideas/issues/325#issuecomment-810406253", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/325", + "id": 810406253, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQwNjI1Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T16:32:54Z", + "updated_at": "2021-03-30T16:34:11Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 16 июля 2018, 11:27**\r\nИдея огонь! Скину авторам ranges TS.\r\n\r\n\r\n**yndx-antoshkka, 17 июля 2018, 15:33**\r\nЕсть минусы в таком подходе - он не позволяет использовать сокращённый синтаксис https://godbolt.org/g/R3z5FF.\r\n\r\n\r\n**d-yaroshev, 18 июля 2018, 13:50**\r\nyndx-antoshkka, ой. А как terse syntax подставляет имя неявного параметра?\r\n\r\n\r\n**Andrey, 16 июля 2018, 16:17**\r\nЯ чего-то не догнал в чем идея. Если вызвать\r\n```cpp\r\n#include \r\n\r\nbool is_even(int);\r\n\r\nvoid test(std::array xs) {\r\n my_find_if(xs.begin(), xs.end(), &is_even);\r\n}\r\n```\r\nто в compute_is_predicate придет identity, где Fn = bool (*)(int). Что в этом хорошего?\r\n\r\n\r\n**d-yaroshev, 18 июля 2018, 13:42**\r\nAndrey, не очень вас понял.\r\nЕсть concepts, идея concepts в том чтобы ограничивать шаблоны.\r\n\r\nВопрос в том что сейчас есть concept Predicate, например: https://en.cppreference.com/w/cpp/concepts/Predicate\r\n\r\nИ для find_if, нужно чтобы функтор, который ему передается, был Predicate.\r\n\r\nСейчас это предлагается писать как:\r\n```cpp\r\ntemplate \r\n requires ForwardIterator && Predicate>\r\nI find_if(I f, I l, P p);\r\n```\r\nМне кажется, что понятнее написать:\r\n```ccpp\r\ntemplate \r\n requires ForwardIterator && Predicate)>\r\nI find_if(I f, I l, P p);\r\n```\r\n \r\n\r\n\r\n**Andrey, 19 июля 2018, 9:37**\r\nОк, в первый раз я Вас не понял. То что Вы предлагаете (если я правильно понял сейчас) невозможно -- concept definition (в отличие от class template) нельзя частично специализировать.\r\n\r\n\r\n**d-yaroshev, 19 июля 2018, 9:46**\r\nAndrey, это абсолютно не страшно. Можете посмотреть на реализацию для Predicate из описания моего предложения.\r\n\r\n\r\n**d-yaroshev, 19 июля 2018, 11:56**\r\nAndrey, я что-то не понимаю( Какая разница как устроена шаблонная магия внутри стандартной библиотеки? Важно же какой интерфейс получает пользователь библиотеки, правда? Я могу не через identity сделать https://godbolt.org/g/Da2Ft5\r\n\r\nВас смушает, что тип параметра шаблона не осмысленный? Ну это некоторый DSL, я бы сказал, достаточно понятный.\r\n\r\n\r\n**Andrey, 19 июля 2018, 11:58**\r\nпередавать как шаблонный аргумент identity? Да так можно. Но тогда я возвращаюсь к своему первому вопросу -- зачем это делать, если получающийся тип лишен смысл -- это function type, return type которого это function-like type, к примеру, функция принимающая int и возвращающая pointer на функцию принимающую int и возвращающую bool. Это все чтобы в месте использования Predicate писать Predicate<P(ValueType<I>)> вместо Predicate<P, ValueType<I>>, потому что первая конструкция кажется Вам понятнее. Но если вспомнить реальные подставляемые значения P и ValueType<I>, bool(*)(int) и int соответственно, то что же в этом естественного?\r\n\r\n\r\n**Andrey, 19 июля 2018, 12:00**\r\nd-yaroshev, ок, давайте сойдемся на том, что мне не нравится DSL в котором используются неосмысленные типы. Это вопрос вкуса, и спорить дальше смысла нет.\r\n\r\n\r\n**yndx-antoshkka, 19 июля 2018, 18:14**\r\nМне подсказали, что комитет рассматривал и отказался от этой идеи. \"Она ведёт к нерприятным сюрпризам из-за decay типов аргументов функции при формированиии типа функции.\"", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810406253/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810408891", + "html_url": "https://github.com/cpp-ru/ideas/issues/326#issuecomment-810408891", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/326", + "id": 810408891, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQwODg5MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T16:36:51Z", + "updated_at": "2021-03-30T16:36:51Z", + "author_association": "MEMBER", + "body": "**Nate Reinar Windwood, 16 июля 2018, 14:27**\r\n*по аналогии\r\n\r\n\r\n**Nate Reinar Windwood, 25 июля 2018, 21:16**\r\nХоть кто-нибудь из поставивших минус аргументировал бы, что ли :-/\r\n\r\n\r\n**Andrey, 27 июля 2018, 11:07**\r\nNate Reinar Windwood, я не ставил минусов, но вот моя версия, почему в том виде, что Вы предлагаете это ужасная идея (и, кстати, в python'е это резализовано по-нормальному).\r\n\r\nДля многих структур данных (к примеру, std::[unordered_]{set,map}) реализация contains через std::find -- это совершенно точно не то, чего хотелось бы.\r\n\r\n \r\n\r\n\r\n**Nate Reinar Windwood, 8 августа 2018, 22:16**\r\nAndrey, ну, значит, нужна функция std::contains, которая будет по-разному перегружена для разных структур, и в которую будет разворачиваться сабж.\r\n\r\n\r\n**yndx-antoshkka, 27 июля 2018, 11:48**\r\nЕщё не успел поставить минус... Но аргументация следующая:\r\n\r\nДобавлять малоизвестный \"синтаксический сахар\" в язык - как правило очень плохая идея. Это ведёт к меньшей читаемости кода и риску скатиться в perl. Если собрать весь синтаксический сахар, что предлагали за 5 лет, то получится вот такой C++ код:\r\n```cpp\r\nwhile (foo ~~ { @... }) {\r\n return {} unless foo != bar;\r\n foo += $&;\r\n} else {\r\n static decltype(return) var;\r\n var += @ + ...;\r\n ++ g{hello}{word}[1:var:max];\r\n if (\"hello\":var)\r\n {};\r\n var;\r\n}\r\n{} \r\n```\r\nЧто тут происходит - не разобрать.\r\n\r\n\r\n**Александр Коновалов, 26 сентября 2018, 8:56**\r\nЕщё один минус данного решения:\r\n\r\nПредполагается, что данный код упростит поиск в контейнерах элемента. Для std::map и std::unordered_map элементом является std::pair. Т.е. в рамках данного синтаксиса получается:\r\n```cpp\r\nif (std::make_pair(\"key\", \"value\") : my_map)\r\n // ...\r\n```\r\nЭто выглядит довольно странным и бесполезным.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810408891/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810409769", + "html_url": "https://github.com/cpp-ru/ideas/issues/327#issuecomment-810409769", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/327", + "id": 810409769, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQwOTc2OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T16:38:10Z", + "updated_at": "2021-03-30T16:38:10Z", + "author_association": "MEMBER", + "body": "**Саша Зайцев, 20 июля 2018, 0:36**\r\nЛично я не совсем понял, что предалагется в данной идее. Можно подробнее?\r\n\r\n\r\n**neondev9, 30 июля 2018, 14:58**\r\nМакросы не всем нравятся и в современном С++ они попросту не нужны. То, что макросы плюют на пространства имён - сильно мешает и раздражает. \r\n\r\nХотелось бы иметь возможность включать в свой код сторонний код, но не включать при этом макросы и не засорять глобальное пространство имён.\r\n\r\n\r\n**WPMGPRoSToTeMa, 1 августа 2018, 0:48**\r\nneondev9, я бы не сказал, что не нужны, применения есть и боюсь, что не все закрываются рефлекшенем и constexpr!.\r\n\r\n\r\n**Fihtangolz, 6 августа 2018, 6:17**\r\nneondev9, не все проблемы решаются без макросов, к примеру нет сегодня возможностей делать cod injection, есть предложения сатера, но оно еще не работает. Нельзя просто так взять и подменить что то в тексте программы, опять же потому что нет к примеру constexpr блоков, но даже они не позволяют работать со многими штуками что позволяют макросы. Есть легаси, с легаси надо работать, так как его много макросы еще долго будут в языке, я даже думаю что еще лет 20 точно. Так что лучше сейчас дать возможность решать проблему которая уже давно сочится и даже в стандартной библиотеке \r\n\r\n\r\n**yndx-antoshkka, 6 августа 2018, 11:49**\r\nFihtangolz, лучше решать имеющуюся проблему правильно, чем быстро. Поэтому комитет врядли согласится распылять свои силы на макросы, когда уже понемногу ведётся работа над рефлексией и кодогенерацией.\r\n\r\n\r\n**Fihtangolz, 11 августа 2018, 4:06**\r\nyndx-antoshkka, ну я не знаю где смотреть что и как и где в комитете, для меня это загадочная структура, я видел прупозлы и на этом все. К вопросу о том, будет ли лучше добавить новых фитч и ждать пока макросы отклеятся, а как я понял из переписки в телеге это гдет еще лет 8 тока до введения фитч, потом еще лет 5 пока перепишут буст, qt и все переползут и все это время макросы будут работать в языке ровно так как работают. Спорный момент о том что лучше, но комитету думаю видней ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810409769/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810411839", + "html_url": "https://github.com/cpp-ru/ideas/issues/328#issuecomment-810411839", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/328", + "id": 810411839, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQxMTgzOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T16:41:16Z", + "updated_at": "2021-03-30T16:41:16Z", + "author_association": "MEMBER", + "body": "А это имеет смысл? Вроде бы NTP синхронизует системное время, и `std::chrono::system_clock` как раз подвержен этим синхронизациям", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810411839/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810412910", + "html_url": "https://github.com/cpp-ru/ideas/issues/329#issuecomment-810412910", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/329", + "id": 810412910, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQxMjkxMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T16:42:52Z", + "updated_at": "2021-03-30T16:42:52Z", + "author_association": "MEMBER", + "body": "**Игорь Шаповал, 20 июля 2018, 8:45**\r\nМне очень нравиться идея. Было классно, если еще можно было бы перегружать эти операторы.\r\n\r\n\r\n**Айдар Фаттахов, 30 июля 2018, 18:22**\r\nКакая семантика? будет ли вычислена правая часть?\r\n\r\n\r\n**WPMGPRoSToTeMa, 1 августа 2018, 0:42**\r\nasschool, a &&= b должно быть эквивалентно a = a && b, за исключением возможной перегрузки.\r\n\r\n\r\n**Oleg Anikin, 5 августа 2018, 21:28**\r\nВ приведенном примере можно использовать алгоритмы std::all_of, для ||= - std::any_of.\r\nhttps://en.cppreference.com/w/cpp/algorithm/all_any_none_of\r\n\r\n\r\n**Дмитрий Цителов, 14 августа 2018, 20:46**\r\nПолагаю, начальное значение systemIsOk должно было быть true, иначе пример какой-то бессмысленный. А так идея хорошая.\r\n\r\n\r\n**Yuri Pechatnov, 20 августа 2018, 12:29**\r\nА чем |=, &= не устраивают? Тем, что явно к bool кастовать надо? Хотя вообще предложение хорошее, хотя бы для замкнутости", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810412910/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810414169", + "html_url": "https://github.com/cpp-ru/ideas/issues/330#issuecomment-810414169", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/330", + "id": 810414169, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQxNDE2OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T16:44:45Z", + "updated_at": "2021-03-30T16:44:45Z", + "author_association": "MEMBER", + "body": "**Николай, 20 июля 2018, 20:37**\r\nПродублирую текст здесь:\r\n\r\n \r\n\r\nКоллеги, предлагаю для чистых-constexpr функций, вместо constexpr! просто пометить аргументы функции спецификатором constexpr. Кроме этого, если пометить лишь несколько аргументов, то это будет означать, что компилятору стоит ожидать вызова этой функции с уже готовой constexpr-переменной.\r\n\r\n\r\n**yndx-antoshkka, 23 июля 2018, 10:57**\r\nnerikhman, разработчики компиляторов говорят что в этоv случае у них возникает серьёзная проблема на ряде имплементаций.\r\n\r\nНу и кроме того\r\n```cpp\r\nconstexpr! int foo(int a, int b, int c) { /*...*/ }\r\n```\r\nкороче чем\r\n```cpp\r\nint foo(constexpr int a, constexpr int b, constexpr int c) { /*...*/ }\r\n```\r\n\r\n**Айдар Фаттахов, 30 июля 2018, 18:21**\r\nnerikhman, сейчас нельзя написать функцию (compiletime nonprimitive a, runtime b) -> c (констекспр параметры нужны только для этого), возможно ослабление ограничений параметров шаблона после введения оператора<=> улучшит ситуацию, если это реально когда-нибудь будет\r\n\r\n\r\n**Андрей Руссков, 4 августа 2018, 1:45**\r\nyndx-antoshkka, зато появилась бы возможность внедрять перегрузки по вычислимости в compile-time\r\n\r\n\r\n**Andrey, 6 августа 2018, 22:38**\r\nasschool, ослабление ограничений параметров шаблона принято в C++20, что уже позволяет писать удивительный код:\r\n```cpp\r\n#include \r\n\r\ntemplate int i;\r\n\r\nusing namespace std::chrono_literals;\r\n\r\nstatic_assert(1min == 60s);\r\nstatic_assert(&i<1min> != &i<60s>);\r\n```\r\nДобавим сюда constexpr function parameters:\r\n```cpp\r\nconstexpr int * ptr(constexr auto)\r\n{\r\n static int result = 0;\r\n return &result;\r\n}\r\n\r\nstatic_assert(ptr(1) != ptr(2)) // поскольку это разные инстанциации\r\n // неявно шаблонной функции ptr\r\n\r\nstatic_assert(1min == 60s);\r\nstatic_assert(ptr(1min) != ptr(60s)); // constexpr функция от равных аргументов\r\n // возвращает разные значения,\r\n // как тебе такое Элон Маск?\r\n```\r\n\r\n**Andrey, 23 июля 2018, 8:14**\r\nВы, наверное, знаете, что contsexpr параметры это отдельная и несколько более сложная (по сравнению с constexpr!) идея? Proposal на constexpr parameters тоже есть, но достичь консенсуса по этой теме не удается. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810414169/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810415475", + "html_url": "https://github.com/cpp-ru/ideas/issues/330#issuecomment-810415475", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/330", + "id": 810415475, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQxNTQ3NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T16:46:54Z", + "updated_at": "2021-03-30T16:46:54Z", + "author_association": "MEMBER", + "body": "Предложение https://wg21.link/P1045 не очень понравилось разработчикам компиляторов, но автор продолжает над ним работу", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810415475/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810417620", + "html_url": "https://github.com/cpp-ru/ideas/issues/331#issuecomment-810417620", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/331", + "id": 810417620, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQxNzYyMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T16:50:06Z", + "updated_at": "2021-03-30T16:50:06Z", + "author_association": "MEMBER", + "body": "**Andrey, 23 июля 2018, 13:55**\r\nВ C++17 Ваш пример класcа `student` совершенно валидный, так что все что Вы хотите разрешено уже сейчас.\r\n\r\n\r\n**Игорь Шаповал, 23 июля 2018, 14:31**\r\nПри добавлении к полям класса атрибутов setter/getter компилятор сгенерирует методы установки и считывания. Нам не надо писать самому.\r\n\r\n\r\n**dreverser, 24 июля 2018, 13:05**\r\nИгорь Шаповал, зачем геттеры и сеттеры ? сделайте поля паблик\r\n\r\nв гугле можно найти много споров на эту тему, но я так же согласен с тем что пустые геттеры и сеттеры не нужны\r\n\r\n\r\n**yndx-antoshkka, 23 июля 2018, 15:46**\r\nНачиная с C++17 можно писать любые свои атрибуты, но вот навесить на них функционал просто так не получится.\r\n\r\nСейчас идёт активная работа над рефлексией и кодогенерацией в C++. Как только работа завершится и попадёт в стандарт - можно будет наделять атрибуты каким-то занчением и действительно делать getter/setter. А до тех пор - придётся ждать :(\r\n\r\n\r\n**Саша Зайцев, 23 июля 2018, 17:16**\r\nyndx-antoshkka, как вариант для своего функционала советую написать свои плагины для Clang-Tidy, который будет опираться на кастомные атрибуты.\r\n\r\n\r\n**Fihtangolz, 3 августа 2018, 3:44**\r\nyndx-antoshkka, а шо слышно, есть инфа по метаклассам?, прупозал по текушей рефлексии отклонили?, добавят ли cod injection в constexpr блоки и будут ли они.\r\n\r\n\r\n**yndx-antoshkka, 6 августа 2018, 11:46**\r\nВсё будет, но не в C++20. Я немного обмолвился об этом вот тут\r\n\r\n\r\n**Айдар Фаттахов, 30 июля 2018, 18:17**\r\nНужны метаклассы а не вот это вот", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810417620/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810433792", + "html_url": "https://github.com/cpp-ru/ideas/issues/332#issuecomment-810433792", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/332", + "id": 810433792, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQzMzc5Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T17:14:33Z", + "updated_at": "2021-03-30T17:14:33Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 23 июля 2018, 14:05**\r\nУ GCC есть близкий механизм https://gcc.gnu.org/wiki/FunctionMultiVersioning\r\n\r\nОн вам подходит, или требуется что-то ещё?\r\n\r\n\r\n**Саша Зайцев, 23 июля 2018, 17:17**\r\nyndx-antoshkka, ты сам ответил на свой вопрос - он только у GCC :-)\r\n\r\n\r\n**ilnurkh, 23 июля 2018, 20:19**\r\nyndx-antoshkka, gcc only не подходит\r\n\r\nтакже его механизм выглядит не достаточно гибким, требуя наличие тега под каждый таргет\r\n\r\n\r\n**Андрей Руссков, 31 июля 2018, 18:02**\r\nчтобы не тащить в стандарт все архитектуры и наборы команд, подобный функционал можно сделать аттрибутами (как у gcc, то, что кидал Антон), либо через функции аля bool cpu_supports(string_view) / bool cpu_target_is(string_view) / ...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810433792/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810435181", + "html_url": "https://github.com/cpp-ru/ideas/issues/333#issuecomment-810435181", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/333", + "id": 810435181, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQzNTE4MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T17:16:37Z", + "updated_at": "2021-03-30T17:16:37Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 26 июля 2018, 15:27**\r\nЕщё надо добавить для guardов.\r\n\r\nНадо будет писать proposal. Готовы? Есть желающие?\r\n\r\n\r\n**Andrey, 26 июля 2018, 15:33**\r\nyndx-antoshkka, для guard'ов нельзя, есть желающие программировать в таком стиле: \r\n```cpp\r\nclass MyThreadSafeClass {\r\n std::mutex mutex_;\r\n\r\npublic:\r\n std::unique_lock do_something_under_lock()\r\n {\r\n std::unique_lock lock(mutex_);\r\n do_something();\r\n return lock;\r\n }\r\n \r\n void do_other_thing();\r\n};\r\n\r\nvoid use1(MyThreadSafeClass x)\r\n{\r\n auto lock = x.do_something_under_lock();\r\n x.do_other_thing();\r\n}\r\n\r\nvoid use2(MyThreadSafeClass x)\r\n{\r\n x.do_something_under_lock(); // lock is discarded, but it's not an error\r\n}\r\n```\r\n\r\n**yndx-antoshkka, 26 июля 2018, 16:14**\r\nAndrey, я имел в виду только метод release() для всех guard\r\n\r\n\r\n**Andrey, 26 июля 2018, 17:02**\r\nyndx-antoshkka, понял, то есть, получается речь идет только об unique_lock::release(), больше, в стандартной библиотеке пока нет guard'ов с методом release()?\r\n\r\n\r\n**Andrey, 26 июля 2018, 15:29**\r\nИдея была рассмотрена тут: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0600r1.pdf но отвергнута.\r\n\r\n\r\n**yndx-antoshkka, 26 июля 2018, 16:15**\r\nAndrey, идея была принята в том виде что изложено в бумаге. Но ни в бумаге, ни при обсуждении речь не заходила о методах release().\r\n\r\nТак что надо писать новую бумагу, на добавлние [[nodiscard]] к release() методам умных указателей и guardов\r\n\r\n\r\n**Andrey, 26 июля 2018, 16:49**\r\nyndx-antoshkka, в бумаге сказано про unique_ptr::release(), что к нему добавлять [[nodiscard]] не предлагается, потому что в Google в 3.5% результат unique_ptr::release() дискардится но это все не баги.\r\n\r\n\r\n**yndx-antoshkka, 26 июля 2018, 17:17**\r\nAndrey, и правда, этот момент я проглядел. Спасибо!\r\n\r\nТогда бессмысленно в ближайшее время опять поднимать этот вопрос.\r\n\r\n\r\n**Саша Зайцев, 27 июля 2018, 23:15**\r\nyndx-antoshkka, сложно будет пробить, если есть примеры на кодовой базе. Вот если бы были доказательства обратного... то тогда было бы легче. Можно было бы сделать по аналогии с исследованием о привнесении багов при изменении if(a < b < c)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810435181/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810437069", + "html_url": "https://github.com/cpp-ru/ideas/issues/334#issuecomment-810437069", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/334", + "id": 810437069, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQzNzA2OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T17:19:36Z", + "updated_at": "2021-03-30T17:19:36Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 27 июля 2018, 11:53**\r\nОбычно, в стандарт языка не добавляют описание оптимизаций, т.к. это связывает руки разработчикам компиляторов и заставляет их делать подобные оптимизации там, где им это делать не хотелось бы (например на -O0).\r\n\r\nЕсли вы хотите за это взяться, то учтите, что вам придётся описать поведение оптимизации в constexpr контексте, описать scopeы переменных на случай исключения и тщательно описать саму трансформацию (когда происходит, как трансформирует, как влияет на области видимости, как влияет на инстанциацию шаблонных функций и т.п.)\r\n\r\n\r\n**Nate Reinar Windwood, 8 августа 2018, 21:58**\r\nyndx-antoshkka, а можно упомянуть в стандарте наличие как минимум двух уровней оптимизации, и при нулевом не требовать оптимизаций?\r\n\r\nОкей, кажется, я пока не готов за это взяться :-/\r\n\r\n\r\n**Andrey, 27 июля 2018, 12:31**\r\nСейчас эта оптимизация выполняется только когда результат функции вовзращается через регистр (по крайней мере так в GCC), что в соответсвии с ABI возможно только для trivially copyable типов маленького размера. Соответственно, чтобы сделать эту оптимизацию обязательной, надо как минимум зафиксировать, когда результат функции вовзращается через регистр, что сделать очень сложно (у всех разный ABI, calling convention, ...).\r\n\r\n\r\n**Саша Зайцев, 27 июля 2018, 23:13**\r\nЛично я против стандартизации оптимизаций. Потому что:\r\n1) Зачем?\r\n\r\n2) А может компилятор не всегда хочет делать данную оптимизацию? Как тогда выкручиваться? Грубо говоря, только мешать будем компилятору\r\n\r\n3) Ввод в Стандарт оптимизаций - штука неоднозначная. Потому что непонятно, что стоит туда пихать, а что нет. Гарантированный inline, девиртуализация в тривиальных кейсах, векторизация, разворачивание циклов и много чего ещё - когда стоит остановиться?\r\n\r\n\r\n**Nate Reinar Windwood, 8 августа 2018, 22:09**\r\nСаша Зайцев, \r\n\r\n1. В данном случае — чтобы можно было писать в функциональном стиле и не бояться, что это будет супермедленно. Да и вообще в целом чтобы не думать о компиляторе и полагаться только на то, что гарантировано стандартом.\r\n\r\n2. А можно упомянуть в стандарте наличие как минимум двух уровней оптимизации, и при нулевом не требовать оптимизаций?\r\n\r\n3. Ну, во-первых, TCO в зависимости от стиля программирования может превратить нерабочую программу в оптимальную, так что это довольно критичная оптимизация. А во-вторых, зачем останавливаться? Это же хорошо — меньше полагаться на конкретный компилятор и больше — на стандарт.\r\n\r\n\r\n**Саша Зайцев, 8 августа 2018, 22:19**\r\nNate Reinar Windwood, \r\n1) Не хотите бояться супермедленности - пишите в нормальном стиле. Хотите функционально - верьте компилятору и надейтесь.\r\n2) В Сатндарте не упоминают никакие уровни оптимизации, так как это вообще Стандарта языка не касается\r\n3) Конечно может. А оптимизации в Стандарте не описывают, потому что очень сложно описать сами оптимизации. Просто подумайте, как вы опишите разворачивание циклов, векторизацию? А у нас много целевых платформ, и на разных платформах разные оптимизации могут иметь разную эффективность, а некоторые вообще работать не будут.\r\n\r\n\r\n**Nate Reinar Windwood, 12 декабря 2018, 23:09**\r\nСаша Зайцев,\r\n\r\n1. А почему функциональный стиль вдруг стал ненормальный, учитывая, что C++ мультипарадигменный язык и сейчас довольно сильно в сторону функциональщины развивается?\r\n\r\n\r\n**Саша Зайцев, 31 июля 2018, 15:39**\r\nhttps://groups.google.com/a/isocpp.org/forum/?fromgroups#!topic/std-proposals/gCJ1qXLm-dQ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810437069/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810438587", + "html_url": "https://github.com/cpp-ru/ideas/issues/335#issuecomment-810438587", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/335", + "id": 810438587, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQzODU4Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T17:21:54Z", + "updated_at": "2021-03-30T17:21:54Z", + "author_association": "MEMBER", + "body": "**Саша Зайцев, 1 августа 2018, 13:03**\r\nhttps://en.cppreference.com/w/cpp/types/integer\r\n\r\nВас не устроят fast версии типов?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810438587/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810440205", + "html_url": "https://github.com/cpp-ru/ideas/issues/336#issuecomment-810440205", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/336", + "id": 810440205, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQ0MDIwNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T17:24:33Z", + "updated_at": "2021-03-30T17:24:33Z", + "author_association": "MEMBER", + "body": "**Иван, 5 августа 2018, 16:07**\r\nИнтересно, в c++ ведь нет встроенных динамических массивов, их приходится реализовывать вручную, на указателях, с ручным управлением памятью. Чтобы сделать это оптимально, нужен этот самый restrict и realloc (Возможность realloc #28). В Си restrict ввели еще в C99. И я так понимаю, есть весомые причины, из-за которых они до сих пор не в стандарте C++?\r\n\r\n\r\n**yndx-antoshkka, 6 августа 2018, 11:47**\r\nИван, но зачем это всё писать самому, если есть std::vector?\r\n\r\n\r\n**Иван, 8 августа 2018, 21:04**\r\nyndx-antoshkka, std::vector, если я не ошибаюсь, при вставке в начало и в конец при capacity == size, и при освобождении памяти с начала и с конца, всегда производит переаллокацию. Т.е. работает с памятью очень неэффективно. STL мне впринципе не достаточно...\r\n\r\n\r\n**yndx-antoshkka, 6 августа 2018, 11:57**\r\nРабота над этой идеей велась и даже были предложения http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3988.pdf\r\n\r\nПоследние пару лет работа затихла, люди занимавшиеся проработкой идеи отвлеклись на рефлексию и constexpr.\r\n\r\nЕсли чувствуете в себе силы - посмотрите предложение, постарайтесь его улучшить, и попробуем поторопить события.\r\n\r\n\r\n**Саша Зайцев, 7 августа 2018, 0:32**\r\nyndx-antoshkka, я совсем недавно спрашивал на std-proposals о судьбе пропозала - пока что тишина. И на самом деле там довольно много открытых вопросов по поводу restrict. Кому интересно - просто почитайте полностью самый последний на текущий момент proposal по данной теме.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810440205/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810441267", + "html_url": "https://github.com/cpp-ru/ideas/issues/337#issuecomment-810441267", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/337", + "id": 810441267, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQ0MTI2Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T17:26:14Z", + "updated_at": "2021-03-30T17:26:14Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 6 августа 2018, 13:05**\r\nДанный noexcept в сигнатуре особо компилятору ничем не поможет:\r\n\r\noperator()(ArgTypes...) const по прежнему может кидать исключение, в случае пустого std::function.\r\n\r\nМожно добавить\r\n\r\ntemplate\r\nclass function : public function {\r\n using std::function::function;\r\n};\r\n\r\nдля того, чтобы просто компилировался std::function. Такой вариант устроит, или хочется чего-то большего?\r\n\r\n\r\n**Yuriy Chernyshov, 6 августа 2018, 14:44**\r\nyndx-antoshkka, хочется дать понять клиенту, что функция не должна кидать исключений (например потому, что мы собираемся вызвать её в деструкторе — см. паттерн scoped_guard).\r\n\r\nПомощь компилятору — дело десятое.\r\n\r\n \r\n\r\n \r\n\r\n\r\n**Andrey, 6 августа 2018, 22:20**\r\nyndx-antoshkka, в этом случае можно убрать шаблонный параметр B, оставив\r\n```cpp\r\ntemplate\r\nclass function : public function {\r\n using function::function;\r\n};\r\n```\r\n`void () noexcept(false)` и `void ()` это один и тот же тип.\r\n\r\n\r\n**Andrey, 6 августа 2018, 22:25**\r\nYuriy Chernyshov, я правильно понял Вашу идею, что если сейчас на конструктор template function( F f ); накладывается ограничение \"This constructor does not participate in overload resolution unless f is Callable for argument types Args... and return type R\" то от конструктора function нужно требовать, чтобы его параметр был NothrowCallable?\r\n\r\n\r\n**Айдар Фаттахов, 8 августа 2018, 19:13**\r\nYuriy Chernyshov, для этого просто не подходит std::function\r\n\r\n\r\n**Yuriy Chernyshov, 23 августа 2018, 22:44**\r\nasschool, почему?\r\n\r\n\r\n**yndx-antoshkka, 21 августа 2018, 15:38**\r\nРешить по быстрому не получается, отложил на потом.\r\n\r\n\r\n**yndx-antoshkka, 28 февраля 2019, 12:19**\r\nЕсть предложение http://wg21.link/p0045 которое это чинит", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810441267/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810443639", + "html_url": "https://github.com/cpp-ru/ideas/issues/338#issuecomment-810443639", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/338", + "id": 810443639, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQ0MzYzOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T17:30:04Z", + "updated_at": "2021-03-30T17:30:04Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 6 августа 2018, 12:05**\r\nТакой код будет очень неудобно читать, т.к. имена параметров функций будут находиться в другом файле.\r\n\r\nЕщё неудобнее будет рефакторить подобный код - если разработчик А в своём проекте изменит имена параметров функции базового класса, то сломается сборка вашего проекта, о котором человек А даже ничего не знает.\r\n\r\nЕщё есть опасение, что подобный синтаксис может поломать существующий код. Если у кого-то в проекте есть класс с именем override, то запись override funcName {} перестанет быть объявлением переменной... ну или придётся долго и мучительно прорабатывать такие правила, чтобы код и не ломался, и предложенный функционал работал.\r\n\r\n\r\n**Fihtangolz, 11 августа 2018, 4:00**\r\nyndx-antoshkka, да я уже после публикации через минут 10 понял что хреновая идея, но нельзя так просто взять и отозвать предложение. Поэтому пусть будет. Хочеться меньше писать, но не выйдет пока нет zero const этого делать, ну исключая конечно шаблоны", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810443639/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810451306", + "html_url": "https://github.com/cpp-ru/ideas/issues/339#issuecomment-810451306", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/339", + "id": 810451306, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQ1MTMwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T17:41:54Z", + "updated_at": "2021-03-30T17:41:54Z", + "author_association": "MEMBER", + "body": "**Sasha Sitnikov, 7 августа 2018, 17:37**\r\n```cpp\r\n\tcase 2:\r\n\t\tresult = (name);\r\n```\r\nКак это должно работать? name типа string, а result - int.\r\n\r\n\r\n**Игорь Шаповал, 7 августа 2018, 17:50**\r\nСори, переменная result должна быть типа decltype(auto)\r\n\r\ndecltype(auto) result;\r\n\r\n\r\n**Sasha Sitnikov, 7 августа 2018, 19:16**\r\nИгорь Шаповал, то есть, за одно добавить еще и deferred type deduction? Это само по себе не маленькое изменение\r\n\r\n\r\n**Andrey, 7 августа 2018, 22:53**\r\nif отличается от switch тем, что его ветки then, else взаимоисключающие -- компилируется всегда ровно одна из них. switch же не обладает такой стройной структурой -- технически его тело вообще не имеет структуры (разбиения на ветки) -- это просто compound statement в некоторых местах которого расставлены labels. Поэтому неясно, должны ли какие-то части тела constexpr switch исключаться из компиляции, если да -- то по каким правилам, если нет -- то даже Ваш пример с `get` не скомпилируется -- так как функция будет иметь несколько return statement с аргументами разного типа.\r\n\r\n\r\n**Игорь Шаповал, 8 августа 2018, 9:13**\r\nПример с get() работает. Использовал structured bindings в проекте для класса.\r\n\r\n\r\n**Andrey, 8 августа 2018, 11:28**\r\nИгорь Шаповал, Вы имеете в виду если использовать constexpr if? Да работает, потому что неподходящие ветки просто отбрасываются компилятором. Я писал про то, что это же придется как-то делать с constexpr switch, но его тело не делится четке на ветки.\r\n\r\n\r\n**Игорь Шаповал, 8 августа 2018, 12:51**\r\nНо согласитесь было бы классно иметь такую фичу в языке. \r\n\r\n\r\n**dreverser, 9 августа 2018, 8:01**\r\nчто уж там, давате сделаем весь С++ constexpr-ом\r\n\r\n \r\n\r\n\r\n**Саша Зайцев, 9 августа 2018, 15:15**\r\ndreverser, вот Вы смеётесь, а всё ведь к этому и идёт...\r\n\r\n\r\n**yndx-antoshkka, 9 августа 2018, 16:24**\r\n> что уж там, давате сделаем весь С++ constexpr-ом\r\n\r\nМы работаем над этим :)\r\n\r\n\r\n**dreverser, 9 августа 2018, 22:49**\r\nтак я и говорю, бросайте по 1/100 языка втягивать в constexpr\r\n\r\nдайте установку дядкам сразу, к такому то стандарту весь С++ будет constexpr\r\n\r\n\r\n**yndx-antoshkka, 10 августа 2018, 14:04**\r\nСлона надо есть по кускам, иначе он не помещается в рот... Сделать одним махом всё constexpr не получится - подобное предложение будет перевариваться в комитете десятилетия.\r\n\r\n\r\n**Игорь Шаповал, 10 августа 2018, 16:12**\r\nyndx-antoshkka Скажите, может такая фича быть в С++next как switch constexpr\r\n\r\n\r\n**yndx-antoshkka, 10 августа 2018, 16:42**\r\nКажется её уже предлагали (вместе с for constexpr), но отправили на доработку. Скорее всего где-то в районе C++23 появится", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810451306/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810452488", + "html_url": "https://github.com/cpp-ru/ideas/issues/339#issuecomment-810452488", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/339", + "id": 810452488, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDQ1MjQ4OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-30T17:43:43Z", + "updated_at": "2021-03-30T17:43:43Z", + "author_association": "MEMBER", + "body": "Работа над идеей идёт в https://wg21.link/p1371\r\nМы можем помочь разве что советом", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810452488/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810854921", + "html_url": "https://github.com/cpp-ru/ideas/issues/340#issuecomment-810854921", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/340", + "id": 810854921, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg1NDkyMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T07:48:26Z", + "updated_at": "2021-03-31T07:48:26Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 13 августа 2018, 22:56**\r\nС __func__ конечно ли выгорит, вендоры его менять не будут, чтобы не ломать обратную совместимость. А идея с __class__, кажется очень интересной.\r\n\r\n1. Тут https://groups.google.com/a/isocpp.org/d/topic/std-proposals/1v1al0enOC4/discussion обсуждение макроса __CLASS__.\r\n\r\n2. Как эта переменная (если это static поле класса) должно взаимодействовать с лямбдами -- игнорировать их или возвращать какое-то implementation defined имя внутри лямбды? Если второе, то в каких местах __class__ должен ссылаться на лямбду а в каких на внешний класс?\r\n```cpp\r\n[_name = тут?] (const char * name = тут?) noexcept(тут?) { или только тут? };\r\n```\r\n\r\n3. Что делать с friend-функциями.\r\n```cpp\r\nclass X {\r\n friend void foo(X) {\r\n auto s = __class__; // кажется, s == \"X\";\r\n }\r\n};\r\n```\r\nВынесем определение функции foo из класса:\r\n```cpp\r\nclass X {\r\n friend void foo(X);\r\n};\r\n\r\nvoid foo(X) {\r\n auto s = __class__; а тут?\r\n}\r\n```\r\n4. Сразу же надо рассмотреть добавление метода source_location::class_name(). Может быть, только он и нужен.\r\n\r\nПлюс того, чтобы определить static поле __class__ и определить source_location::class_name() через него в том, что у нас есть строгие правила lookup'а, и спорные вопросы, вроде того, должен ли в этом коде\r\n```cpp\r\nclass Derived : Base<__class__> {};\r\n```\r\n__class__ указывать на Derived::__class__ решается автоматически: нет не должен, в base specifiers мемберы класса Derived не видны.\r\n\r\nСубъективным, минусом такого подхода, является то, что полю __class__ можно будет явно доступаться:\r\n```cpp\r\nstruct X {};\r\n\r\nauto s = X::__class__; // мы точно этого хотим? в комитете по стандартизации могут сказать, что это надо \"дружить\" с Reflection TS.\r\n```\r\n\r\n**yndx-antoshkka, 21 августа 2018, 15:36**\r\n\r\nУ большинства компиляторов есть возможность выводить больше информации чем при использовании __func__ (см BOOST_CURRENT_FUNCTION). Так же готовятся к включению в C++ std::source_location . Уж лучше добавлять в него информацию, чем плодить новые волшебные переменные.\r\nИтого: я за, если в std::source_location добавить новую функцию, для получения полного имя функции.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810854921/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810860066", + "html_url": "https://github.com/cpp-ru/ideas/issues/340#issuecomment-810860066", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/340", + "id": 810860066, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg2MDA2Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T07:56:00Z", + "updated_at": "2021-03-31T07:58:02Z", + "author_association": "MEMBER", + "body": "GCC выводит полное имя, вместе с именем класса https://godbolt.org/z/r6nPjxfvc но стандарт не обязывает так делать http://eel.is/c++draft/support.srcloc.cons\r\n\r\nПослежу за другими компиляторами, заведу багрепорты если будет другое поведение", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810860066/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810862036", + "html_url": "https://github.com/cpp-ru/ideas/issues/341#issuecomment-810862036", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/341", + "id": 810862036, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg2MjAzNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T07:59:07Z", + "updated_at": "2021-03-31T07:59:07Z", + "author_association": "MEMBER", + "body": "**Игорь Шаповал, 28 августа 2018, 13:03**\r\nyndx-antoshkka Скажите планируется удалять std::assert или нет? Мне кажется это разумно.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810862036/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810862655", + "html_url": "https://github.com/cpp-ru/ideas/issues/341#issuecomment-810862655", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/341", + "id": 810862655, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg2MjY1NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:00:06Z", + "updated_at": "2021-03-31T08:00:06Z", + "author_association": "MEMBER", + "body": "Не планируется. Макрос очень популярный, подобное дулаение сломает множество кодовых баз. Ну и контракты не попали в C++20, так что замены этому макросу нет", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810862655/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810863853", + "html_url": "https://github.com/cpp-ru/ideas/issues/342#issuecomment-810863853", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/342", + "id": 810863853, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg2Mzg1Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:01:53Z", + "updated_at": "2021-03-31T08:01:53Z", + "author_association": "MEMBER", + "body": "**Игорь Шаповал, 28 августа 2018, 9:09**\r\nyndx-antoshkka Скажите может эта фича быть в стандарте?\r\n\r\n\r\n**valera_ee, 31 июля 2019, 9:02**\r\nБыло бы совсем хорошо, если бы можно было указывать через запятую разные значения в case\r\n```cpp\r\nswitch (value) \r\n{\r\n case: 0, 7, 11:\r\n std::cout << \"state 1\";\r\n break;\r\n\r\n case: 1 ... 5, 8:\r\n std::cout << \"state 2\";\r\n break;\r\n\r\n default:\r\n std::cout << \"default state\";\r\n break;\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810863853/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810864845", + "html_url": "https://github.com/cpp-ru/ideas/issues/342#issuecomment-810864845", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/342", + "id": 810864845, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg2NDg0NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:03:29Z", + "updated_at": "2021-03-31T08:03:29Z", + "author_association": "MEMBER", + "body": "Идея про паттерн матчинг, дубликат #239 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810864845/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810865713", + "html_url": "https://github.com/cpp-ru/ideas/issues/343#issuecomment-810865713", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/343", + "id": 810865713, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg2NTcxMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:04:48Z", + "updated_at": "2021-03-31T08:04:48Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 21 августа 2018, 15:40**\r\nВыглядит страшненько...\r\n\r\n\r\n**Айдар Фаттахов, 24 августа 2018, 19:12**\r\nВ этом случае можно даже разрешить пустые литералы NTime::\"FOOBAR\".\r\nАргумент против: в этом случае лучше вызывать конструктор или фабрику\r\n\r\n\r\n**smertigdon, 26 августа 2018, 10:34**\r\nЛогичнее ввести unusing namespace, но с введением модулей проблема должна в принципе пропасть, так что нет смысла ее чинить\r\n\r\n\r\n**Андрей Руссков, 28 сентября 2018, 0:22**\r\nнеобязательно писать using namespace в шапке файла, можно указывать в начале функции, использующей литерал:\r\n```cpp\r\nauto foo() {\r\n using namespace bar;\r\n return \"abc\"_def;\r\n}\r\n```\r\nНу или using bar::operator \"\"_def;", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810865713/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810866772", + "html_url": "https://github.com/cpp-ru/ideas/issues/344#issuecomment-810866772", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/344", + "id": 810866772, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg2Njc3Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:06:33Z", + "updated_at": "2021-03-31T08:06:51Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 27 августа 2018, 11:27**\r\nСтоит обратить внимание на граничные случаи. Как вести себя если пользователь использует один из адаптеров со своим контейнером, у которого нет clear(). Запрещать вызывать clear() для адаптера на этапе компиляции, или реализоввывать его в этом случае через\r\n```cpp\r\nwhile ( !q.emty() ) {\r\n q.pop();\r\n}\r\n```\r\n?\r\n\r\n\r\n**Osmironov, 27 августа 2018, 20:09**\r\nyndx-antoshkka, ну более медленного варианта чем\r\n```cpp\r\nwhile ( !q.emty() ) {\r\n q.pop();\r\n}\r\n```\r\n\r\nсложно придумать. В то же время, вызов clrear() нижнего уровня значительно ускорит процесс. Хуже точно не должно стать.\r\n\r\n\r\n**yndx-antoshkka, 31 августа 2018, 13:49**\r\nOsmironov, вообще можно реализовать fallback более разумно:\r\n```cpp\r\nvoid clear() {\r\n\r\n if constexpr (__has_memeber_clear(Container) ) {\r\n\r\n c.clear();\r\n\r\n } else {\r\n\r\n c = Container();\r\n\r\n }\r\n}\r\n```\r\nПопробуйте написать черновик предложения, следуя инструкции https://stdcpp.ru/podgotovka-predlozheniya-v-standart-c-instruktsiya . Шероховатости подправим.\r\n\r\n\r\n**Osmironov, 31 августа 2018, 19:30**\r\nyndx-antoshkka, Хорошо, посмотрю что смогу сделать\r\n\r\n\r\n**Андрей Руссков, 28 сентября 2018, 0:26**\r\nyndx-antoshkka, а если для моего контейнера деструктор будет выполнять\r\n```cpp\r\nfor (; !queue.empty(); queue.pop());\r\n```\r\nи освобождать память, а конструктор пустого контейнера - выделять память?\r\n\r\n\r\n**Anton Bikineev, 27 августа 2018, 15:46**\r\nЭто частный случае более общей проблемы доставания underlying контейнера из адаптера. Две распространенных практики в этом случае:\r\n\r\n1) не использовать адаптер вообще :)\r\n\r\n2) наследоваться от него. Я подозреваю, поэтому он и был сделан как protected член.\r\n\r\nКасательно clear, мне нравится ответ отсюда: \"since the \"abstract\" spec of the corresponding data structure (from some book on abstract algorithms and data structures) does not include operation clear for canonical priority queues or stacks, it is not provided in the adaptor.\"\r\n\r\nМожно подобрать набор юзкейзов из практической жизни и написать пропозал, убедив комитет в необходимости расширить минимальный интерфейс адаптеров.\r\n\r\n\r\n**Саша Зайцев, 27 августа 2018, 23:33**\r\nAnton Bikineev, честно говоря, звучит как слабая отговорочка. Лично мне бы хотелось иметь методы clear() у std::queue и подобных\r\n\r\n\r\n**neondev9, 16 ноября 2018, 16:44**\r\nЕще бы reserve не помешал бы.\r\n\r\nВсе равно выбор контейнера ограничен std::vector и std::deque", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810866772/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810867852", + "html_url": "https://github.com/cpp-ru/ideas/issues/344#issuecomment-810867852", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/344", + "id": 810867852, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg2Nzg1Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:08:14Z", + "updated_at": "2021-03-31T08:08:14Z", + "author_association": "MEMBER", + "body": "Похожая идея в #61 , но там меньше описание, так что закрою #61 как дубликат.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810867852/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810868512", + "html_url": "https://github.com/cpp-ru/ideas/issues/61#issuecomment-810868512", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/61", + "id": 810868512, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg2ODUxMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:09:14Z", + "updated_at": "2021-03-31T08:09:14Z", + "author_association": "MEMBER", + "body": "Аналогичная, но более проработанная идея в #344 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810868512/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810870568", + "html_url": "https://github.com/cpp-ru/ideas/issues/345#issuecomment-810870568", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/345", + "id": 810870568, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg3MDU2OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:12:15Z", + "updated_at": "2021-03-31T08:12:15Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 27 августа 2018, 12:36**\r\nДля template variables специализация возможно уже сейчас -- ровно ваш пример будет компилироваться и работать.\r\n\r\nДля template type alias специализация это плохая идея, она противоречит смыслу template type alias'а, а именно, то что он не самостоятельная сущность, а всего лишь alias. В частности, в стандарте приведен следующий пример: \r\n```cpp\r\ntemplate struct Alloc { /* ... */ };\r\ntemplate using Vec = vector>;\r\n\r\nVec v; // same as vector> v;\r\n\r\ntemplate\r\n void process(Vec& v)\r\n { /* ... */ }\r\n\r\ntemplate\r\n void process(vector>& w)\r\n { /* ... */ } // error: redefinition\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810870568/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810871922", + "html_url": "https://github.com/cpp-ru/ideas/issues/346#issuecomment-810871922", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/346", + "id": 810871922, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg3MTkyMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:14:14Z", + "updated_at": "2021-03-31T08:14:14Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 27 августа 2018, 11:21**\r\nИдея отличная!\r\n\r\nОднако математика - не мой профиль. Я могу подсказать по интерфейсам или тонкостям добавления в стандарт, но выбор правильного интерфейса придётся делать вам. И вам же надо будет доказать, почему именно этот интерфейс нужен в подавляющем большинстве случаев.\r\n\r\n\r\n**Osmironov, 27 августа 2018, 20:16**\r\nyndx-antoshkka, у меня опыта общения с комитетом нет. Это вообще реально?))\r\n\r\nЕсли особо зубодробительного ничего нет, то я мог быб попробовать, если найдется единомышленник, который согласится помочь...\r\n\r\n\r\n**Саша Зайцев, 27 августа 2018, 23:35**\r\nOsmironov, есть идея спросить про это на std-proposals. К тому же в комитете есть специальные люди, которые нумериками всякими занимаются. Имеет смысл спросить у них, что они думают по этому поводу. Мб даже кто-то уже над чем-то похожим работает (лично я в это слабо верю)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810871922/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810873089", + "html_url": "https://github.com/cpp-ru/ideas/issues/346#issuecomment-810873089", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/346", + "id": 810873089, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg3MzA4OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:15:58Z", + "updated_at": "2021-03-31T08:15:58Z", + "author_association": "MEMBER", + "body": "Над проблемой начали работать математики в https://wg21.link/P1673 и https://wg21.link/P1674", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810873089/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810875519", + "html_url": "https://github.com/cpp-ru/ideas/issues/347#issuecomment-810875519", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/347", + "id": 810875519, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg3NTUxOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:19:31Z", + "updated_at": "2021-03-31T08:19:31Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 31 августа 2018, 13:43**\r\nИдея хорошая, но могут возникнуть проблемы: в данный момент стандарт позволяет имплементациям стандартной библиотеки добавлять noexcept в произвольных местах. Таким образом, код с noexcept! может собираться с одной стандартной библиотекой, но не собираться на другой версии стандартной библиотеки. Это неприятный момент, надо что-то придумать в этом месте.\r\n\r\n\r\n**Konstantin Stupnik, 2 сентября 2018, 16:40**\r\nyndx-antoshkka,\r\n\r\nНу потребуется уточнение noexcept-ности многих методов стандартной библиотеки... Учитывая, что noexcept это всё же, в том числе, оператор, получается, что необязательность noexcept уже может привести к тому, что код как минимум будет компилироваться по разному для реализаций STL разных компиляторов.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810875519/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810878373", + "html_url": "https://github.com/cpp-ru/ideas/issues/348#issuecomment-810878373", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/348", + "id": 810878373, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg3ODM3Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:23:50Z", + "updated_at": "2021-03-31T08:23:50Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 31 августа 2018, 13:16**\r\nЭто не очень сложно сделать - надо исправить вот эту главу eel.is/c++draft/except.spec . Стоит туда добавить что-то наподобие \"При дефиниции невиртуальной функции члена класса внутри класса и отсутствии спецификатора noexcept спецификатор noexcept(noexcept(statements) && ...) добавляется автоматически\".\r\n\r\nЕсть пара страшных моментов - времена компиляции и бинарная совместимость. С C++17 noexcept является частью сигнатуры функции, так что если начать выводить его автоматически - то пользовательский код перестанет линковаться. Возможно стоит дополнительно ограничить, что noexcept выводится только для имён с internal linkage http://eel.is/c++draft/basic.link\r\n\r\nПопробуйте накидать diff/правок для стандарта. Свои правки и идеи скидывайте мне - обещаю смотреть и помогать советом и делом. Как проработаем мелочи - можно будет закинуть письмо в std-proposal форум, а потом и полноценный proposal сделать.\r\n\r\n\r\n**Andrey Davydov, 31 августа 2018, 13:39**\r\nyndx-antoshkka, в данный момент нет noexcept(statement) только noexcept(expression). А statement'ов много разных, надо для каждого при таком подходе определить noexcept.\r\n\r\n\r\n**Андрей Руссков, 28 сентября 2018, 0:19**\r\nyndx-antoshkka, по идее можно же сделать неявный noexcept(auto) для всех inline функций, включая определенные в теле класса методы? Просто надо будет заодно указать в стандарте (если это еще не сделано) что inline foo(); и inline foo() noexcept; в разных TU никогда не конфликтуют", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810878373/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810880160", + "html_url": "https://github.com/cpp-ru/ideas/issues/349#issuecomment-810880160", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/349", + "id": 810880160, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg4MDE2MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:26:36Z", + "updated_at": "2021-03-31T08:26:36Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 31 августа 2018, 12:35**\r\nУ контейнеров на этот случай есть метод .at(const Key&)\r\n\r\nНужны очень веские аргументы, чтобы вводить в язык новый оператор. Попробуйте привести пример, где без этого оператора прям никак не обойтись.\r\n\r\n\r\n**Konstantin Stupnik, 2 сентября 2018, 16:26**\r\nyndx-antoshkka,\r\n\r\nПонятно, что всё можно сделать методами с нужной семантикой. По большому счёту перегрузка операторов вообще не нужна. Вон джава живёт без перегрузки. Лично я столкнулся с необходимостью чёткого разделения чтения и записи когда делал обёртку для Vertext Buffer Array для OpenGL. Мне нужно было знать какие элементы были модифицированны, что бы заливать в видео память только изменённую часть.\r\n\r\nС и использованием метода вместо оператора[] вычисления сложнее воспринимать.\r\n\r\n \r\n\r\nНу и по мне так это достаточно принципиальный косяк в дизайне - один оператор и на чтение и на запись. И отсутствие перегрузить отдельно именно запись является неприятным ограничением.\r\n\r\n\r\n**Игорь, 5 сентября 2018, 21:15**\r\nKonstantin Stupnik, даже если вводить этот оператор, как себя должен тогда вести объект, в котором перегружен ваш оператор и оператор= и мы вызываем []= , что тогда? Получается один из операторов будет заглушен, что уже криво и без костылей не обойтись. Никто не мешает вам сделать метод аля .get_and_set(1, \"1\");\r\n\r\n\r\n**Fihtangolz, 9 сентября 2018, 18:49**\r\nKonstantin Stupnik, напиши wrap для V, с operator =, и все будет работать ровно также как и с []= ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810880160/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810881062", + "html_url": "https://github.com/cpp-ru/ideas/issues/350#issuecomment-810881062", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/350", + "id": 810881062, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg4MTA2Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:27:57Z", + "updated_at": "2021-03-31T08:27:57Z", + "author_association": "MEMBER", + "body": "**ilnurkh, 4 марта 2019, 13:26**\r\nА сейчас вообще есть аттрибуты, при выпиливании которых меняется поведение программы?\r\n\r\nВсе которые я помню ([[maybe_unused]] [[nodiscard]] например) связаны либо с \"статическими проверками кода\" либо с оптмизиациями.\r\n\r\nЭто же заставит аттрибут влиять существенным образом на резолвинг методов. И в частности ломает возможность корректно собирать код с аттрибутами старыми компиляторами (в текущем состоянии можно выключить проверки, компилятор заигнорит аттрибуты и всё будет ок)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810881062/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810883218", + "html_url": "https://github.com/cpp-ru/ideas/issues/351#issuecomment-810883218", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/351", + "id": 810883218, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg4MzIxOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:31:01Z", + "updated_at": "2021-03-31T08:31:01Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 4 сентября 2018, 15:01**\r\nУ такой перегрузки будут те же неприятные последствия, что и при перегрузке операторов && ||. А именно - все выражения на вход будут считаться сразу, а не лениво. В итоге код с перегруженным оператором ?: ,удет приводить к краху приложения\r\n```cpp\r\nauto* ptr = foo();\r\n\r\nreturn ptr ? ptr->bar() : fallback();\r\n```\r\nВ примере выше, ptr->bar() будет всегда выполняться.\r\n\r\n\r\n**Игорь Шаповал, 4 сентября 2018, 16:14**\r\nЯ прочел, что уже предлагают в стандарт в виде проповзола\r\n\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0917r1.pdf\r\n\r\nyndx-antoshkka Что можете сказать? Есть шанс, что добавят в стандарт?\r\n\r\n\r\n**yndx-antoshkka, 4 сентября 2018, 17:11**\r\nИгорь Шаповал, в бумаге предлагают способы борьбы с вычислением обеих результатов выражения... Но я всё равно не в восторге от предложения.\r\n\r\nПосмотрим, что скажет комитет по этому поводу :)\r\n\r\n\r\n**Игорь Шаповал, 5 сентября 2018, 9:19**\r\nЭтот автор если я не ошибаюсь добавил simd классы в Parallelizm TS 2. Я думаю он сможет довести дело до конца.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810883218/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810884489", + "html_url": "https://github.com/cpp-ru/ideas/issues/351#issuecomment-810884489", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/351", + "id": 810884489, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg4NDQ4OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:32:58Z", + "updated_at": "2021-03-31T08:32:58Z", + "author_association": "MEMBER", + "body": "Идея прорабатывается в https://wg21.link/p0917", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810884489/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810885528", + "html_url": "https://github.com/cpp-ru/ideas/issues/352#issuecomment-810885528", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/352", + "id": 810885528, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg4NTUyOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:34:29Z", + "updated_at": "2021-03-31T08:34:29Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 сентября 2018, 11:26**\r\nБоюсь что это уже не изменить.\r\n\r\nСсылку возвращают по той причине, что после push_back хочется сразу работать со вставленным значением (без лишнего шага - разадресации итератора). К тому же, не очень понятно, какиё именно итератор выхотит получить - const? reverse?.... Если данное поведение не устривает, то всегда есть возможность получать итераторы старыми способами через end()/begin()\r\n\r\n\r\n**riad, 10 сентября 2018, 22:58**\r\n> Ссылку возвращают по той причине, что после push_back хочется сразу работать со вставленным значением\r\n\r\nКажется, что в обычном юзкейсе просто заменится . на ->\r\n\r\n> К тому же, не очень понятно, какиё именно итератор выхотит получить\r\n\r\nПочему-то у insert таких вопросов не возникало\r\n\r\n> Боюсь что это уже не изменить.\r\n\r\nЖаль, но это похоже на правду", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810885528/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810888965", + "html_url": "https://github.com/cpp-ru/ideas/issues/353#issuecomment-810888965", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/353", + "id": 810888965, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg4ODk2NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:40:09Z", + "updated_at": "2021-03-31T08:40:09Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 сентября 2018, 11:43**\r\nЕсть схожие предложения:\r\n\r\n* #282\r\n\r\n* #163\r\n\r\nСтарый код никто ломать не позволит, так что изменить существующее поведение constexpr функций - невозможно.\r\n\r\nИдея с constexpr { любой код } заманчива, но там возникают неожиданные проблемы. Многие хотят, чтобы constexpr блоки, считающиеся на этапе компиляции, выдавали одинаковые результаты на всех компиляторах. Этого не будет, если в таком блоке есть неопределённое поведение. \"Интерпретатор\" constexpr блоков должен проверять на неопределённое поведение. Для этого он должен видеть тела constexpr функций, иметь полную информацию о коде. Даже обычный new создаёт проблемы: возникает необходимость отслеживать выделенную память и типы данные, созданные в ней. Увы, это крайне нетривальная задача.\r\n\r\nХочется надеяться, что в скором времени получится внедрить ваше предложение в C++. Но сделать это одним махом не получится, и приходится двигаться малыми шажками, постепенной добавляя возможностей constexpr \"интерпретатору\", убирая ограничения и проч. Надеюсь, что в ближайшие 6 лет получится начать заниматься вашей идеей, но шансы успеть к C++29 не очень высоки.\r\n\r\n\r\n**Fihtangolz, 10 сентября 2018, 14:22**\r\nyndx-antoshkka, проблемы нет, нам достаточно ввести ключ компилятора, можно ввести семвер, ночную сборку или еще что то. Не думаю что мы сильно пострадаем от введения constexpr call, constexpr declaration просто перестанут юзать за ненадобностью и его будет не проблема выкинуть. Можно же ввести такую практику, объявляем что фитча выпиливается и ждем год-два и выпиливаем. Где можно посмотреть проблемы? Если честно я их особо не вижу, мне непонятно требование к отсутствию UB - это потребует серьезной переработки языка и по сути, мы изобретем новый синтаксис компаилтайм с++ полностью безопасный. Ну в принципе и это не проблема. Была плохая идея, наверное лучше использовать llvm ir. Дак отсюда и будет следовать отсутсвие UB (как мне кажется) - ub это по сути поведение не определенно но так как у нас llvm и он един для всех машин, то все будет определенно и достаточно поставить затычки на сисколы и тд. Я слаб в этом, не могли бы вы составить еще список проблем исключая UB. Я думаю я могу попро\r\n\r\n\r\n**yndx-antoshkka, 10 сентября 2018, 15:28**\r\n\r\n\r\nstd::mutex http://eel.is/c++draft/thread.mutex.class и std::unique_ptr http://eel.is/c++draft/unique.ptr#single.ctor тоже прадлагаете перестать использовать за ненадобностью? У них constexpr конструкторы\r\n\r\n\r\n**Fihtangolz, 10 сентября 2018, 18:19**\r\nyndx-antoshkka, боюсь вы не совсем понимаете что я предлагаю, я говорю, что семантический смысл constexpr при добавлении constexpr блока будет нарушен. Constexpr with defenition может выполнится а может не выполнится, зачем вообще такие гарантии? Разве компилятор до этого сам не мог редуцировать? Я говорю что мы хотим использовать constexpr именно при вызове int main() { constexpr add(1,2); return 0; } с жетской гарантией выполнения callable в compile time. Объявление constexpr для defenition можно оставить - оно само отомрет за ненадобностью. Тогда мы вернем нормальнй сематический смысл constexpr. Мне все же интересно какие именно препятсвия мы имеем для переноса constexpr в llvm ir. Если это кросплатформенная байткод машина. Мы можем использовать реализацию дефакто как это делает obj-c. Все UB в рамках это байткода будут четко определенны и соотвественно на всех компьютерах compile time код работающий в баткоде будет детерминирован. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810888965/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810893414", + "html_url": "https://github.com/cpp-ru/ideas/issues/353#issuecomment-810893414", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/353", + "id": 810893414, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg5MzQxNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:47:06Z", + "updated_at": "2021-03-31T08:47:06Z", + "author_association": "MEMBER", + "body": "Над предложением уже работают в https://wg21.link/p1938", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810893414/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810895562", + "html_url": "https://github.com/cpp-ru/ideas/issues/354#issuecomment-810895562", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/354", + "id": 810895562, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg5NTU2Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:50:35Z", + "updated_at": "2021-03-31T08:50:35Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 сентября 2018, 11:58**\r\nДубль. Есть аналогичное предложение: #354\r\n\r\n\r\n**Илья, 15 сентября 2018, 21:14**\r\nyndx-antoshkka, ваша ссылка ведет на это же предложение. Ссылка через поиск: https://github.com/cpp-ru/ideas/issues?q=is%3Aissue+is%3Aopen+realloc\r\n\r\n\r\n**Илья, 15 сентября 2018, 22:03**\r\nyndx-antoshkka, предложение от 5 декабря 2016 зависло, или есть какой-то прогресс? \r\n\r\nСергей Мищенко, необходимо предусмотреть как расширение, так и сужение области выделенной памяти. В том числе вариант должен работать в обе стороны относительно выделенного участка памяти. Итого 4 комбинации.\r\n\r\nЕсли сужение будет работать всегда, то расширение только при наличии свободной памяти до/после выделенного блока памяти.\r\n\r\nЕсли памяти для расширения недостаточно, как функция должна себя вести? Например память довыделить можно, но не столько, сколько запрошено, а меньше. В таком случае решением, вероятно, будет реализовать возможность указывать диапазон, сколько хотим довыделить, и сколько устроит, если сколько хотим довыделить невозможно...\r\n\r\nКасательно функции проверки возможности изменения размера блока памяти, возникает следующая проблема - после ее вызова придется гарантировать эту самую возможность. Т.о. функция должна и определять объем довыделяемой памяти и довыделять ее за один вызов.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810895562/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810896331", + "html_url": "https://github.com/cpp-ru/ideas/issues/354#issuecomment-810896331", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/354", + "id": 810896331, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg5NjMzMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:51:41Z", + "updated_at": "2021-03-31T08:51:41Z", + "author_association": "MEMBER", + "body": "Аналогичное предложение #28 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810896331/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810898815", + "html_url": "https://github.com/cpp-ru/ideas/issues/355#issuecomment-810898815", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/355", + "id": 810898815, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDg5ODgxNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:55:35Z", + "updated_at": "2021-03-31T08:55:35Z", + "author_association": "MEMBER", + "body": "Дубликат идеи #218 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810898815/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810900977", + "html_url": "https://github.com/cpp-ru/ideas/issues/356#issuecomment-810900977", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/356", + "id": 810900977, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDkwMDk3Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:59:02Z", + "updated_at": "2021-03-31T08:59:02Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 сентября 2018, 11:57**\r\nБлизкое по духу предложение: #300\r\n\r\nОдин умный человек в комитете мне говорил, что он согласится принять подобную библиотеку в стандарт, только если она действительно будет универсальной и всеобъемлющей. Поэтому он всегда спрашивает, \"можно ли с вашим предложением посчитать '(5 локтей + 3 вершка + 7 английских морских узлов) / световой год' и 'униция / 9 бит'\"", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810900977/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810901575", + "html_url": "https://github.com/cpp-ru/ideas/issues/300#issuecomment-810901575", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/300", + "id": 810901575, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDkwMTU3NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T08:59:58Z", + "updated_at": "2021-03-31T08:59:58Z", + "author_association": "MEMBER", + "body": "Закрываю в пользу #356 , там более говорящий заголовок", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810901575/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810901878", + "html_url": "https://github.com/cpp-ru/ideas/issues/356#issuecomment-810901878", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/356", + "id": 810901878, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMDkwMTg3OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-03-31T09:00:23Z", + "updated_at": "2021-03-31T09:00:23Z", + "author_association": "MEMBER", + "body": " Mateusz Pusz сейчас работает над этой проблемой. Попрбуйте его библиотеку, дайте feedback если что-то не так https://github.com/mpusz/units", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/810901878/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811816260", + "html_url": "https://github.com/cpp-ru/ideas/issues/357#issuecomment-811816260", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/357", + "id": 811816260, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgxNjI2MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:32:06Z", + "updated_at": "2021-04-01T10:32:06Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 19 сентября 2018, 12:20**\r\nВиртуальные функции в столь базовой вещи не пройдут. В base_awaitable откажется указатель на таблицу виртуальных функций, в бинарнике окежется по таблице на каждого наследника и для самого базового класса + для всех них будет сгенерирован RTTI. Embedded разработчики не скажут спасибо, game dev тоже рад не будет\r\n\r\n\r\n**yndx-antoshkka, 19 сентября 2018, 12:31**\r\nА вот сделать концепт Awaitable - это хорошая задумка, как раз для C++20. Можно будет проверять, что ваш класс удовлетворяет концепту\r\n\r\nstatic_assert(Awaitable, \"my_awaitable does not satisfy Awaitable concept\");\r\n\r\nили писать функции, принимающие только Awaitable типы данных\r\n\r\n\r\n**Andrey Davydov, 19 сентября 2018, 13:20**\r\nyndx-antoshkka, концепт Awaitable он не глобальный, к примеру\r\n```cpp\r\nstruct awaiter {\r\n bool await_ready();\r\n void await_suspend(stdx::coroutine_handle<>);\r\n void await_resume();\r\n};\r\n\r\nstruct awaitable { \r\n};\r\n\r\nnamespace test {\r\n awaiter operator co_await(awaitable);\r\n}\r\n```\r\nвнутри namespace test `awaitable` удолетворяет этому концепту, снаружи -- нет.\r\n\r\n\r\n**Игорь Шаповал, 20 сентября 2018, 9:57**\r\nНадо будет писать вроде так\r\n```cpp\r\ntemplate \r\nT operator co_await() {\r\n return T{};\r\n}\r\n```\r\nИли вот так если примут\r\n```cpp\r\nauto Awaitable operator co_await() {\r\n return awaitable{};\r\n}\r\n```\r\n \r\n\r\n \r\n\r\n\r\n**Andrey Davydov, 15 октября 2018, 9:18**\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1288r0.pdf", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811816260/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811816607", + "html_url": "https://github.com/cpp-ru/ideas/issues/357#issuecomment-811816607", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/357", + "id": 811816607, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgxNjYwNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:32:46Z", + "updated_at": "2021-04-01T10:32:46Z", + "author_association": "MEMBER", + "body": "Актуальная ревици https://wg21.link/p1288", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811816607/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811817468", + "html_url": "https://github.com/cpp-ru/ideas/issues/358#issuecomment-811817468", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/358", + "id": 811817468, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgxNzQ2OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:34:23Z", + "updated_at": "2021-04-01T10:34:23Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 19 сентября 2018, 12:43**\r\nХм... может быть полезно.\r\n\r\nНо возможно стоит поправить требования к exception_ptr и гарантировать что вот такой код будет оставлять p в null value состоянии:\r\n\r\nstd::rethrow_exception(std::move(p));\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811817468/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811818606", + "html_url": "https://github.com/cpp-ru/ideas/issues/359#issuecomment-811818606", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/359", + "id": 811818606, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgxODYwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:36:31Z", + "updated_at": "2021-04-01T10:37:02Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 19 сентября 2018, 12:37**\r\nИдея супер! Предлагаю написать через operator<=> чтобы уменьшить количество перегрузок (+ надо заменить decay_t на remove_cv_ref_t)\r\n\r\n\r\n**Andrey Davydov, 19 сентября 2018, 14:03**\r\nА как насчет ослабить условие `(... || std::is_same_v)`? Хочется чтобы такой код тоже работал: \r\n```cpp\r\nstruct B {};\r\nstruct D : B {};\r\n\r\nvoid test(D * d) {\r\n std::variant v(d);\r\n v == d;\r\n}\r\n```\r\n\r\n**Олег Фатхиев, 19 сентября 2018, 14:58**\r\nAndrey Davydov, не совсем понятно, как быть в таком случае.\r\n\r\nА если у нас такой variant:\r\n```cpp\r\nstd::variant v{ (char)5 };\r\nv == (int)5;\r\n```\r\nЕсли ослабить проверку, то мы будем получать тут true, что, скорее всего, не является ожидаемым поведением, так как https://en.cppreference.com/w/cpp/utility/variant/operator_cmp делает даже более строгую проверку.\r\n\r\n\r\n**Andrey Davydov, 19 сентября 2018, 16:55**\r\nОлег Фатхиев, можно сделать так, что если Ts содержит T, то дополнительно проверять, что активный вариант типа T, иначе сравнивать даже разных типов. Все равно останется неитуитивное поведение в таком коде:\r\n```cpp\r\nvariant v(\"aba\");\r\nv == \"aba\"sv;\r\n```\r\nно тут уже ничего не поделаешь.\r\n\r\n\r\n**yndx-antoshkka, 24 сентября 2018, 16:24**\r\nПока что, во избежание проблем, договорились делать так:\r\n\r\n* делать через operator<=>\r\n\r\n* разрешать (через enable_if подобные конструкции) эти операторы ТОЛЬКО если 1 альтернатива из variant сравнима с не-variant параметром\r\n\r\n* в случае если variant содержит valueless_by_exception() или не ту альтернативу, с которой хотим сравниться, то делать поведение аналогичное существующим операторам сравнения двух вариантов\r\n\r\n\r\n**yndx-antoshkka, 25 сентября 2018, 12:31**\r\nЧерновик предложения: https://apolukhin.github.io/papers/variant_spaceship.html\r\n\r\n\r\n**Andrey Davydov, 25 сентября 2018, 13:07**\r\nyndx-antoshkka, кажется что смешение сравнения индексов и сравнения значений приводит к математически абсурдным результатам:\r\n```cpp\r\nstruct A {\r\n bool operator == (A) const { return true; }\r\n} a;\r\n\r\nvariant x(a);\r\nvariant y(a);\r\n\r\nassert(x == a);\r\nassert(y == a);\r\nassert(x < 0);\r\nassert(y > 0);\r\n```\r\n\r\n**Andrey Davydov, 25 сентября 2018, 13:22**\r\nЕсли Вы и Олег согласны, что это проблема, то по предлагаю чинить ее понижением категории до std::partial_ordering (если у T она сильнее) и в случае \r\n```cpp\r\n(v.index() <=> i) != 0\r\n```\r\nвозвращать partial_ordering::unordered.\r\n\r\n\r\n**yndx-antoshkka, 25 сентября 2018, 14:15**\r\nAndrey Davydov, тогда не получится использовать variant с гетерогенными контейнерами.\r\n\r\n\r\n**Andrey Davydov, 25 сентября 2018, 14:39**\r\nyndx-antoshkka, Вы имеете в виду ordered контейнеры с гетерогенным lookup'ом (less)? Тогда предлагаю рассмотреть следующую альтернативу: давайте \"нормализовывать\" variant мысленно переупорядочивая его шаблонные аргументы в каком-нибудь implementation-defined порядке (скажем, том, что задается std::type_info::before). И дальше индексы иcпользующиеся для определения operator <=> в proposal'е берутся относительно \"нормализованного\" варианта. Это решит проблему (x < 0) && (y > 0) из моего примера.\r\n\r\n\r\n**yndx-antoshkka, 25 сентября 2018, 15:48**\r\nAndrey Davydov, такое поведение точно будет не переносимым и взрывающим людям мозг. Нужно смириться с тем, что variant и variant это разные типы, и операторы сравнения с int у них ведут себя по разному.\r\n\r\n \r\n\r\nА вот идея с функцией, сортирующей шаблоны - это мысль интересная, но для отдельного предложения.\r\n\r\n\r\n**Andrey Davydov, 25 сентября 2018, 16:26**\r\nyndx-antoshkka,\r\n\r\n> такое поведение точно будет не переносимым и взрывающим людям мозг\r\n\r\nЯ не очень хорошо понимаю значение \"непереносимым\" в данном контексте. Оно будет implementation defined, но поставленную задачу -- гетерогенный lookup в ordered контейнере variant'ов оно решает. Ведь есть же уже прецендент std::type_index, да его сравнение implementation-defined, зато std::set работает.\r\n\r\n> Нужно смириться с тем, что variant и variant это разные типы\r\n\r\nЭто только если мы не верим в транзитивность, в моем примере (x == a) и (y == a), так что не такие уж они и разные. А если добавить \r\n```cpp\r\ntemplate\r\n requires(TemplateArgsAreEqualByModuloOfPermutation)\r\nstd::[strong|weak]_equality operator <=> (V1 const &, V2 const &);\r\n```\r\nчто лично мне кажется, куда более естественным, чем ordering вводимый предлагаемым способом, \"смириться\" точно не получится.\r\n\r\n\r\n**Andrey Davydov, 2 октября 2018, 6:58**\r\nyndx-antoshkka, в черновике (Motivation) есть опечатки в комментарии -- \"grater\" -> \"greater\" и, возможно, не хватает \"?\" в конце первой строки.\r\n\r\n\r\n**yndx-antoshkka, 2 октября 2018, 19:30**\r\nAndrey Davydov, спасибо, подправил (ещё не выложил обновлённую версию)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811818606/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811819677", + "html_url": "https://github.com/cpp-ru/ideas/issues/359#issuecomment-811819677", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/359", + "id": 811819677, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgxOTY3Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:38:27Z", + "updated_at": "2021-04-01T10:38:27Z", + "author_association": "MEMBER", + "body": "Комитет несколько пугает перегрузка операторов отличных от `==`. Нужно поработать над мотивацией, возможно оставить только операторы сравнения на равенство.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811819677/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811820494", + "html_url": "https://github.com/cpp-ru/ideas/issues/360#issuecomment-811820494", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/360", + "id": 811820494, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgyMDQ5NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:40:06Z", + "updated_at": "2021-04-01T10:40:06Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 25 сентября 2018, 12:34**\r\nУже есть возможность из одного конструктора вызывать другой. Так что ваша идея уже внедрена, только без init и с явной передечей параметров.\r\n\r\n\r\n**Роман Попов, 25 сентября 2018, 16:36**\r\nНу так идея именно в том чтобы разрешить использовать параметры конструктора в in-class инициалзицации. Где в C++ эта идея уже внедрена? Да, init наверное можно сделать в C++20 с помощью no_unique_address\r\n\r\n\r\n**Роман Попов, 25 сентября 2018, 17:37**\r\nНашёл ещё одну причину почему это полезно: Унификация compile-time и run-time интерфейсов. Пример:\r\n\r\n \r\n```cpp\r\ntemplate \r\nclass MyFIFO {\r\npublic:\r\n MyFIFO(unsigned WPTR_W = 10) {}\r\n\r\nprivate:\r\n \r\n sc_int rptr{RPTR_W}; // OK!\r\n sc_int wptr{WPTR_W}; // Compile Error!\r\n sc_int xptr{WPTR_W + WPTR_W}; // Compile Error!\r\n};\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811820494/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811821140", + "html_url": "https://github.com/cpp-ru/ideas/issues/361#issuecomment-811821140", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/361", + "id": 811821140, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgyMTE0MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:41:34Z", + "updated_at": "2021-04-01T10:41:34Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 26 сентября 2018, 16:57**\r\nЧеловек, разивающий Boost.Process, имеет планы на добавление его в стандарт.\r\n\r\nПри работе с процессами многие хотят асинхронную работу с pipe, так что перед приняеим Boost.Process в стандарт должны принять в стандарт Executors и Networking\r\n\r\n\r\n**Александр Коновалов, 27 сентября 2018, 1:40**\r\nyndx-antoshkka, спасибо. Полистал бегло документацию. Действиттельно довольно удобная штука. Единственное, нашёл только \"жесткое\" завершение процесса. Хотелось бы ещё и \"мягкое\". В любом случае, будем ждать.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811821140/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811821707", + "html_url": "https://github.com/cpp-ru/ideas/issues/361#issuecomment-811821707", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/361", + "id": 811821707, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgyMTcwNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:42:48Z", + "updated_at": "2021-04-01T10:42:48Z", + "author_association": "MEMBER", + "body": "Автор Boost.Process взялся за дело: https://wg21.link/p1750", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811821707/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811822500", + "html_url": "https://github.com/cpp-ru/ideas/issues/362#issuecomment-811822500", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/362", + "id": 811822500, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgyMjUwMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:44:29Z", + "updated_at": "2021-04-01T10:44:29Z", + "author_association": "MEMBER", + "body": "**iksk810, 2 октября 2018, 19:29**\r\nНастолько ли это необходимо, чтобы включать это в стандарт? А что насчёт сторонних реализаций строк (каки-нибудь QString, например)?\r\n\r\n\r\n**yndx-antoshkka, 12 октября 2018, 13:43**\r\nТут стоит пойти немного по другому пути: продумать концепт String, да такой, который удовлетворяет большинству сторонних библиотек (QString, строке из WxWidgets и т.п.). Найти в стандарте места, где им удобно будет пользоваться, найти примеры пользовательского кода, где бы этот концепт подошел.\r\n\r\nВ виде концепта - есть шансы на принятие в стандарт. В виде type triat - шансов нет.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811822500/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811826549", + "html_url": "https://github.com/cpp-ru/ideas/issues/363#issuecomment-811826549", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/363", + "id": 811826549, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgyNjU0OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:53:14Z", + "updated_at": "2021-04-01T10:53:14Z", + "author_association": "MEMBER", + "body": "**Александр Коновалов, 9 октября 2018, 0:42**\r\nВ данном подходе мне только не нравится наличие \"магических\" in, out и compiler. В их получении думаю логичне было бы опереться на синтаксис рефлексий. Или пойти по пути type_info, т.е. что-нибудь вроде:\r\n```cpp\r\nfor (auto f : metainfo(interface).in.functions()) {\r\n if (f.is_copy() || f.is_move()) {\r\n metainfo(interface).compiler.error(\"this type may not have a copy or move function\" , f);\r\n }\r\n} \r\n```\r\nТаким образом, будет консистентно с typeid, sizeof и другими ключевыми словами с подобным синтаксисом.\r\n\r\n\r\n**Alexander, 9 октября 2018, 8:31**\r\nСаттер на презентации говорил, что предложение ещё будет меняться. В том числе и синтаксис обьявления метаклассов. Так что вариант, который есть сейчас, далеко не финальный", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811826549/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811827032", + "html_url": "https://github.com/cpp-ru/ideas/issues/364#issuecomment-811827032", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/364", + "id": 811827032, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgyNzAzMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:54:12Z", + "updated_at": "2021-04-01T10:54:12Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 8 октября 2018, 19:55**\r\nК несчастью TM ещё не готов.\r\n\r\nНа последнем собрании обсуждались различные проблемы TM. Одна из основных - мало кто реализовал в компиляторе TM и мало кто пользуется. Авторы предложения хотели получить намного больше фидбека.\r\n\r\nОтдельная проблема - это что TM добавляет накладных расходов, когда не используется транзакционность. Это не похоже на C++, и требуется доработка.\r\n\r\nПолные логи совещания доступны тут: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1070r0.pdf\r\n\r\n\r\n**Александр Коновалов, 9 октября 2018, 0:22**\r\nyndx-antoshkka, на сколько помню, они хотели её в язык, а не в STL. Кажется, STL реализация была бы более независимой (если она конечно возможна и адекватна).\r\n\r\n\r\n**Игорь Шаповал, 9 октября 2018, 9:22**\r\nyndx-antoshkka, можете расказать подробнее про накладные расходы?\r\n\r\nМожете расказать об TM TS version 2?\r\n\r\nhttps://en.cppreference.com/w/cpp/experimental\r\n\r\n\r\n**yndx-antoshkka, 22 июля 2020, 12:08**\r\nНовое предложение по TM для C++ https://wg21.link/P2066", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811827032/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811827716", + "html_url": "https://github.com/cpp-ru/ideas/issues/365#issuecomment-811827716", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/365", + "id": 811827716, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgyNzcxNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:55:35Z", + "updated_at": "2021-04-01T10:55:35Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 9 октября 2018, 16:58**\r\nИдея хорошая, но с ней придётся подождать. На данный момент функционал концептов для C++20 определён (идут разговоры о terse syntax, это наверное последнее что смогут добавить к C++20).\r\n\r\nНадо дождаться C++20, и уже тогда приниматься за proposal.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811827716/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811828581", + "html_url": "https://github.com/cpp-ru/ideas/issues/366#issuecomment-811828581", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/366", + "id": 811828581, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgyODU4MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T10:57:10Z", + "updated_at": "2021-04-01T10:57:10Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 11 октября 2018, 19:33**\r\nЭто будет очень полезная штука!\r\n\r\nМеня пугает только то, что пользователи могут начать везде использовать этот механизм, даже там, где надо применять integer_sequence.\r\n\r\n\r\n**Andrey Davydov, 11 октября 2018, 22:11**\r\nyndx-antoshkka, можете привести пример, когда type_pack_element может использоваться неправильно?\r\n\r\nНаписал в std-proposals https://groups.google.com/a/isocpp.org/d/msg/std-proposals/HRx31Xhg7CU/mP5f6pTABAAJ посмотрю, что там скажут.\r\n\r\n \r\n\r\n\r\n**yndx-antoshkka, 12 октября 2018, 13:39**\r\nAndrey Davydov, что-то затрудняюсь придумать. Наверное и правда всё ок\r\n\r\n\r\n**Andrey Davydov, 8 ноября 2018, 21:47**\r\nyndx-antoshkka, обсуждение в std-proposals естественным образом затухло, так что можно приступать к написанию бумаги, однако меня немного смущает позиция Louis Dionne. Как Вам кажется, достаточно ли высока вероятность, что предложение будет отвергнуто с мотивацией \"противоречит генеральной линии комитета в сторону value-based metaprogramming\"?\r\n\r\n\r\n**yndx-antoshkka, 30 ноября 2018, 20:35**\r\nAndrey Davydov, всё просто: надо показать что std::type_pack_element полезен в случаях, когда value-based metaprogramming неудобен. Тоесть просто нужно несколько примеров того, что с value-based metaprogramming получается намного длиннее и некрасивее. Дополнительно стоит показать что std::type_pack_element можно имплементировать через value-based metaprogramming. Тогда если предложение не пройдёт по причине противоречия линии комитета, его просто надо будет перенаправить в подгруппу SG7 Reflections, чтобы уже они приняли его и выкатили в Reflections TS.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811828581/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811830363", + "html_url": "https://github.com/cpp-ru/ideas/issues/366#issuecomment-811830363", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/366", + "id": 811830363, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTgzMDM2Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T11:00:49Z", + "updated_at": "2021-04-01T11:00:49Z", + "author_association": "MEMBER", + "body": "Предлагают реализовать данную функциональность на уровне языка в https://wg21.link/P1858\r\n\r\nМожно будет просто использовать индексы:\r\n```cpp\r\n template \r\n class tuple {\r\n public:\r\n template T,\r\n std::convertible_to U>\r\n requires sizeof...(Ts) == 2\r\n constexpr tuple(std::pair const& p)\r\n : elems...[0](p.first)\r\n , elems...[1](p.second)\r\n { }\r\n private:\r\n Ts... elems;\r\n };\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811830363/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811858889", + "html_url": "https://github.com/cpp-ru/ideas/issues/367#issuecomment-811858889", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/367", + "id": 811858889, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTg1ODg4OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T12:01:28Z", + "updated_at": "2021-04-01T12:01:28Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 15 октября 2018, 17:44**\r\nУ этого расширения очень большие проблемы:\r\n```cpp\r\nvoid increment(long& foo) { foo += 1; }\r\nint main() {\r\n int x = 123;\r\n increment(x);\r\n assert(x == 124); // Oops!\r\n}\r\n```\r\nСами инженеры из MSVC рекомендуют не пользоваться этой особенностью.\r\n\r\n\r\n**Даниил Милютин, 15 октября 2018, 18:19**\r\nyndx-antoshkka, \r\nВаш контр-пример не скомпилируется MSVC \r\n\r\nhttps://godbolt.org/z/TfNi7Q\r\n```cpp\r\nvoid increment(long& foo) { foo += 1; }\r\n\r\nstruct X \r\n{\r\n X(long* x): i(x) {}\r\n long* i = nullptr;\r\n};\r\n\r\nvoid increment(X& foo) { *foo.i += 1; }\r\n\r\nint main() {\r\n int x = 123;\r\n long ll = 123;\r\n //increment(x); // MSVC won't allow that\r\n // implicit type conversion in this case is forbidden!\r\n increment(ll); // fine\r\n increment(X(&ll)); // fine\r\n //assert(x == 124); // Oops!\r\n //assert(ll == 125); // Fine\r\n return ll;\r\n}\r\n```\r\nМоё предложение касается случаев, когда при implicit конвертации не создаётся новых объектов на стеке.\r\nВ вашем примере (если б это работало по логике полного расслабления требований) создастся временный объект типа long. И я такое также ни в коей мере не поощряю.\r\nТо есть предложение звучит \"как расслабить требования, но с ограничениями\".\r\n\r\nВаше видение предложения изменилось после моих уточнений? :)\r\n\r\n\r\n**Andrey Davydov, 16 октября 2018, 12:58**\r\nДаниил Милютин, MSVC ведят себя еще более странно -- важно не только то, создается ли временный объект явно или нет, но и является ли он примитивным типом: к примеру, increment((long)x) тоже не скомпилируется.\r\n\r\n\r\n**Даниил Милютин, 17 октября 2018, 3:08**\r\nAndrey Davydov, Такое поведение компилятора MSVC меня лично тоже устривает.\r\nСобственно свои идеи и уочнения я изложил.\r\n\r\nЖду от коллег по цеху выраженных мыслей по этому поводу.\r\nЕсли есть ещё логические доводы против, то мне интересно их воспринять.\r\n\r\n\r\n**webreh, 20 ноября 2018, 20:46**\r\nПреобразование prvalue of T в T& является предупреждением 4238: nonstandard extension used: class rvalue used as lvalue. Оно было нужно в С++03 и бесполезно с появлением форм auto&&.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811858889/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811859895", + "html_url": "https://github.com/cpp-ru/ideas/issues/368#issuecomment-811859895", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/368", + "id": 811859895, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTg1OTg5NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T12:03:26Z", + "updated_at": "2021-04-01T12:03:26Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 19 октября 2018, 14:06**\r\nМысль занятная. Рекомендую начать с написания прототипа и добавлением его в Boost: https://github.com/boostorg/smart_ptr/blob/develop/include/boost/smart_ptr/make_unique.hpp\r\n\r\nТам уже есть полезные дополнительные функции, которых нет в стандарте.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811859895/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811864682", + "html_url": "https://github.com/cpp-ru/ideas/issues/369#issuecomment-811864682", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/369", + "id": 811864682, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTg2NDY4Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T12:13:16Z", + "updated_at": "2021-04-01T12:13:16Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 19 октября 2018, 13:29**\r\nЕсть немного похожее предложение: Несколько аргументов в перегруженном brackets operator #235 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811864682/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811865074", + "html_url": "https://github.com/cpp-ru/ideas/issues/369#issuecomment-811865074", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/369", + "id": 811865074, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTg2NTA3NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T12:14:03Z", + "updated_at": "2021-04-01T12:14:03Z", + "author_association": "MEMBER", + "body": "А оно должно работать только для массивов или и для контейнеров? А как реализовать для контейнеров?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811865074/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811865972", + "html_url": "https://github.com/cpp-ru/ideas/issues/370#issuecomment-811865972", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/370", + "id": 811865972, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTg2NTk3Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T12:16:01Z", + "updated_at": "2021-04-01T12:16:01Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 24 октября 2018, 7:45**\r\nКак я вижу по стандарту [expr.prim.lambda]:\r\n```cpp\r\nlambda-expression:\r\n lambda-introducer compound-statement\r\n lambda-introducer lambda-declarator requires-clause_opt compound-statement\r\n lambda-introducer < template-parameter-list > requires-clause_opt compound-statement\r\n lambda-introducer < template-parameter-list > requires-clause_opt\r\n lambda-declarator requires-clauseopt compound-statement\r\n...\r\n```\r\nэто разрешенная конструкция, просто gcc (на котором Вы, видимо, проверяли) пока не успел ее поддержать.\r\n\r\n\r\n**Wellarium, 24 октября 2018, 22:23**\r\nAndrey Davydov, да, Вы правы :) Я смотрел Concepts TS, который реализован в gcc, там про лямбда-выражения не упоминалось. Здорово, что это уже будет в стандарте.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811865972/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811933791", + "html_url": "https://github.com/cpp-ru/ideas/issues/371#issuecomment-811933791", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/371", + "id": 811933791, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTkzMzc5MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T14:08:03Z", + "updated_at": "2021-04-01T14:08:03Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 30 октября 2018, 7:43**\r\nДля того чтобы это заработало должна существовать некоторая концепция expected type, а ее в C++ нет. Наверное, писав это преждложение Вы имели в виду, что-то вроде \r\n```cpp\r\nMarix m = matrix_allocate(1024, 1024);\r\n```\r\nно в этом случае ничем не хуже использовать \r\n```cpp\r\nauto m = matrix_allocate(1024, 1024);\r\n```\r\nВ более же общей ситуации, когда вызов функции matrix_allocate является частью другого выражения, скажем foo(matrix_allocate(1024, 1024)), неизвестно аргумент какого типа ожидает foo (потому что перегрузок foo может быть много), более того мы даже не можем все перегрузки foo, не зная типы аргументов (ADL).\r\n\r\n\r\n**Fihtangolz, 31 октября 2018, 2:05**\r\nAndrey Davydov, для foo мне кажется стоит использовать принци \"единственной точки зависимости\" тоесть в данном случае требование должно быть разрешимо единственным образом и зависет от одной точки требования. Вообшем если мы запроси шаблонный параметр в качестве типа мы должны получит туже ошибку что сейчас и явно передать тип как шаблонный параметр если же функция предположим имеет статический тип int все хорошо или хорошо если Matrix b = foo(matrix_allocate(1024, 1024)); где T foo(T __s){ //... }. Ну вопрос тут скорей в следуюшем, почему бу и нет если это никому хуже не сделает? А писать так чаще удобней чес с auto\r\n\r\n\r\n**webreh, 31 октября 2018, 3:06**\r\nAndrey Davydov, ну вообще не особо нужна, результат достижим. Другое дело, что, видимо, нужно явно помечать \"template \", иначе компилятору может быть не очень понятно, что надо действовать как ниже\r\n```cpp\r\n#include \r\n#include \r\n\r\nnamespace details {\r\n template \r\n struct return_type_deductor { \r\n static_assert(!std::is_reference_v);\r\n Tuple tuple_;\r\n\r\n return_type_deductor(Tuple&& tuple) : tuple_(std::forward(tuple)) {\r\n }\r\n\r\n template struct tag {};\r\n\r\n template operator T() && {\r\n return std::move(*this).details(tag{}, std::make_index_sequence>{});\r\n }\r\n\r\n template \r\n T details(tag, std::index_sequence) && {\r\n return T{std::get(std::move(tuple_))...};\r\n }\r\n };\r\n}\r\n\r\ntemplate \r\nauto deduce_by_return_type(Args&&... args) {\r\n return details::return_type_deductor{std::make_tuple(std::forward(args)...)};\r\n}\r\n\r\nauto matrix_allocate(int height, int width) { \r\n return deduce_by_return_type(height, width); \r\n}\r\n\r\ntemplate \r\nT matrix_allocate(int height, int width) { \r\n return deduce_by_return_type(height, width); \r\n}\r\n\r\nstruct matrix {\r\n int height, width;\r\n};\r\n\r\nvoid foo() {\r\n matrix a = matrix_allocate(12, 12);\r\n auto b = matrix_allocate(12, 12);\r\n}\r\n```\r\n \r\n\r\n\r\n**webreh, 31 октября 2018, 3:34**\r\nAndrey Davydov, и да, ваш пример с auto немедленно ломается, когда deduction происходит по параметру функции.\r\n```cpp\r\nmatrix transpose(matrix x) {\r\n return { x.width, x.height } ;\r\n}\r\n\r\nvoid goo() {\r\n auto c = transpose(matrix_allocate(10, 12));\r\n}\r\n```\r\n\r\n**Fihtangolz, 31 октября 2018, 5:49**\r\nAndrey Davydov, вообщем константин красавец, реализация как сахар на cast вполне себе вкусная, он поскромничал дописать, что можно так:\r\n```cpp\r\ntemplate \r\nT matrix_allocate(int height, int width) { \r\n\r\n return T{height, width}; \r\n}\r\n```\r\n, вообщем ожидается что в стандарт попадет вот это вот как стандартное поведение для типа возврата, если не указанное любое другое значение по умолчанию \r\n\r\n\r\n**Andrey Davydov, 31 октября 2018, 9:15**\r\nwebreh, то что Вы написали безусловно красивый трюк, хотя он и описывается двумя стандартными функциями std::forward_as_tuple, std::make_from_tuple (по модулю того, что там используется инициализация круглыми скобками, а у Вас фигурными, но неизвестно, что именно нужно пользователю), но при чем здесь вывод типа? Так, способ вернуть proxy. А если allocate состоит не из одного return statement, а должен сделать еще что-то полезное с возвращаемым значение (заполнить нулями, скажем)? \r\n```cpp\r\nT allocate(int width, int height) {\r\n T result = ...;// construct somehow\r\n result.fill(0);\r\n return result;\r\n}\r\n```\r\nЧто до примера с transpose, то он является яркой иллюстрацией того о чем я писал в первом сообщении -- для того, чтобы так называемый вывод типа работал нужно знать, какой тип ожидается. Если перегрузка transpose одна -- работает, если добавить еще \r\n```cpp\r\nstruct square_matrix {};\r\n\r\nsquare_matrix transpose(square_matrix x) {\r\n return {};\r\n}\r\n```\r\nработать не будет.\r\n\r\n\r\n**webreh, 1 ноября 2018, 3:46**\r\nAndrey Davydov, сам чуть не написал через forward_as_tuple, но так нельзя, нельзя forward в выходящую за область функции view структуру.\r\n\r\nТрюк прямо демонстрирует возможный (для компилятора) вывод шаблонного параметра по результирующему значению - вести себя как он бы вел себя в этом примере.\r\n\r\nПо поводу перегрузок - да, не будет (хотя для square_matrix будет если добавить там SFINAE условие - оно же не конструируется по двум параметрам) работать для параметров, которые фактически участвуют в разрешении перегрузки, что логично.\r\n\r\nКонструкция типа выше может использоваться для параметров, которые не участвуют в разрешении перегрузки, скажем вы сможете не указывать явно шаблонный параметр boost::lexical_cast в случае vector::push_back", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811933791/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811941643", + "html_url": "https://github.com/cpp-ru/ideas/issues/372#issuecomment-811941643", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/372", + "id": 811941643, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTk0MTY0Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T14:20:35Z", + "updated_at": "2021-04-01T14:20:35Z", + "author_association": "MEMBER", + "body": "**Андрей Руссков, 7 ноября 2018, 20:37**\r\nемнип в с++20 можно будет параметризовать шаблоны constexpr значениями constexpr-сравниваемых типов. Под эту категорию попадают и указатели на функции. Например, clang 6 в режиме c++2a уже отлично кушает вот такой вот код:\r\n```cpp\r\n#include \r\n\r\ntemplate \r\nvoid foo() {\r\n func();\r\n}\r\n\r\nint main() {\r\n foo<+[] { std::cout << \"Hello, world!\" << std::endl; }>();\r\n}\r\n```\r\nПравда, не сумеет с полиморфными лямбдами. Вкупе с template template параметрами из c++17 возможно, всё что вам нужно, уже есть?\r\n\r\n\r\n**languagelawyer, 1 февраля 2019, 4:49**\r\nclang 9.0.0 `error: a lambda expression cannot appear in this context`\r\n\r\n\r\n**Анатолий Томилов, 26 декабря 2018, 14:08**\r\nЯ задавал подобный вопрос на SO: основная сложность, на сколько я помню, -- это манглинг имён (его сложно будет реализовать; намного сложнее, чем есть сейчас).\r\n\r\n\r\n**languagelawyer, 3 февраля 2019, 14:02**\r\n> при передаче в шаблон какого-то параметра (типа или целочисленной константы), на самом деле передается не тип и не константа, а фрагмент синтаксического дерева.\r\n\r\nДа это про что угодно можно сказать. При передаче аргумента в функцию передаётся фрагмент синтаксического дерева, при инициализации переменной и т.д.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811941643/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811942533", + "html_url": "https://github.com/cpp-ru/ideas/issues/373#issuecomment-811942533", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/373", + "id": 811942533, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTk0MjUzMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T14:21:56Z", + "updated_at": "2021-04-01T14:21:56Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 29 октября 2018, 16:26**\r\nНад этой вещью уже работают, скорее всего появится в C++20", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811942533/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811945979", + "html_url": "https://github.com/cpp-ru/ideas/issues/374#issuecomment-811945979", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/374", + "id": 811945979, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTk0NTk3OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T14:27:08Z", + "updated_at": "2021-04-01T14:27:08Z", + "author_association": "MEMBER", + "body": "**Vladimir Smirnov, 28 ноября 2018, 23:20**\r\nМеня очень сильно смущает текущее предложение по std::chrono::months(). В текущем виде это ровно 1/12 года. Предвижу баги вроде \"я расчитал time_point для 1 февраля 2018 00:00, прибавил 1 месяц, получил 3 марта, полтретьего ночи, WTF?\". Юзкейсы мне кажется будут из серии \"легко сделать неправильно, сложно сделать правильно\".\r\n\r\n\r\n**yndx-antoshkka, 29 ноября 2018, 13:27**\r\nVladimir Smirnov, кажется, что просто так сложить не получится:\r\n```cpp\r\nauto feb1_2018 = 2018y/February/1;\r\nfeb1_2018 + month(1); // OK: 2018y/Match/1\r\n\r\nsys_seconds{feb1_2018} + month(1); // Compile time error\r\nsys_seconds{feb1_2018} + static_cast(month(1)); // Ну, сам так написал\r\n```\r\nmonth и прочие новые типы - это не std::chrono::duration а отдельные классы, которые к нему просто так не преобразоввываются. Но возможно что я неправильно понял ваш пример\r\n\r\n\r\n**Vladimir Smirnov, 29 ноября 2018, 16:08**\r\n```cpp\r\n\t//взял отсюда: https://en.cppreference.com/w/cpp/chrono/duration\r\n\tusing months = std::chrono::duration>;\r\n\tauto now = std::chrono::system_clock::now();\r\n\t// print_as_date(now);\r\n\tauto month_later = now + months(1);\r\n\t// print_as_date(month_later);\r\n```\r\n\r\nя скорее про что-то подобное. вообще странно, sys_seconds это вроде ж и есть timepoint, как now в моем примере, если оно будет запрещать складывать и результат от clock-ов, то тогда скорее всего мои опасения не оправданы. То что с календарями оно работает как задумано, это я догадывался)\r\n\r\nу меня нет под рукой компилятора с поддержкой C++20 в библиотеке. chrono в транк libc++ еще вроде не завезли https://libcxx.llvm.org/cxx2a_status.html , вы где смотрели?\r\n\r\n\r\n**yndx-antoshkka, 29 ноября 2018, 19:06**\r\nVladimir Smirnov, методом пристального взгляда на стандарт :)\r\n\r\nПосмотрел в libc++, там есть класс month не являющийся duration\r\n\r\nНо вы правы, одновременно с ним в стандарте есть и months, являющийся duration\r\n\r\n \r\n\r\nКажется что стоит убрать std::chrono::months.\r\n\r\n\r\n**yndx-antoshkka, 29 ноября 2018, 19:20**\r\nС годами такая же печаль. Поиграться можно тут\r\n\r\nЯ напишу автору предложения, посмотрим что он об этом думает.\r\n\r\n\r\n**Vladimir Smirnov, 29 ноября 2018, 22:28**\r\nyndx-antoshkka, да, я в самом первом посте писал о months, я что-то был невнимателен и не заметил что в ответе вы уже другой тип использовали. к инаму месяца у меня вопросов нет) И да, второе замечание которое вытекает из первого - months и month будут все путать, они даже в одном неймспейсе :D\r\n\r\n\r\n**yndx-antoshkka, 7 декабря 2018, 11:05**\r\nVladimir Smirnov, автор Calendars and Time Zones ответил:\r\n```\r\nI think I spent about two full months just on the day/days/month/months/year/years name problem. In the end, this was the best I could come up with.\r\n\r\nI wanted the duration naming to be consistent with our current duration naming pattern: nanoseconds, microseconds, milliseconds, seconds, minutes and hours. I.e. a plural unit.\r\n\r\nI decided against average_months because months (and years) actually does double duty. It is useful both in chronological computations and calendrical computations. The downside is that no one thinks in terms of these two different types of computations, and yet they _are_ both useful, and so we have an education problem.\r\n\r\nHere is a SO answer that goes into quite a bit more detail comparing and contrasting chronological and calendrical computations with months:\r\n\r\nhttps://stackoverflow.com/a/43018120/576911\r\n\r\nIf months was named average_months, then there would be a confusing use with calendrical arithmetic, e.g.:\r\n\r\n 2018y/December/3 + average_months{6};\r\n\r\nvs:\r\n\r\n 2018y/December/3 + months{6};\r\n\r\nIf we had two different types of months: 1 for chronological computations named average_months and one for calendrical computations named months, that too would raise confusion (and increase the size of the apparent API).\r\n\r\nI know that the status-quo also raises confusion, but I believe it raises less confusion than the alternatives. Once educated about the difference between chronological and calendrical computations (as done by https://stackoverflow.com/a/43018120/576911), I believe that the confusion to the average programmer will be reduced.\r\n\r\nHoward\r\n```\r\n \r\n\r\n \r\n\r\nЕсли есть идеи, как исправить или улучшить текущее положение - говорите, автор рад будет услышать рац. предложения.\r\n\r\n\r\n**Vladimir Smirnov, 7 декабря 2018, 13:29**\r\nyndx-antoshkka,\r\n\r\nМне все равно не нравится в текущем смысле что прибавление одной и той же сущности дает разное поведение.\r\n\r\nЭто в моем понимании, как если перегруженные функции немного по-разному себя ведут.\r\n\r\n \r\n\r\nМое предложение, иметь два типа, которые не допускают перекрестного сложения:\r\n\r\n-calendar_months (можно складывать с календарями)\r\n\r\n-average_months( можно складывать с time_pointa-ами)\r\n\r\nmonths убрать вовсе.\r\n\r\n \r\n\r\n\r\n**yndx-antoshkka, 11 декабря 2018, 11:39**\r\nVladimir Smirnov, подработал и предложил вашу идею Говарду:\r\n\r\n============================\r\n```\r\nHello again,\r\n\r\nI've talked with people and here are the conclusions (with a lot of ironong from myself):\r\n\r\nAt the moment we have multiple major different domains:\r\n* durations\r\n* time_points\r\n* calendars\r\n\r\nWhile the operations stay in the same domain, there's no problem. Problems arise when the name from one domain sounds like a name from other domain or when calendars and duration domains meet. In last case current wording attempts to predict the behavior the user wants, which randomly succeeds. So the idea is to make operations between calendar and duration domains more explicit.\r\n\r\nTo separate the domains the following changes could be applied:\r\n* add chrono::duration types average_days, average_months, average_years, average_weeks\r\n* Drop weeks and rename days, months, years to calendar_days, calendar_months, calendar_years throughout the [time]\r\n* Make those calendar_* types a separate types, not the chrono::duration ones:\r\n\r\nclass calendar_months {\r\nint value;\r\npublic:\r\n...\r\n};\r\n\r\n* add operators to year_month_day that work with calendar_days (calendar_days are not convertible to sys_­days any more)\r\n* [optional] you could drop day and year and use calendar_days and calendar_years instead (this will keep the amount of types exactly the same, as before all the changes)\r\n\r\nNow with that API the following surprising constructions will change behavior:\r\n\r\nsystem_clock::now() + months{1}; // Fails to compile. No more months...\r\nsystem_clock::now() + average_months{1}; // returns duration, explicit, not surprising (mostly)\r\nsystem_clock::now() + calendar_months{1}; // returns year_month_day{now()} + calendar_months{1}.... and we loose the hours,minutes and seconds :( But at least in a more explicit way\r\n\r\ncalendar_days{31} + system_­clock::now(); // returns year_month_day\r\naverage_days{31} + system_­clock::now(); // returns duration\r\n\r\naverage_days{31} - average_days{1} + system_­clock::now(); // returns duration\r\ncalendar_days{31} - calendar_days{1} + system_­clock::now(); // returns year_month_day{now()} + 30 days\r\n\r\naverage_days{31} - calendar_days{1} + system_­clock::now(); // comile time error\r\ncalendar_days{31} - average_days{1} + system_­clock::now(); // comile time error\r\ncalendar_days{31} + system_­clock::now() - average_days{1}; // comile time error\r\n-average_days{1} + system_­clock::now() + calendar_days{31}; // year_month_day\r\nsystem_­clock::now() - average_days{1} + calendar_days{31}; // year_month_day\r\nsystem_­clock::now() + calendar_days{31} - average_days{1}; // comile time error\r\n\r\nFriday - Monday + 20s; // fails to compile, no calendar_days + duration overload\r\n\r\nsystem_­clock::now() - average_years{1990}; // returns duration\r\nsystem_­clock::now() - calendar_years{1990}; // returns year_month_day{now()} - calendar_years{1990}\r\n\r\n(2018y/March - 2018y/February) + system_­clock::now(); // returns year_month_day\r\nsys_days{2018y/March - 2018y/February}+ system_­clock::now(); // OK, explicit\r\n\r\nMonday + 10s; // fail to compile\r\n\r\n(March - February) + system_­clock::now(); // returns year_month_day\r\nsys_days{March - February} + system_­clock::now(); // returns duration, surprising :(\r\n1/Febuary + 20ns; // fails to compile\r\n\r\nauto birth_time = 2018y/February/1 + average_months{9} // compile time error\r\nauto birth_time = sys_days{2018y/February/1} + average_months{9} // OK, sys_days returned\r\n\r\n\r\nProposed changes prefer calendar types if at least one of the operands is calendar (because writing seconds{X} or sys_time{X} is shorter than writing year_month_day{X} and because year_month_day explicitly says that it does not store hours, minutes, seconds).\r\n\r\nNow we have implicit operations for time_point <=> calendars, time_point <=> durations; and explicit operations required for durations <=> calendars.\r\n\r\nHow do you feel about the proposed changes? Do they improve things or, just break the whole word?\r\n```\r\n============================\r\n\r\n \r\n\r\nВыяснилось, что данный подход очень плох:\r\n\r\n============================\r\n```\r\nThis is a pretty radical redesign that violates several of my design principles and has no field experience.\r\n\r\n* It increases the apparent API by adding more types that have nearly identical semantics.\r\n\r\n* It introduces lossy arithmetic (expression which implicitly loose information).\r\n\r\n* It significantly complicates the algebra among chronological and calendrical types, in some of your examples even breaking the type system, e.g. sys_days{March - February}.\r\n\r\n* It hides the relatively expensive conversion between the chronological representation and the calendrical representation. This point is discussed further here:\r\n\r\nhttps://github.com/HowardHinnant/date/wiki/FAQ#day_arithmetic\r\n\r\nI’m quoting the last few paragraphs of this note for emphasis:\r\n\r\n> This philosophy is similar to that which we have for containers: It would be super easy to create vector::push_front(const T&). But that would make it too easy for programmers to write inefficient code. The compiler helps remind the programmer that perhaps deque or list would be a better choice when he attempts to code with vector::push_front(const T&).\r\n>\r\n> It would be very easy to add T& list::operator[](size_t index). But that would encourage the programmer to use list when a random-access container would probably be more appropriate for the task.\r\n>\r\n> This library continues in that tradition: The expensive operations are not hidden.\r\n\r\n\r\nThe status-quo is easy to learn:\r\n\r\n1. If you’re doing arithmetic with a time_point, you’re doing a chronological computation.\r\n\r\n2. If you’re doing arithmetic with a calendrical type, you’re doing a calendrical computation.\r\n\r\n3. months and years can be used in both chronological and calendrical computations.\r\n\r\n4. If you want to convert between the calendrical and chronological domains, it must be done at the day-precision level.\r\n\r\n5. Day-precision arithmetic in the calendrical domain is a compile-time error because it is gratuitously inefficient to implement such arithmetic (like list::operator[](size_t index)).\r\n\r\nSorry, I can not propose these changes.\r\n\r\nHoward\r\n```\r\n============================\r\n\r\n\r\n**Vladimir Smirnov, 13 декабря 2018, 16:00**\r\nАнтон, спасибо вам за формулировки и переписку! Я благодарен за ваши попытки.\r\n\r\nМотивация Говарда мне понятна. \r\n\r\nЧто ж, придется тогда с этим жить, если и у комитета возражений не возникнет.\r\n\r\nВ целом, я так понял, в нашем с ним разном представлении о \"nearly identical semantics\". Надеюсь, мое видение окажется скорее исключением :)\r\n\r\n \r\n\r\n \r\n\r\n\r\n**adler3d, 29 ноября 2018, 2:14**\r\nВ С++ нужно заменит символы для обжатия шаблонных параметров на что-то другое, т.к они не дружат с макросами. А ещё если делать свой компилятор С++ то можно заметить, что они вот прям на ровном месте адово всё усложняют. Предлагаю сначала пропихнуть в стандарт новый вариант символов, а затем через лет 10 пометить старый как deprecated или даже сразу.\r\n\r\n \r\n\r\nPS: символы для обжатия шаблонных параметров - это \"<\" и \">\".\r\n\r\n\r\n**yndx-antoshkka, 29 ноября 2018, 13:31**\r\nadler3d, вроде бы сегондя не April/1\r\n\r\n\r\n**adler3d, 2 декабря 2018, 19:43**\r\nhttps://gamedev.ru/flame/forum/?id=185614\r\n\r\n\r\n**yndx-antoshkka, 7 декабря 2018, 19:18**\r\nadler3d, Символы поменять никто не согласится. Если есть случаи, когда понятно что хотел написать разработчик, но грамматика C++ не справляется - то это исправимо и надо написать подробный пример. Если не понятно что хотел написать разработчик, то исправлять надо не стандарт C++.\r\n\r\nПо приведённой ссылке - проблема с макросами и запятыми между <>. Данная проблема давно известна и не требует исправления, так как исправления поломают имеющийся код с макросами. Аналогичная проблема, если в макросы передавать блоки кода с оператором запятая.\r\n\r\nВышеозвученные проблемы - это одни из причин, по которым все разработчики C++ не рекомендуют использовать макросы в C++.\r\n\r\n\r\n**Олег Власов, 10 декабря 2018, 17:54**\r\nМеня немного волнует, что пустые std::map и std::set аллоцируют память. Это странно и не правильно.\r\n\r\n\r\n**yndx-antoshkka, 11 декабря 2018, 12:00**\r\nОлег Власов, а в какой именно стандартной библиотеке?\r\n\r\nЯ проверил парочку - map и set не аллоцируют память. По стандарту noexcept не прописан для дефолтных конструкторов deque, list, forward_list, [multi]map, [multi]set, unordered_[multi]map и unordered_[multi]map.\r\n\r\nДля deque и unordered_* контейнеров прописать подобное возможно будет неверным, а вот для остальных контейнеров я не вижу преград (если конечно не найдётся имплементация, которая в дефолтном конструкторе аллоцирует).\r\n\r\n\r\n**Олег Власов, 11 декабря 2018, 15:43**\r\nyndx-antoshkka, Я ссылался на статью https://habr.com/company/1c/blog/429678/ \r\nЯ заглянул в исходники стандартной библиотеки, реализация Visual c++, мне показалось, что там происходит аллокация памяти, но могу ошибаться. Я поверхностно посмотрел.\r\n\r\n\r\n**Andrey Davydov, 12 декабря 2018, 22:15**\r\nОлег Власов, так сделано у Microsoft, память выделяется под end node (на который указывает .end()). Из-за этого и move-конструкторы map'а, set'a и list'а тоже аллоцируют и не помечены как noexcept. Это сделано, чтобы splice (а начиная с C++11 и move) не инвалидировал итераторы.\r\n\r\n\r\n**yndx-antoshkka, 19 декабря 2018, 11:27**\r\nNote: стоит поправить вот это std::bit_cast должен проверять выравнивание\r\n\r\n\r\n**Andrey Davydov, 6 января 2019, 13:57**\r\nХотелось бы прояснить в стандарте, разрешена ли перегрузка деструктора, если да, то, наверное, есть смысл явно добавить пример в стандарт.\r\n```cpp\r\n#include \r\n\r\ntemplate\r\nstruct Y {\r\n ~Y() requires(std::is_trivially_destructible_v) = default;\r\n ~Y() {}\r\n};\r\n\r\nstruct A {};\r\nstruct B { ~B(); };\r\n\r\nstatic_assert(std::is_trivially_destructible_v>);\r\nstatic_assert(!std::is_trivially_destructible_v>);\r\n```\r\nВ данный момент и GCC и Clang отвергают этот код: https://gcc.godbolt.org/z/nqklnE но я не нашел, где бы в стандарте это запрещалось. У GСС есть bug на подобный случай (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67348) от 2015-го года, ссылающийся на Concepts TS, однако, по-моему, это не соответствует текущему черновику стандарта.\r\n\r\n\r\n**Andrey Davydov, 6 января 2019, 14:15**\r\nЯ бы выразился даже сильнее -- оба компилятора ведут себя однозначно неверно: у GCC ICE, Clang кушает такое:\r\n```cpp\r\n#include \r\n\r\ntemplate\r\nstruct Y {\r\n ~Y() requires(std::is_trivially_destructible_v) = default;\r\n ~Y() {}\r\n};\r\n\r\nstruct B { ~B(); };\r\n\r\nstatic_assert(std::is_trivially_destructible_v> && \r\n !std::is_nothrow_destructible_v>);\r\n```\r\n\r\n**Andrey Davydov, 7 января 2019, 22:09**\r\nНашел proposal 2017-го года в котором это обсуждается: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0848r0.html. Было бы очень интересно узнать, что именно предлагалось по ссылкам [2] и [3], но у меня нет прав читать \"секретную переписку коммитетчиков\".\r\n\r\n\r\n**yndx-antoshkka, 24 января 2019, 17:07**\r\nAndrey Davydov, завёл багу на GCC https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89036 и на Clang https://bugs.llvm.org/show_bug.cgi?id=40437\r\n\r\nПочитать переписку по тем ссылкам я тоже не смог, но на последнем заседании обсуждали эту бумагу и она должна попасть в C++20.\r\n\r\n \r\n\r\n \r\n\r\n\r\n**Andrey Davydov, 24 января 2019, 17:33**\r\nyndx-antoshkka, для GCC уже был баг: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67348\r\n\r\nА к переписке доступ мне дали, но там нет ничего особо ценного, в бумаге все нужное есть. Будет хорошо, если примут.\r\n\r\n\r\n**Vladimir Smirnov, 20 января 2019, 14:40**\r\nЧто-то меня смущает предложение по настроке build-level для контрактов.\r\n\r\nнапример, я хочу сделать сборку, в которой мой код будет проверять все контракты с максимальным уровнем. Но при этом я не хочу, чтобы шла проверка контрактов в стандартной библиотеке, например в operator [] на то что контейнер не пустой.\r\n\r\nВ текущем предложении build-level хоть и implementation-defined, но тем не менее подразумевается, что он единый на всю единицу трансляции.\r\n\r\nОбщая идея такая - я хочу в релизной конфигурации, которая уходит пользователям, оставить проверки, которые будут например кидать exception/писать в лог, если что-то сильно пошло не так. При этом я не хочу этих проверок в стандартной библиотеке (когда они там появятся - а ведь появятся же!). Что мне делать?\r\n\r\n \r\n\r\n\r\n**yndx-antoshkka, 24 января 2019, 17:09**\r\nVladimir Smirnov, это тянет на целую новую идею. На подобное надо писать отдельный proposal, в качестве замечания она не пройдёт в комитете.\r\n\r\n\r\n**languagelawyer, 1 февраля 2019, 4:52**\r\nВ C++20 фиксировали представление целых чисел, но не сделали поведение следующего кода определённым\r\n```cpp\r\nint i = -1;\r\nauto u = reinterpret_cast(i);\r\n```\r\n\r\n**yndx-antoshkka, 1 февраля 2019, 10:36**\r\nlanguagelawyer, не делайте так. Делайте вот так:\r\n```\r\nint i = -1;\r\nauto u = static_cast(i);\r\n```\r\n\r\n**Andrey Davydov, 11 февраля 2019, 21:51**\r\nХотелось бы прояснить (а скорее запретить) использование requires-clause в template alias declaration. Сейчас, грамматически разрешено писать так: \r\n```cpp\r\ntemplate\r\n requires(condition)\r\nusing enable_if_t = T;\r\n```\r\n\r\nи на первый взгляд может показаться, что это работает, во всяком случае при попытке проинстанцировать enable_if_t компилятор ругнется \"constraints not satisfied...\" . Однако если подставлять в enable_if_t, мы получим на выходе some-type, requires-clause будет благополучно проглочено (что, в принципе, ожидаемо, учитывая природу type alias'ов). Например, такой код\r\n```cpp\r\ntemplate>\r\nvoid foo();\r\n\r\nvoid test() {\r\n foo();\r\n}\r\n```\r\nскомпилируется.\r\n\r\n\r\n**yndx-antoshkka, 12 февраля 2019, 13:02**\r\nAndrey Davydov, я надеюсь что это ошибка в компиляторах. Например в таком виде clang правильно не собирает: https://godbolt.org/z/WJQzSw\r\n\r\nна всякий случай завёл багрепорты на GCC https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89301 и Clang https://bugs.llvm.org/show_bug.cgi?id=40700\r\n\r\nПосмотрим что скажут\r\n\r\n\r\n**Andrey Davydov, 12 февраля 2019, 13:15**\r\nyndx-antoshkka, Ричард Смит считает также: https://groups.google.com/a/isocpp.org/d/msg/std-discussion/Bwh2d3i8GhE/rHM58wAkGQAJ. К сожалению, я не смог ему ответить из-за чертовых Google Groups, однако такой подход дает новый источник equaivalent but functionally not equivalent функций, к примеру:\r\n```cpp\r\ntemplate requires(sizeof(T) < sizeof(int))\r\nusing lt_int = T;\r\n\r\ntemplate requires(sizeof(T) > sizeof(int))\r\nusing gt_int = T;\r\n\r\ntemplate void foo(lt_int);\r\ntemplate void foo(gt_int);\r\n\r\nvoid test() {\r\n foo(1);\r\n foo(1);\r\n}\r\n```\r\n\r\n**Anton Kudryavtsev, 9 марта 2019, 16:53**\r\nпочему нет constexpr версии для std::accumulate?\r\n\r\nhttps://en.cppreference.com/w/cpp/algorithm/accumulate\r\n\r\n\r\n**yndx-antoshkka, 11 марта 2019, 16:23**\r\nAnton Kudryavtsev, я не успел добавить constexpr к [numeric.ops.overview]\r\n\r\nЗамечанием к C++20 это не исправить, нужно писать отдульную бумагу, уже для C++23.\r\n\r\n\r\n**yndx-antoshkka, 11 марта 2019, 16:18**\r\nВ копилку к замечаниям: Починить std::invoke_result_t\r\n\r\n\r\n**Aleksey Miklin, 13 марта 2019, 19:11**\r\nНесколько смущает отсутствие в C++ универсальной нешаблонной неконстантной ссылки:\r\n```cpp\r\nstruct Foo\r\n{\r\n void nonConst(){}\r\n};\r\n\r\nvoid f(Foo& foo){ foo.nonConst(); }\r\nvoid f(Foo&& foo){ foo.nonConst(); }\r\n// It would be nice to have a non-template universal reference to avoid code duplication above:\r\n// void f(Foo&&& foo){ foo.nonConst(); }\r\n\r\nvoid sample()\r\n{\r\n Foo foo;\r\n f(foo);\r\n\t\r\n f(Foo{});\r\n}\r\n```\r\n \r\n\r\n \r\n\r\n\r\n**WPMGPRoSToTeMa, 13 марта 2019, 20:34**\r\nДолжен ли `std::flat_map` иметь `operator[]`? Как мне кажется лучше убрать `operator[]` из него, слишком он уж error-prone. Вообще по идее в C++ можно добавить `operator[]=` не ломая старый код, так что мне кажется тем более не стоит добавлять `operator[]` для `std::flat_map`.\r\n\r\n\r\n**WPMGPRoSToTeMa, 14 марта 2019, 23:34**\r\nЕсли быть точнее, то `const` версию оставить, а non-const версию убрать.\r\n\r\n\r\n**WPMGPRoSToTeMa, 18 марта 2019, 13:45**\r\nСам себя запутал, никакой `const` версии у `std::flat_map::operator[]` нет. В общем-то проблема в том, что если делаем нормальный `operator[]` у `std::flat_map`, то тогда получится различие в интерфейсе с `std::[unordered_]map`, вопрос в том насколько это принципиально. Причём даже если и делать нормальный `operator[]`, то встаёт вопрос об исключениях, ибо по умолчанию в std операторы их не бросают, но будет ли в этом смысл если примут zero-overhead deterministic exceptions? Возможно что всё-таки придётся оставить без выброса исключений. А пока этот пропозал не приняли можно оставить там UB в случае получения доступа к несуществующему элементу.\r\n\r\n\r\n**I'm not a bot, 1 октября 2019, 12:46**\r\nБаг, нельзя вызывать шаблон коасса без как функцию\r\nКопилятор не понимает что происходит и отрубает подстветку после перезагрузки.\r\n\r\n\r\n**Andrey, 17 октября 2019, 23:40**\r\nКонцепция discarded деклараций (http://eel.is/c++draft/module#def:discarded,declaration) представляет большую сложность для IDE и прочих желающих \"схалявить\". Рассмотрим кусочек примера из стандарта (http://eel.is/c++draft/module#global-6.example-1)\r\n```cpp\r\n// foo.h\r\nnamespace N {\r\n struct X {};\r\n int h(X);\r\n}\r\n\r\n// M.ixx\r\nmodule;\r\n#include \"foo.h\"\r\nexport module M;\r\ntemplate int use_h() {\r\n N::X x; // N​::​X, N, and ​::​ are decl-reachable from use_­h\r\n return h((T(), x)); // N​::​h is not decl-reachable from use_­h, but\r\n // N​::​h is decl-reachable from use_­h\r\n}\r\nint k = use_h();\r\n```\r\nдля того чтобы понять, что N::h не должна быть discarded нужно заглянуть в инициализатор k (обычно IDE этого не делает, если только k не constexpr или его тип не надо выводить) и проинстанцировать use_h, причем не только сигнатуру но и тело.\r\n\r\nВ принципе, можно взять пример даже попроще, без шаблонов:\r\n```cpp\r\n// foo.h\r\nvoid foo();\r\n// M.ixx\r\nmodule;\r\n#include \"foo.h\"\r\nexport module M;\r\nexport inline void bar() {\r\n foo();\r\n}\r\n```\r\nЧтобы узнать, что foo не должна быть discarded, надо заглянуть в тело функции bar. Обычно IDE просто пропускает тела функций, если только это не constexpr-функция или не функция с deducible return type.\r\n\r\nМожно сказать, что это проблемы разработчиков IDE, которые никого не волнуют, но есть и другой взгляд на ситуацию: то что написано внутри тела функции или инициализатора переменной (не constexpr и не требующей вывода типа) не должно влиять на интерфейс модуля. А по факту, множество non-discarded деклараций входит в интерфейс модуля.\r\n\r\nПредлагаемое решение: разрешить имплементациям считать функции non-discarded даже если они не являются decl-reachable. Это приемлимо, так как модули уже и так в некоторые моменты разрешают компилятору делать так как будет для него эффективнее. Во-первых, в том же определении decl-reachable есть довольно большая степень своботы (пункты 3.6--3.9) http://eel.is/c++draft/module#global-3.6, во-вторых в определении instantiation context (http://eel.is/c++draft/module#context-7.example-1).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811945979/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811976029", + "html_url": "https://github.com/cpp-ru/ideas/issues/374#issuecomment-811976029", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/374", + "id": 811976029, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTk3NjAyOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T15:12:43Z", + "updated_at": "2021-04-01T15:12:43Z", + "author_association": "MEMBER", + "body": "Что успели, обсудили с авторами предложений и передали в комитет. Результаты работы: https://habr.com/ru/company/yandex/blog/474716/", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811976029/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811977001", + "html_url": "https://github.com/cpp-ru/ideas/issues/375#issuecomment-811977001", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/375", + "id": 811977001, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTk3NzAwMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T15:14:18Z", + "updated_at": "2021-04-01T15:14:18Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 9 декабря 2018, 20:02**\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1278r0.html", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811977001/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811978563", + "html_url": "https://github.com/cpp-ru/ideas/issues/376#issuecomment-811978563", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/376", + "id": 811978563, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTk3ODU2Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T15:16:35Z", + "updated_at": "2021-04-01T15:16:35Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 21 ноября 2018, 17:13**\r\nИдея супер. Но есть ещё проблема с emplace_back - он требует чтобы тип данных был MoveConstructible, из-за чего вышеприведённый пример не собирается: https://godbolt.org/z/ITQ6Eh\r\n\r\n\r\n**Андрей Руссков, 22 ноября 2018, 15:38**\r\nyndx-antoshkka, да, мой косяк. Засунуть в вектор не-MoveInsertable элемент в вектор видимо не получится. Но в любом случае в векторе может быть тип, для которого не подходит один из вариантов resize/erase, а ограничения для них более серьезные, чем нужны для truncate, поэтому актуальность он не потеряет", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811978563/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811980937", + "html_url": "https://github.com/cpp-ru/ideas/issues/377#issuecomment-811980937", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/377", + "id": 811980937, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTk4MDkzNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T15:20:03Z", + "updated_at": "2021-04-01T15:20:03Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 29 ноября 2018, 18:28**\r\nПишите вместо `= delete` `requires(false)`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811980937/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811983559", + "html_url": "https://github.com/cpp-ru/ideas/issues/378#issuecomment-811983559", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/378", + "id": 811983559, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTk4MzU1OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T15:24:08Z", + "updated_at": "2021-04-01T15:24:08Z", + "author_association": "MEMBER", + "body": "**Айдар Фаттахов, 2 февраля 2019, 14:41**\r\nПочему это не проблема компиляторов?\r\n\r\n\r\n**yndx-antoshkka, 22 июля 2020, 12:05**\r\nЭто скорее проблема ABI\r\n\r\nПопробуйте зарепортить её сюда https://github.com/itanium-cxx-abi/cxx-abi", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811983559/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811984770", + "html_url": "https://github.com/cpp-ru/ideas/issues/379#issuecomment-811984770", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/379", + "id": 811984770, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMTk4NDc3MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T15:25:58Z", + "updated_at": "2021-04-01T15:25:58Z", + "author_association": "MEMBER", + "body": "**Александр Коновалов, 6 января 2019, 20:52**\r\nМ.б. ошибаюсь, но что-то похожее среди предложений я видел.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/811984770/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812103244", + "html_url": "https://github.com/cpp-ru/ideas/issues/376#issuecomment-812103244", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/376", + "id": 812103244, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjEwMzI0NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T18:50:35Z", + "updated_at": "2021-04-01T18:50:55Z", + "author_association": "MEMBER", + "body": "Нужно больше мотивации и примеров, где это может быть полезным", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812103244/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812166172", + "html_url": "https://github.com/cpp-ru/ideas/issues/277#issuecomment-812166172", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/277", + "id": 812166172, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjE2NjE3Mg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T20:52:58Z", + "updated_at": "2021-04-01T20:52:58Z", + "author_association": "MEMBER", + "body": "В С++17 уже можно писать так.\r\n\r\n```cpp\r\nstd::array arr{ \r\n []() constexpr {\r\n std::array arr {};\r\n for(int i = 0; i < arr.size(); i++) {\r\n arr[i] = i * i;\r\n }\r\n return arr;\r\n }\r\n }()\r\n};\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812166172/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812185376", + "html_url": "https://github.com/cpp-ru/ideas/issues/380#issuecomment-812185376", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/380", + "id": 812185376, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjE4NTM3Ng==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T21:35:15Z", + "updated_at": "2021-04-01T21:35:15Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 4 апреля 2019, 15:41**\r\nЭта идея уже обсуждается http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1005r0.html\r\n\r\n\r\n**Игорь Шаповал 4 апреля 2019, 20:25**\r\nЕсть надежды что это попадет в стандарт. Ведь это такая маленькая вещь.\r\n\r\n\r\n**Alrott SlimRG 21 января, 11:42**\r\nИтак целая путаница с данной библиотекой\r\nЛучше уж оставвить \r\n\r\nstd::filesystem\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812185376/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812215454", + "html_url": "https://github.com/cpp-ru/ideas/issues/381#issuecomment-812215454", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/381", + "id": 812215454, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjIxNTQ1NA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T22:41:44Z", + "updated_at": "2021-04-01T22:41:57Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 4 апреля 2019, 15:38**\r\nНечто подобное есть в Boost https://www.boost.org/doc/libs/1_69_0/doc/html/thread/sds.html\r\n\r\nИдея интересная, если готовы взяться - стоит проверить что подобные идеи раньше не предлагались и начать писать предложение.\r\n\r\n\r\n**valera_ee 4 апреля 2019, 22:04**\r\nyndx-antoshkka, Чтобы убедиться в работоспособности я сделал простенький вариант с простым тестом (проект на Qt 5):\r\n https://github.com/ValeraMikhaylovsky/thread_safe_ptr\r\n\r\nЕсли идея вам покажется интересной, то готов услышать критику по реализации и продолжить работу в этом направлении.\r\n\r\n\r\n**valera_ee 4 апреля 2019, 22:14**\r\nПосмотрел на boost::synchronized_value , идея таже, но реализация, на мой взгляд, не самая удобная. В реализации boost нужно вручную прописывать блокировку через RAII boost::strict_lock_ptr, по запарке можно и забыть, особенно если над проектом коллектив трудится. В моём варианте блокировка выполняется автоматически при доступе к ресурсу. Я не являюсь автором этой идею, реализацию увидел на хабре:\r\nhttps://habr.com/ru/post/184436/\r\nhttps://habr.com/ru/post/328348/\r\n\r\n\r\n\r\n\r\n**valera_ee 5 апреля 2019, 7:20**\r\nvalera_ee, Более внимательно посмотрел почему используют RAII в boost, проверил свой указатель на dedadlock и получил его при следующем коде:\r\n```cpp\r\nthread_safe_ptr pObject(std::make_shared());\r\n\r\npObject->setValue(3);\r\n\r\nif (pObject->valid() && pObject->method()) {\r\n // to do\r\n} \r\n```\r\nНо, конкретно в этом случае, если модифицировать код в стиле с++17, deadlock не происходит:\r\n```cpp\r\nif (bool t_ok = pObject->valid(); t_ok && pObject->method()) {\r\n // to do\r\n}\r\n```\r\n\r\n\r\n\r\n**valera_ee 5 апреля 2019, 8:33**\r\nПовторил тест на deadlock для варианта sf::safe_ptr ( https://habr.com/ru/post/328348/ ), там эта проблема решена.\r\n\r\n\r\n**valera_ee 5 апреля 2019, 13:33**\r\nРешение проблемы выполнено через рекурсивный мьютекс, скорость, конечно, не большая, но вариант рабочий, для ускорения можно рекурсивный вариант спинлока заиспользовать.\r\n\r\n\r\n**Олег Власов 5 апреля 2019, 11:54**\r\nВроде в С++20 хотят добавить atomic_shared_ptr\r\n\r\ncppreference.com\r\n\r\n\r\n**valera_ee 5 апреля 2019, 13:35**\r\nОлег Власов, Я читал, но если я правильно понял, там доступ не к ресурсам, а к методам сомого shared_ptr будет потокобезопасным, если не прав поправьте меня.\r\n\r\n\r\n**Олег Власов 10 апреля 2019, 19:33**\r\nvalera_ee, Я поподробнее прочитал про atomic_shared_ptr. Ты прав, он защиает сам shared_ptr, а не то на что указывает.\r\n\r\n\r\n\r\n**valera_ee 7 апреля 2019, 16:05**\r\nОбновил код на github как самого указателя так и теста, в текущем исполнении меня полностью устраивает поведение умного указателя. Хотелось бы услышать мнение разработчиков, которые более глубоко разбираются в теме многопоточного программирования.\r\n\r\n\r\n\r\n**LevSch 8 августа 2019, 17:10**\r\nОсновной его недостаток в том, что между двумя вызовами методов, инвариант объекта может измениться. И блокировать на каждом методе медленно, если несколько методов подряд вызывается.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812215454/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812215717", + "html_url": "https://github.com/cpp-ru/ideas/issues/382#issuecomment-812215717", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/382", + "id": 812215717, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjIxNTcxNw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T22:42:34Z", + "updated_at": "2021-04-01T22:42:34Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 1 апреля 2019, 13:02**\r\nВ таком виде функционал получается достаточно узкоприменимым. Более общее решение - метаклассы, через которые можно добиться аналогичного:\r\n```cpp\r\n// Псевдокод\r\n$class $try_catch {\r\n for(auto& m: this->functions()) {\r\n if (!m.is_noexcept()) {\r\n // add try{ } catch()\r\n }\r\n }\r\n}\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812215717/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812215902", + "html_url": "https://github.com/cpp-ru/ideas/issues/383#issuecomment-812215902", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/383", + "id": 812215902, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjIxNTkwMg==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T22:43:06Z", + "updated_at": "2021-04-01T22:43:06Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka 1 апреля 2019, 13:26**\r\nСомневаюсь что есть единый формат вывода, который всех устроит. Из-за этого у стандартных контейнеров (например у std::vector) нет оператора вывода в поток.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812215902/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812216463", + "html_url": "https://github.com/cpp-ru/ideas/issues/384#issuecomment-812216463", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/384", + "id": 812216463, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjIxNjQ2Mw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T22:44:59Z", + "updated_at": "2021-04-01T22:44:59Z", + "author_association": "MEMBER", + "body": "**Дмитрий 28 марта 2019, 11:23**\r\nТам кажется были конфликты с атрибутами.\r\n\r\nХочется написать \r\n```cpp\r\nstd::tuple> t;\r\nconst auto& [[x,y]] = t;\r\n```\r\n, но двойные квадратные скобки это атрибут, а его сейчас компиляторы вольны игнорировать вообще.\r\n\r\nЕсли не ошибаюсь даже кейс \r\n```cpp\r\nstd::tuple, int> t;\r\nconst auto& [[x, y], z] = t;\r\n```\r\nбудет пробовать спарситься как атрибут. \r\n\r\n\r\n**m0xf 31 марта 2019, 21:52**\r\nЧтобы небыло конфликтов, можно ставить пробел между скобками.\r\n\r\n\r\n**Даниил Милютин 2 апреля 2019, 1:48**\r\nБыло бы здорово...\r\nУ меня как раз со structured binding был момент. Поделюсь опытом.\r\nРешил я написать свой zip коллекций. В итоге его успешно взял [отсюда](https://gist.github.com/mortehu/373069390c75b02f98b655e3f7dbef9a)\r\n\r\nПроблема была в том, что я использовал zip с постоянными коллекциями примерно так :\r\n```cpp\r\nfor(auto x: vec_x)\r\n do_smth_by_nonconst_ref(x); // ok\r\n\r\n// Однако...\r\nfor(auto [x,y]: zip(vec_x, vec_y))\r\n do_smth_by_nonconst_ref(x); // error\r\n````\r\nПолчается, что семантика нарушается. И причина как раз в том как работает SB.\r\n\r\nВышло так, что zip::iterator при разименовании возващает не tuple значений, а tuple const ссылок. \r\nЯ же семантически хотел такого поведения:\r\n```cpp\r\nstd::tuple rxy = ...;\r\nauto [x, y] = rxy;\r\n//=> typeof x is X;\r\n//=> typeof y is Y;\r\n// but the truth is ...\r\n//=> typeof x is X&;\r\n//=> typeof y is Y&;\r\n```\r\nВопрос в том как будет в этом случае работать вложенный structured binding?\r\nЕсли по старинке, то он будет набором ссылок.\r\nМожно было бы внести предлагаемую семантику.\r\n\r\nДумаю, мой комментарий тянет на пропозал. \r\nНашёл похожий вопрос здесь.\r\nКакие за и против в желаемом поведении?\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812216463/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812217177", + "html_url": "https://github.com/cpp-ru/ideas/issues/385#issuecomment-812217177", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/385", + "id": 812217177, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjIxNzE3Nw==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T22:47:15Z", + "updated_at": "2021-04-01T22:47:30Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov 21 марта 2019, 13:08**\r\n1 Предлагается именно что expansion statement (тот случай когда название proposal'а действительно хорошо описывает его содержимое) а все expansion-ы в С++ делаются с помощью \"`...`\". Вы правы в том, что for... не похож на `sizeof...`, но это именно потому, что `sizeof...` выбивается из общего правила.\r\n\r\n2 `for (meta::info member : members) { ... }`\r\n\r\nСмотрите при итерации по массиву у нас есть 3 разных use case:\r\n\r\na) обычный runtime-цикл по массиву (используем обычный for),\r\n\r\nб) мы хотим явно сделать loop-unrolling, так как размер массива известен в compile-time, естественно имеет смысл только для небольших массивов; в обеих версиях p1306 для этого предлагается использовать `for...`,\r\n\r\nв) элементы массива это compile-time константы и мы хотим работать с ними как compile-time константами, для этого надо сделать во-первых loop-unrolling, во-вторых указать, что получаемый элемент constexpr, в p1306r0 как раз для этого использовался for constexpr, в p1306r1 справедливо решили что еще синтаксис для цикла for не нужен и можно использовать `for...` + `constexpr` на элементе `for`-а.\r\n\r\n\r\n\r\n**Игорь Шаповал 21 марта 2019, 22:46**\r\nНо в предложении к static reflection хотят сделать for constexpr а не for... Два синтаксиса вводить глупо.\r\n\r\nА сделать один for constexpr будет классно.\r\n\r\n\r\n**Andrey Davydov 22 марта 2019, 11:56**\r\nИгорь Шаповал, какое именно предложение Вы имеете в виду? Дайте, пожалуйста, точную ссылку. Конечно, никому не хочется иметь 2 синтаксиса, но это, вроде и не требуется.\r\n\r\n\r\n**Игорь Шаповал 22 марта 2019, 18:26**\r\nstatic reflection http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2019/p0953r2.html\r\n\r\n\r\n**Andrey Davydov 22 марта 2019, 18:45**\r\nИгорь Шаповал, этот proposal не предлагает добавить constexpr for а ссылается как раз-таки на proposal Andrew Sutton'a так что проблемы с несогласованными for... и for constexpr нет.\r\n\r\n\r\n**Игорь Шаповал 22 марта 2019, 19:01**\r\nfor constexpr как друг if constexpr очень выглядит красиво. Я думаю нужно быть последовательным. if constexpr - C++17, for constexpr - C++20.\r\n\r\n\r\n**Игорь Шаповал 3 апреля 2019, 8:52**\r\nyndx-antoshkka, скажите что нам ожидать - for...() или for constexpr() ?\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812217177/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812217844", + "html_url": "https://github.com/cpp-ru/ideas/issues/386#issuecomment-812217844", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/386", + "id": 812217844, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjIxNzg0NA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-01T22:49:29Z", + "updated_at": "2021-04-01T22:49:29Z", + "author_association": "MEMBER", + "body": "**amlet 11 апреля 2019, 7:46**\r\n5 минусов, и ни одного комментария... Приведённый пример конечно диковатый, но реально плюсы с каждым новым стандартом становятся всё больше противоречащими себе:\r\n```cpp\r\nauto a = ... ; // копируется значение\r\n\r\nauto & a = ... ; // а вот мы явно указываем на ссылочный тип\r\n\r\ndecltype(auto) a = ... ; // сохраняем тип для a выражения справа\r\n\r\nи тут неожиданно:\r\n\r\nauto [a, b] = ... ; // сохраняем типы исходя выражений справа, даже если там ссылки\r\n\r\nМожет реально как-то более одинаково похожие выражения вести себя должны? Может реально выражение:\r\n\r\ndecltype(auto) [a, b] = ... ;\r\n\r\nauto & [a, b] = ... ;\r\n```\r\nбыли бы лучше?\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812217844/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812341109", + "html_url": "https://github.com/cpp-ru/ideas/issues/385#issuecomment-812341109", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/385", + "id": 812341109, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjM0MTEwOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T06:10:28Z", + "updated_at": "2021-04-02T06:10:28Z", + "author_association": "MEMBER", + "body": "Пока что люди в комитете склоняются к ` for ...` https://wg21.link/p1717\r\n\r\nЛогика за выбором стоит следующая: фактически, такой цикл будет значить unroll, или раскрытие variadic pack, а это делается через многоточие. `constexpr` в `if constexpr` не меняет способ работы с внутренним выражением, оно всё ещё проверяет на true; в случае `for` это будет не так, и получится менее консистентно", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812341109/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812341879", + "html_url": "https://github.com/cpp-ru/ideas/issues/386#issuecomment-812341879", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/386", + "id": 812341879, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjM0MTg3OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T06:12:42Z", + "updated_at": "2021-04-02T06:12:42Z", + "author_association": "MEMBER", + "body": "Я с вами полностью согласен, но сейчас уже нет возможности что-то менять. Подобные правки сломают пользовательский код :(", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812341879/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812449848", + "html_url": "https://github.com/cpp-ru/ideas/issues/387#issuecomment-812449848", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/387", + "id": 812449848, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ0OTg0OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:23:53Z", + "updated_at": "2021-04-02T09:23:53Z", + "author_association": "MEMBER", + "body": "**Анатолий Томилов, 26 декабря 2018, 13:52**\r\nУже есть более общее предложение с \"более допустимым\" синтаксисом: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4235.htm\r\n\r\nЗдесь есть некоторое обсуждение https://stackoverflow.com/questions/32906650/", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812449848/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812451516", + "html_url": "https://github.com/cpp-ru/ideas/issues/388#issuecomment-812451516", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/388", + "id": 812451516, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1MTUxNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:28:17Z", + "updated_at": "2021-04-02T09:28:17Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 11 декабря 2018, 12:20**\r\nОтличная идея. Для симметрии, стоит добавить аналогичный функционал для std::tuple\r\n\r\n\r\n**Andrey Davydov, 11 декабря 2018, 15:34**\r\nА Вы можете показать пример использования variant_index? Я совершенно не против Вашей идеи, просто хотелось бы увидеть пару конкретных примеров.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812451516/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812452058", + "html_url": "https://github.com/cpp-ru/ideas/issues/389#issuecomment-812452058", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/389", + "id": 812452058, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1MjA1OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:29:49Z", + "updated_at": "2021-04-02T09:29:49Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 12 декабря 2018, 20:31**\r\nВот же ж круто! А зачем?\r\n\r\n\r\n**Олег Фатхиев, 12 декабря 2018, 22:48**\r\nAndrey Davydov, бывает нужно пройтись по таплу как по гетерогенному контейнеру. Если представлять, что tuple - это контейнер, то можно считать, что visit - это своеобразный for_each для тапла\r\n\r\n\r\n**Andrey Davydov, 12 декабря 2018, 23:59**\r\nОлег Фатхиев, это скорее transform а не for_each (в Boost.Hana так и называется), но я спрашивал, о каком-нибудь конкретном мотивирующем примере, потому что с tuple можно делать много разного (что и демонстрирует Boost.Hana) и не очень понятно, почему стандартизировать надо именно transform?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812452058/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812452247", + "html_url": "https://github.com/cpp-ru/ideas/issues/389#issuecomment-812452247", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/389", + "id": 812452247, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1MjI0Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:30:23Z", + "updated_at": "2021-04-02T09:30:23Z", + "author_association": "MEMBER", + "body": "Дубликат #139", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812452247/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812452759", + "html_url": "https://github.com/cpp-ru/ideas/issues/390#issuecomment-812452759", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/390", + "id": 812452759, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1Mjc1OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:31:55Z", + "updated_at": "2021-04-02T09:31:55Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 13 декабря 2018, 22:34**\r\nС stack и queue вы кажется загнули, у нас же есть доступ только к одному элементу. \r\n\r\n\r\n**Alexander, 14 декабря 2018, 1:40**\r\nAndrey Davydov, это только у публичного интерфейса есть доступ к одному элементу. Сам же хеш может спокойно иметь доступ и ко всем элементам.\r\n\r\n\r\n**Andrey Davydov, 14 декабря 2018, 9:40**\r\nAlexander, действительно, оказывается для stack-а есть operator ==, значит и hash считать тоже можно. По-моему, пользу от этого никакой, но и вреда, наверное не будет.\r\n\r\n\r\n**Alexander, 14 декабря 2018, 10:28**\r\nAndrey Davydov, из текущей версии предложения всё же было решено выпилить хеш для stack и queue. Оставили это как открытый вопрос для комитета - посмотрим, что там скажут на сей счёт.\r\n\r\n\r\n**yndx-antoshkka, 21 июля 2020, 9:43**\r\nВ Праге предложение отклонили, сказав что оно блокирует более хорошее (но пяток лет не развивающееся) предложение по фреймворку для подсчёта хешей.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812452759/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812453284", + "html_url": "https://github.com/cpp-ru/ideas/issues/391#issuecomment-812453284", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/391", + "id": 812453284, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1MzI4NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:33:28Z", + "updated_at": "2021-04-02T09:33:28Z", + "author_association": "MEMBER", + "body": "**Yuriy Chernyshov, 13 декабря 2018, 18:59**\r\nТогда нужно и для std::variant такой же метод добавить.\r\n\r\nХотя идеологически правильнее, конечно, изменить поведение в *std::move(opt)\r\n\r\n\r\n**nenomius, 14 декабря 2018, 14:35**\r\nYuriy Chernyshov, в каком состоянии тогда будет с std::variant после данной операции? valueless_by_move?\r\n\r\n\r\n**Andrey Davydov, 13 декабря 2018, 22:45**\r\nИдея классная, возможно стоит сделать этому методу ref-qualifier `&&`.\r\n\r\n\r\n**Андрей Руссков, 14 декабря 2018, 15:32**\r\nstd::move не дает гарантий для moved-out значения, кроме валидного состояния (и эту гарантию ты должен обеспечивать сам). Поэтому в общем случае moved-out объекты лучше не использовать.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812453284/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812454392", + "html_url": "https://github.com/cpp-ru/ideas/issues/391#issuecomment-812454392", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/391", + "id": 812454392, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1NDM5Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:36:31Z", + "updated_at": "2021-04-02T09:36:31Z", + "author_association": "MEMBER", + "body": "Нужно побольше мотивации для предложения. Возможно стоит написать автору https://wg21.link/p0798 и добавить метод в рамках p0798", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812454392/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812455010", + "html_url": "https://github.com/cpp-ru/ideas/issues/392#issuecomment-812455010", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/392", + "id": 812455010, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1NTAxMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:38:20Z", + "updated_at": "2021-04-02T09:38:20Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 19 декабря 2018, 19:10**\r\nКажется, что принятый в C++20 proposal http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0960r1.html делает ненужным Ваше предлажение.\r\n\r\n\r\n**Олег Фатхиев, 19 декабря 2018, 20:36**\r\nAndrey Davydov, действительно, это решает одну из проблем. Вызов list initializing это не чинит.\r\n\r\n\r\n**Andrey Davydov, 20 декабря 2018, 8:58**\r\nОлег Фатхиев, что Вы имеете в виду? Какой из Ваших примеров это не чинит?\r\n\r\nЕсли что, std::vector считается ненормальным, классы для которых, X(2, 5) и X{2, 5} означают разное считаются ошибкой природы, и ради них создавать новый механизм (std::aggregate) это черезчур.\r\n\r\n\r\n**Олег Фатхиев, 20 декабря 2018, 15:15**\r\nAndrey Davydov, получается, что любой класс, имеющий конструктор от std::initializer_list, ненормальный?\r\n\r\n\r\n**Andrey Davydov, 20 декабря 2018, 15:35**\r\nОлег Фатхиев, ок, т.е. речь идет именно о классах конструирующихся от std::initializer_list? Для них есть неоднозначность, которую можно решать, предложенным Вами способом (только имя std::aggregate будет не очень удачным), а можно и не решать, так ли хуже \r\n```cpp\r\nstd::make_shared>(std::initializer_list{5, 2})\r\n```\r\nчем предлагаемый Вами \r\n```cpp\r\nstd::make_shared>(std::aggregate, 5, 2)\r\n```\r\n?\r\n\r\nТеперь по поводу \"ненормальных\" классов. Я, наверное, резко выразился, но ситуация когда для класса {} и () инициализация приводит к разным результатам действительно крайне специфичная. Она же встречается не для любого вектора и любых аргументов, а только вектора целых чисел, конструирующегося от 1-2 аргументов. И да, я думаю, что возникновение подобных ситуацией это проблема в дизайне std::vector. \r\n\r\n\r\n**Анатолий Томилов, 26 декабря 2018, 15:28**\r\nAndrey Davydov, \r\n\r\nstd::initializer_list -- это ведь обязательное поэлементное копирование (именно копирование и именно неизбежное).\r\n\r\n\r\n**Andrey Davydov, 26 декабря 2018, 15:44**\r\nАнатолий Томилов, да, и что? Мы же все равно собираемся создавать std::initializer_list и передавать его в конструктор нашего класса, на важно в какой момент это делать -- внутри функции make_shared или снаружи от нее.\r\n\r\n\r\n**Antervis, 21 декабря 2018, 11:13**\r\nво-первых, лучше сразу ориентироваться на std::in_place_t, решающий именно такую задачу для variant/any/optional. Во-вторых, наверно, лучше сделать не только перегрузку make_unique/make_shared, а также перегрузки конструкторов unique_ptr/shared_ptr. По крайней мере с появлением deduction guides потребность в make_фунциях сильно снизилась.\r\n\r\n\r\n**yndx-antoshkka, 26 февраля 2019, 15:24**\r\nP0960 приняли в C++20. В std::aggregate_t смысл отпал.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812455010/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812455564", + "html_url": "https://github.com/cpp-ru/ideas/issues/393#issuecomment-812455564", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/393", + "id": 812455564, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1NTU2NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:39:51Z", + "updated_at": "2021-04-02T09:39:51Z", + "author_association": "MEMBER", + "body": "**Игорь Шаповал, 22 декабря 2018, 13:15**\r\nНаписали двое человек что против. Пожайлуства указывайте причину, почему нет?\r\n\r\n\r\n**Александр Коновалов, 7 января 2019, 6:07**\r\nИгорь Шаповал, нет каких-то реальных примеров, в которых это может быть полезно. Пока выглядит как пустая фича, смысл от которой стремится к нулю.\r\n\r\n\r\n**Игорь Шаповал, 26 декабря 2018, 13:51**\r\nyndx-antoshkka, что скажете может быть в будущем такая фича в С++?\r\n\r\n\r\n**yndx-antoshkka, 26 декабря 2018, 18:53**\r\nИгорь Шаповал, нужны красивые примеры использования, а лучше примеры реализации каких-нибудь паттернов программирования, которые без sealed хорошо не реализовать.\r\n\r\n\r\n**Игорь Шаповал, 27 декабря 2018, 9:59**\r\nРаньше люди писали и без override, final. И как-то жили. А в С++11 добавили и жить не могут.\r\n\r\n\r\n**Игорь Шаповал, 10 января 2019, 21:35**\r\nЭто полезно при паттерн матчинге и крутого switch.\r\n\r\nhttps://kotlinlang.ru/docs/reference/sealed-classes.html\r\n\r\n\r\n**yndx-antoshkka, 10 января 2019, 22:04**\r\nИгорь Шаповал, мне бы пример на C++, где это полезно. А то в других языках, другие правила игры и другие подходы к решению задач.\r\n\r\n\r\n**languagelawyer, 4 февраля 2019, 14:45**\r\nПо ссылке имитация variant через наследование.\r\n\r\n\r\n**Никита Колотов, 23 ноября 2019, 17:08**\r\nЯ вот тоже проголосовал против. В упомянутом C# модификатор sealed полностью запрещает наследование от данного класса, то есть работает аналогично final. В Котлин модификатор sealed до версии 1.1 ограничивал перечень классов, которые могли бы наследоваться от данного только вложенными классами, а затем только классами из того же файла. По какому принцыпу должно работать ограничение в этом предложении - непонятно. Ведь объявления class triangle; и class rectangle; согласно существующим правилам являются предварительными объявлениями вложенных классов figure::triangle и figure::rectangle, а наследуются затем несвязанные одноименные классы из глобального пространства имен.\r\n\r\n ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812455564/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812456143", + "html_url": "https://github.com/cpp-ru/ideas/issues/394#issuecomment-812456143", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/394", + "id": 812456143, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1NjE0Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:41:33Z", + "updated_at": "2021-04-02T09:41:33Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 24 декабря 2018, 17:38**\r\nВы точно понимаете, что значит contextual keyword? В таком контексте\r\n\r\nawait x;\r\nawait foo();\r\n\r\nawait должен трактоваться как keyword или identifier?\r\n\r\n\r\n**Vyacheslav Meshkov, 15 февраля 2019, 14:48**\r\nAndrey Davydov,\r\n\r\n В этом плане сильно большая разница между co_await и await?\r\n\r\n\r\n**Andrey Davydov, 15 февраля 2019, 15:14**\r\nVyacheslav Meshkov, разница в том, что co_await можно сделать не хардовым кейвордом, а не пытаться догадываться по контексту.\r\n\r\n\r\n**Vyacheslav Meshkov, 15 февраля 2019, 18:37**\r\nAndrey Davydov, на других языках никто особо не жалуется. Это похоже на надуманную проблему.\r\n\r\n\r\n**Andrey Davydov, 15 февраля 2019, 18:55**\r\nVyacheslav Meshkov, возможно дело в том, что при парсинге других языков нет необходимости искать answer to life the universe and everything? Поэтому contextual keyword их не пугают.\r\n\r\n\r\n**Vyacheslav Meshkov, 15 февраля 2019, 19:34**\r\nAndrey Davydov, Тут невозможно спорить. Язык плюсы действительно стал языком ответа на кучу вопросов, кроме нужных тем, кто его изначально использовал. Теперь как и в телефон и умные часы влазит всё, кроме нормальных телефонов и часов, так и плюсы раньше использовались как продвинутый вариант языка для системного программирования, а теперь всё кроме этого. Многие следуя примеру Линуса Торвальдса откатываются с этой целью на С. Также недавняя волна статьей из геймдева только подтвердила этот факт.\r\nУ меня сильное ощущение, что новые изменения в язык ставят целью повышение зарплат плюсовиков (повышение порога вхождение обсуждается всё чаще). Чему невозможно не радоваться.\r\n\r\n\r\n**NeoProgramming, 24 декабря 2018, 18:52**\r\nИМХО contextual keywords это путь в PL/1.\r\n\r\n\r\n**Игорь Шаповал, 26 декабря 2018, 10:05**\r\nЯ имел в виду как ключевые слова override, final\r\n\r\n\r\n**Andrey Davydov, 26 декабря 2018, 13:58**\r\nИгорь Шаповал, override и final могут быть ключевыми словами только в тех местах, где синтаксически нельзя написать идентификатор, с (co_)await это не так.\r\n\r\n\r\n**Игорь Шаповал, 26 декабря 2018, 15:47**\r\nПочему co_await, co_yield не может быть await, yield ключевыми словами, как override, final.\r\n\r\n\r\n**Andrio, 31 января 2019, 18:57**\r\nЧесно говоря не понимаю в чем проблема сделать Ctrl+Replace('await', 'my_await'), по всему проекту. Так что \" слова await и yield очень часто используемые\" надуманная проблема\r\n\r\n\r\n**Vyacheslav Meshkov, 15 февраля 2019, 14:50**\r\nAndrio,\r\n\r\nТогда и нет проблемы назвать его например herb_sutters_favorite_co_await? Это ко-ко-ко в других языках отсутствует. Зачем оно в C++?\r\n\r\n\r\n**Vyacheslav Meshkov, 15 февраля 2019, 14:52**\r\nСчитаю co_ ошибкой. Взять например аналоги в других языках.\r\n\r\n\r\n**yndx-antoshkka, 18 февраля 2019, 0:24**\r\nОформил предложение на отбрасывание co_* Better keywords for Coroutines TS https://apolukhin.github.io/papers/Better%20keywords%20for%20Coroutines%20TS.html\r\n\r\nВозможно успеем рассмотреть на ближайшей встрече.\r\n\r\n\r\n**Vyacheslav Meshkov, 25 февраля 2019, 19:58**\r\nyndx-antoshkka, Оперативно, нет слов. Интересно, а что Гор думает по этому поводу.\r\n\r\n\r\n**yndx-antoshkka, 31 июля 2019, 13:45**\r\nПредложение отклонили. Слишком поздно вносить изменения в C++20, в добавок есть проблемы при отбрасывании co_ для return. У разработчиков компиляторов особые хитрости для return, им необходимо быстро различать return и co_return не заглядывая в function definition.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812456143/reactions", + "total_count": 1, + "+1": 0, + "-1": 0, + "laugh": 1, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812457243", + "html_url": "https://github.com/cpp-ru/ideas/issues/395#issuecomment-812457243", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/395", + "id": 812457243, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1NzI0Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:44:47Z", + "updated_at": "2021-04-02T09:44:47Z", + "author_association": "MEMBER", + "body": "**BlackMat MATov, 26 декабря 2018, 14:03**\r\nП - перформанс\r\n\r\n\r\n**Дмитрий, 26 декабря 2018, 23:15**\r\n\r\n> Был случай когда указатель забыли проинициализировать ...\r\n\r\nИспользуйте smart pointer\r\n\r\n\r\n**valera_ee, 27 декабря 2018, 11:39**\r\nДмитрий, сейчас, конечно только ими ипользуюсь, но что делать с сотнями тысяч строк старого кода? Их все разом переписать не получится, это процесс долгий и затратный.\r\n\r\n\r\n**al-mission-2016, 28 декабря 2018, 1:33**\r\nПри проектировании языка программирования приходится решать дилемму - производительность vs \"меньше ошибок по невнимательности\". Когда в конце 60х изобретали С, инициализация по-умолчанию была непозволительной роскошью.\r\n\r\n\r\nОтносительно инициализации дилемма такова:\r\n[A] по-умолчанию ничего не инициализируется; безопасные начальные значения - это ответственность программиста;\r\n[B] всё инициализируется по-умолчанию, за исключением случаев, когда явно указано, что инициализировать не надо.\r\n\r\n\r\nВ С++ очевидно принят подход [А] и это решение слишком фундаментально, чтобы его можно было поменять.\r\nМожно только помочь бороться с последствиями. :)\r\n\r\n\r\nПричины подхода [А] в С++:\r\n1) Совместимость с языком С - там нет инициализации по-умолчанию.\r\n2) Производительность = как основа философии С/С++.\r\n Например, в 3D-app требуется создать 1'000'000 треугольников. Нулевые значения смысла не имеют, всё равно они будут перезаписаны при загрузке сцены. Здесь нулевая инициализация - performance hit. Компилятор далеко не всегда может устранить лишние присваивания.\r\n3) требования обратной совместимости с предшествующими версиями С++, чтобы избежать изменения поведения старого кода, при компиляции в режиме С++11++.\r\n4) для пользовательских типов имеются: конструкторы и их списки инициализации, а в С++11/14 добавили инициализация членов-данных при их декларации.\r\n Этих инструментов достаточно, чтобы обеспечить значения по-умолчанию, где это необходимо.\r\n Кроме того, локальные переменные в С++ рекомендуется создавать как можно ближе к месту их использования и соответственно сразу инициализировать их разумными значениями.\r\n\r\nТеперь предположим, что мы изменили С++, введя инициализацию по-умолчанию.\r\nОдновременно потребуется добавлять механизм, позволяющий явно указать, как не инициализировать в случаях, когда важна производительность, а\r\nзначения по-умолчанию не подходят.\r\nНапр.:\r\n```cpp\r\nint x = void; // as in D-language\r\n```\r\n\r\nВ результате придётся дорабатывать тот legacy-code, в котором инициализация по-умолчанию начнёт бить по производительности!\r\nТо есть решая проблему одних, мы создадим проблему другим.\r\nНе стоит оно того. :)\r\n\r\n\r\n> valera_ee\r\n\r\nПопробуйте статические анализаторы кода.\r\n\r\n\r\n**valera_ee, 28 декабря 2018, 7:19**\r\nal-mission-2016, это всё, конечно, хорошо, но вместо голых быстрых указателей мы начали использовать медленный, но безопасный вариант умных указателей, и производительность падает, вместо голых массивов std::vector и это всё замедляет программу, так о какой производительности тогда говорить? Сейчас вообще есть constexpr, мы получили возможность инициализировать константы на этапе компиляции, так , а что мешает делать тоже самое для полей класса у которых отсутствует явная инициализация? \r\n\r\n\r\n**Fihtangolz, 29 декабря 2018, 15:29**\r\nvalera_ee, хз я вообше предлагаю просто выкинуть фундаментальные типы написать классы int, float, double, оставить только что то типа byte в качестве фундаментального типа, ну собственно дальше кому надо сделают инициализацию по умолчанию\r\n\r\n\r\n**al-mission-2016, 2 января 2019, 8:19**\r\n> Fihtangolz,\r\nв рамках собственного проекта можно делать что угодно, хоть на потолке спать. (: Только вряд ли стоит тащить в стандарт языка обратно-несовместимые вещи, как предложил Валерий. :)\r\n\r\n\r\n> valera_ee,\r\n\r\nваше предложение означает поменять правила игры на лету, когда решение уже давно принято и куча легаси кода полагается на него.\r\n\r\n> \"что мешает делать тоже самое для полей класса у которых отсутствует явная инициализация?\"\r\n\r\nМешает обратная совместимость. Часть кода (правда довольно специфичного) просто поломается.\r\nНапример, поломается код, который принципиально предполагает (в соответствии с нынешним стандартом), что если поле класса нигде явно не проинициализированно, то компилятор в него точно ничего не запишет. Это важно для embedded/firmware программирования.\r\nИспользуя placement-new (и volatile) можно отобразить структуру, т.е. её члены-данные, на память, которая является пространством портов ввода-вывода. Теперь получаем, что \"старые\" версии компилятора ничего не писали в поля-порты без ведома программиста. А \"новый\" компилятор, инициализируя поля значениями по-умолчанию, запишет в порты нули!\r\nВ принципе, этого примера достаточно, чтобы отклонить ваше предложение.\r\n\r\n\r\nПо производительности. Да, компьютеры стали быстрее, память дешевле, можно позволить размен - чуть медленнее софт, зато потенциально чуть меньше ошибок, код пишется быстрее и т.д. Для многих проектов это вполне приемлемо. Но заметьте, std::vector, умные указатели и т.п. - это опция, у нас есть выбор. Если нужна максимальная производительность, можно обойтись без них. А ваше предложение - всегда инициализировать - принудительно.\r\nКстати, некоторые game-dev'ы, типа EA, писали в своё время собственные версии STL, когда их не устраивала производительность контейнеров общего назначения.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812457243/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812458128", + "html_url": "https://github.com/cpp-ru/ideas/issues/396#issuecomment-812458128", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/396", + "id": 812458128, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1ODEyOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:47:13Z", + "updated_at": "2021-04-02T09:47:13Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 26 декабря 2018, 12:38**\r\nДавайте по каждой конкрентой фиче проходиться отдельно. Всё сразу не примут, часть расширений - опасные и от них отказываются, часть уже принята в C++20/C++17.\r\n\r\nДавайте начнём с ТОП-5 вещей, которые вы бы хотели видеть в C++. Что по вашему мнению самое полезное из этих расширений https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Extensions.html ?\r\n\r\n\r\n**Antervis, 27 декабря 2018, 11:33**\r\nyndx-antoshkka, target - автодиспатч по архитектурам. Очень приятная штука\r\n\r\n\r\n**yndx-antoshkka, 27 декабря 2018, 11:41**\r\nAntervis, учтите, что придётся стандартизировать имена популярных архитектур. Вы готовы взяться за черновик?\r\n\r\n\r\n**Antervis, 27 декабря 2018, 12:57**\r\nyndx-antoshkka, а имена архитектур точно необходимо стандартизировать? Дело даже не в том, что их много, а в том, что target также поддерживает dispatch по наборам инструкций. Во-первых, стандартизация всяких AVX512VPOPCNTDQ будет попросту отставать по времени от потребности, а во-вторых, архитектуры как правило являются суперсетами других архитектур.\r\nРазве нельзя обойтись правилами компиляции и выбора перегрузок? Навскидку, можно сформулировать как-то так: Функция компилируется в соответствии со всеми переданными target'ами. Если компилятор не знает указанную архитектуру (в конкретном режиме) - пропустить компиляцию функции, выдать диагностическое сообщение. Во время выполнения выбирается наиболее подходящая перегрузка по архитектуре, по принципу наиболее полного набора target'ов и его сабсетов.\r\n\r\n\r\n**yndx-antoshkka, 28 декабря 2018, 11:29**\r\nAntervis, тогда полтеряется смысл в этой штуке - производители будут лепить свои имена таргетов, не совместимые с именами других компиляторов. Если в зависимости от компилятора придётся через макросы выбирать таргет - то получается стрёмно и непереносимо.\r\n\r\n\r\n**Antervis, 28 декабря 2018, 11:50**\r\nyndx-antoshkka, а к стандарту вообще есть приложения с более коротким циклом обновления?\r\n\r\n\r\n**yndx-antoshkka, 28 декабря 2018, 14:31**\r\nAntervis, можно начать с таргетов не привязанных к конкретным платформам. Например native (текущая платформа), basic (текущие настройки компилятора), all (нагенерить для всех возможных платформ)\r\n\r\n\r\n**Antervis, 28 декабря 2018, 18:24**\r\nyndx-antoshkka, вряд ли платформонезависимые варианты all/basic/default/native помогут для значимого процента юзкейсов. А можно сослаться на какой-то другой документ с перечислением существующих платформ/архитектур, их иерархий и наименований?\r\n\r\n\r\n**yndx-antoshkka, 10 января 2019, 12:17**\r\nAntervis, да, можно сослаться. Главное чтобы такой документ нашёлся.\r\n\r\n\r\n**iksk810, 26 декабря 2018, 13:14**\r\nЭлвис-оператор было бы неплохо принять. Мелочь, а приятно. )\r\n\r\n\r\n**Игорь Шаповал, 26 декабря 2018, 13:48**\r\nХотелось бы чтобы приняли switch c диапазоном значений\r\n```cpp\r\nswitch (number) {\r\ncase 1 ... 5:\r\n // code\r\n break;\r\ndefault:\r\n // code\r\n} \r\n```\r\n\r\n**Игорь Шаповал, 28 декабря 2018, 14:09**\r\nА что поповоду switch c диапазоном значений? Мне кажется недолжно быть проблем чтобы добавить в стандарт.\r\n\r\n\r\n**yndx-antoshkka, 10 января 2019, 12:19**\r\nИгорь Шаповал, что-то подобное обсуждается вот тут http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1308r0.html . Я сильно против этого предложения - выглядит по уродски, читать не удобно.\r\n\r\n\r\n**yndx-antoshkka, 3 октября 2019, 11:52**\r\nТут в видео озвучиваются популярные расширения C++, которые есть почти что во всех компиляторах: https://youtu.be/IAdLwUXRUvg\r\n\r\nМожно начать с их стандартизации. Есть желающие нписать proposal?\r\n\r\n\r\n**Andrey, 10 октября 2019, 14:19**\r\nyndx-antoshkka, я бы очень хотел, чтобы такой код (де факто повсеместно использующийся)\r\n```cpp\r\ntemplate\r\nstruct vec3 {\r\n union {\r\n struct {\r\n Scalar x, y, z;\r\n };\r\n struct {\r\n Scalar r, g, b;\r\n };\r\n Scalar v[3];\r\n };\r\n};\r\n```\r\nстал де юре компилирующимся и не содержащим UB C++.\r\n\r\nЗадача разбивается на 2 (вполне независимых) proposals:\r\n\r\n1. Anonymous structs, по аналогии c anonymous union. Не вижу тут вообще никаких препятствий -- ни технических (одна страница стандарта, по аналогии с http://eel.is/c++draft/class.union.anon#:restriction,anonymous_union), ни идеологических (очевидно полезная вещь), ни оппозиции со стороны разработчиков компиляторов -- у них это уже реализовано.\r\n\r\n2. Сделать T[N] и struct { T v_1, Т v_2, ..., T v_N } layout-compatible в случае когда T -- standard layout type, сразу исправив существующие UB (https://code.woboq.org/qt5/qtbase/src/gui/painting/qcolor.h.html#QColor::CT). Кажется логичным, но я не уверен на 100%, что это ничему не противоречит.\r\n\r\nК сожалению, я не могу заняться этим до новогодних каникул. Если, кто-то возьмется писать до этого времени, буду рад :), если нет -- готов попробовать.\r\n\r\n\r\n**Игорь Гусаров, 24 января 2020, 19:49**\r\nAndrey, обеими руками голосую за то, чтобы вывести подобные конструкции из тени!\r\n\r\nХочу обратить внимание, что у этой задачи есть ещё и третья часть: полностью перетрясти концепцию юнионов (или ввести в язык некую новую сущность вместо union). Ведь union-типы задумывались как средство, позволяющее в каждый момент времени работать только с одним полем, а Вы, насколько я догадываюсь, предлагаете разрешить читать и модифицировать любые поля вразнобой.\r\n\r\nУточните, пожалуйста, желаемые сценарии использования, так как UB скорее всего кроется именно в них.\r\n\r\n\r\n**Andrey, 24 января 2020, 20:46**\r\nИгорь Гусаров, это не потребуется, все нужные механизмы для обхода UB уже есть (или на подходе). Структуры из моего примера layout-compatbile поэтому обращаться к ним вразнобой можно (http://eel.is/c++draft/class.union#2.note-1). Осталось гарантировать, чтобы они были layout-compatible c массивом, это решается proposal-ом P1912.\r\n\r\n\r\n**Игорь Гусаров, 24 января 2020, 23:06**\r\nAndrey, как Вы понимаете формулировку \"it is permitted to inspect\" из упомянутого пункта 11.5.2.note-1?\r\n\r\nМне кажется, что эта формулировка разрешает только доступ на чтение. А доступ на запись (точнее, присваивание нового значения) сразу \"включает\" пункт 6 того же раздела, в особенности замечание http://eel.is/c++draft/class.union#6.note-1\r\n```cpp\r\nvec3 v;\r\n\r\n// Start the lifetime of {x,y,z} union member.\r\nv.x = 1;\r\nv.y = 2;\r\n\r\n// Start the lifetime of {r,g,b} union member.\r\n// End the lifetime of {x,y,z} union member.\r\nv.r = 3;\r\n\r\n// At this point:\r\n// the lifetime of v.y object has ended\r\n// and v.g object hasn't been initialized yet.\r\n\r\nstd::cout << v.g; // Question: what is the value of v.g?\r\n```\r\n\r\n**Andrey, 25 января 2020, 1:26**\r\nИгорь Гусаров, я на всякий случай уточнил у экспертов в slack-е (https://cpplang.slack.com/archives/C21PKDHSL/p1579903527448100), уверяют что все в порядке, и что в случае common initial sequence о прекращении времени жизни объекта {x, y, z} можно не беспокоиться (https://cpplang.slack.com/archives/C21PKDHSL/p1579904079460500). То есть мое интуитивное понимание такое, что в случае layout-compatible типов не происходит никакого переключения между активными членами union-а, они как будто одновременно живы и просто доступны под разными именами. Еще раз подчеркну, что это только в случае layout-compatible типов.\r\n\r\n\r\n**Игорь Гусаров, 27 января 2020, 19:35**\r\nAndrey, участника, который высказал такое мнение, уже поправили: https://cpplang.slack.com/archives/C21PKDHSL/p1579905163488900?thread_ts=1579903743.451200&cid=C21PKDHSL.\r\n\r\n\r\n**Andrey, 27 января 2020, 20:05**\r\nИгорь Гусаров, окей, я запутался. Мне кажется, что этот пример должен быть без UB, но похоже, что согласно текущему wording-у это не так. По-моему, это проблема wording-а, т.к. TBAA валидность этого код мешать не должна. Надо задать соответствующий вопрос либо в std-discussion mailing list-е или в том же slack-е в канале #standardese или писать в закрытый mailing list \"core\", где сидят настоящие wording джедаи.\r\n\r\n\r\n**Игорь Гусаров, 27 января 2020, 20:52**\r\nAndrey, ну да, о том и речь! Чтобы легализовать доступ на чтение-запись к общей начальной части понадобятся новые явные формулировки в [class.union], а возможно и в [basic.lifetime] и [intro.object]. Это тоже работа.\r\n\r\nПро aliasing тоже согласен - данным сценариям он не мешает.\r\n\r\nМожет быть, можно начать с поисков ответа на вопрос: \"Почему для общей начальной части исключение сделано только для доступа на чтения? Какие соображения помешали сразу разрешить чтение и модификацию?\"", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812458128/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812458667", + "html_url": "https://github.com/cpp-ru/ideas/issues/397#issuecomment-812458667", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/397", + "id": 812458667, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1ODY2Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:48:47Z", + "updated_at": "2021-04-02T09:48:47Z", + "author_association": "MEMBER", + "body": "**Igor Baidiuk, 28 декабря 2018, 15:27**\r\nОднозначно лишнее. Синглтонов и так чем меньше, тем лучше. Плюс, шаблонный \"синглетонофикатор\" написать не составляет труда.\r\n\r\n\r\n**yndx-antoshkka, 28 декабря 2018, 15:36**\r\nК ~С++26 можно будет реализовать этот функционал через метаклассы, на уровне стандартной библиотеки. Думаю что до тех пор в комитете идея не пройдёт.\r\n\r\n\r\n**Игорь Шаповал, 31 декабря 2018, 13:05**\r\nБыло бы классно. Метаклассы поскорее.\r\n\r\n\r\n**NeoProgramming, 1 января 2019, 17:55**\r\nПредлагаю просто разрешить ключевое слово static перед описанием класса. Такие статические классы будут сразу объектами.\r\n```cpp\r\nstatic class Foo {\r\n int x, y;\r\npublic:\r\n void foo() { /*....*/ };\r\n};\r\n\r\n// вызов\r\nFoo.foo();\r\n// или\r\nFoo::foo();\r\n```\r\n\r\n**Александр Коновалов, 11 марта 2019, 22:53**\r\nNeoProgramming, такой синтаксис я бы сказал чужд для C++ во многих отношениях. От static ожидаешь именно статической переменной, поэтому если такой класс будет вложен в другой, да ещё и будет объявлена после переменная (а что нам может запретить это сделать?), я скорее предположу, что статическая переменная. Далее Foo.foo(); и Foo::foo(); с точки зрения языка совершенно не одно и то же. Вот пусть в Foo::foo() будет доступ к какому-то не статическому члену класса Foo. Тогда вызов Foo::foo() явно будет выглядеть как ошибка.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812458667/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812459311", + "html_url": "https://github.com/cpp-ru/ideas/issues/398#issuecomment-812459311", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/398", + "id": 812459311, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1OTMxMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:50:42Z", + "updated_at": "2021-04-02T09:50:42Z", + "author_association": "MEMBER", + "body": "**Igor Baidiuk, 28 декабря 2018, 15:35**\r\nМне кажется, вы упускаете, что string_view должен инициализироваться непрерывным сегментом строки. Для итераторов же это граничный случай. Ranges имеют вроде как концепт Sequential, но тогда логично превратить подобрый рейндж в блок символов, и уже его паковать в std::string_view", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812459311/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812459790", + "html_url": "https://github.com/cpp-ru/ideas/issues/398#issuecomment-812459790", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/398", + "id": 812459790, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjQ1OTc5MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T09:52:12Z", + "updated_at": "2021-04-02T09:52:12Z", + "author_association": "MEMBER", + "body": "Над идеей уже работают https://wg21.link/p1989", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812459790/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812527101", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-812527101", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 812527101, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjUyNzEwMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T13:22:57Z", + "updated_at": "2021-04-02T13:22:57Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 28 декабря 2018, 15:35**\r\nПодобные предложения уже рассматриваются комитетом: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0199r0.pdf, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0814r2.pdf\r\n\r\n \r\n\r\n\r\n**Igor Baidiuk, 28 декабря 2018, 15:46**\r\nyndx-antoshkka, спасибо за ссылки.\r\nЕсли я правильно понимаю, первый концентрируется на default hash operator, а второй - на hash_combine. Первый ортогонален, а второй - не решает проблему \"прибитости гвоздями\" хеш-оператора к конкретному алгоритму.\r\nЭто же предложение лежит в несколько иной плоскости.\r\n\r\n\r\n**Igor Baidiuk, 28 декабря 2018, 15:52**\r\nНашёл этот пропозал: p0029r0\r\nПока что наиболее близко к теме.\r\n\r\n\r\n**Айдар Фаттахов, 2 февраля 2019, 14:26**\r\n\r\n>Отделить функцию хэширования от данных\r\n>Типы добавляют метод\r\n\r\n\r\n**Igor Baidiuk, 27 мая 2019, 14:29**\r\nasschool, не вижу противоречия. Упоминаемый метод ничего не говорит об алгоритме хеширования, а только о том, какие данные передаются в хешер. Алгоритм вычисления хеша лежит отдельно. Под \"функцией хеширования\" как правило понимают именно алгоритм.\r\n\r\n\r\n**Айдар Фаттахов, 27 мая 2019, 16:29**\r\nIgor Baidiuk,\r\n\r\n>Каждому конкретному типу не требуется ни знать про хеширование как таковое\r\n\r\nВы добавляете метод hash\r\n\r\nМне кажется в вашей модели визитор является лишним элементом, достаточно std::hash::operator() прнимать hasher", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812527101/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812527636", + "html_url": "https://github.com/cpp-ru/ideas/issues/400#issuecomment-812527636", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/400", + "id": 812527636, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjUyNzYzNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T13:24:14Z", + "updated_at": "2021-04-02T13:24:14Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 января 2019, 12:16**\r\nИдея огонь! Нужен достойный прототип\r\n\r\n\r\n**Игорь Шаповал, 10 января 2019, 21:34**\r\nyndx-antoshkka ведутся какие-то работы в этом направлении. \r\n\r\nВот например, https://github.com/rbock/sqlpp11\r\n\r\nЕе даже на cppcon 17 презентовали. Что скажите?\r\n\r\n \r\n\r\n\r\n**Alexander, 15 января 2019, 22:47**\r\nИгорь Шаповал, мне кажется, что данная проблема должна решаться с другой стороны. Нужно сделать нормальную инфраструктуру по доставке 3rd party libraries (для этого даже специальная SG в комитете есть). Не могу сказать, что работа с БД настолько базовый функционал, что он достоин быть в STL.\r\n\r\n\r\n**Дмитрий, 23 февраля 2019, 22:09**\r\nТогда возникает вопрос, с какими базами должна работать стандартная библиотека, и как будет решена проблема стандартизации их интерфейсов?\r\n\r\n\r\n**Александр Коновалов, 11 марта 2019, 23:09**\r\nНе стоит забывать, что C++ работает и во встраиваемом коде. Всё же есть вещи, которые лучше подключать со стороны.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812527636/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812528595", + "html_url": "https://github.com/cpp-ru/ideas/issues/401#issuecomment-812528595", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/401", + "id": 812528595, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjUyODU5NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T13:26:44Z", + "updated_at": "2021-04-02T13:26:44Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 января 2019, 12:15**\r\nЭту идею недавно обсуждали в комитете. На практике - она ничего на даёт, кроме поломок тестового кода с throw 42;. Никаких оптимизаций из неё не выжать - разработчикам стандартных библиотек и компиляторов всё равно придётся тащить старый функционал, выбростить его ни не могут.\r\n\r\n\r\n**Igor Baidiuk, 11 января 2019, 14:38**\r\nyndx-antoshkka,\r\nЯ бы сказал, возможность кидать что угодно в принципе вредная.\r\n\r\n\r\n**Игорь Шаповал, 10 января 2019, 21:27**\r\nВедь register удалили, тогда зачем это держать. Это ведь поошрения плохого кода. Я понимаю что С++ разработчику нужна свобода. register ведь ламает обратную совместимость! То тогда зачем это. Я думаю это можно и нужно предлагать на удаления.\r\n\r\n\r\n**Alexander, 15 января 2019, 22:45**\r\nИгорь Шаповал,не передёргивайте, пожалуйста. register удалили ввиду того, что миграция кода, где он был, продёт\\прошла относительно безболезненно (так как компилятор и сам неплохо занимается распределением регистров). В случае с бросанием простых примитивов миграция кода, там где такое бросают (я ни в коем случае не одобряю подобное), будет скорее всего более болезненной. Я бы предложил собрать статистику по крупным проектам и приложить её к предложению, если Вы готовы написать такое. \r\n\r\nПодход с исследованием не в новинку комитету, и подобное исследование уже проводили в случае с тем же if(a < b < c)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812528595/reactions", + "total_count": 1, + "+1": 0, + "-1": 0, + "laugh": 1, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812537999", + "html_url": "https://github.com/cpp-ru/ideas/issues/402#issuecomment-812537999", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/402", + "id": 812537999, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjUzNzk5OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T13:46:48Z", + "updated_at": "2021-04-02T13:46:48Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 10 января 2019, 12:13**\r\nМожно достичь того же самого эффекта, просто написав словами причину/срок/... В чём практический смысл?\r\n\r\n\r\n**Игорь Шаповал, 10 января 2019, 21:23**\r\nЭто полезно для разработчиков кода, что фичу нужно удалить в следующей версии. Держать базу возможных претендентов на удаления.\r\n\r\n\r\n**Mihail Slobodyanuk, 27 февраля 2019, 21:13**\r\n\r\n>В чём практический смысл?\r\n\r\nВ компиляторе можно будет сделать включаемую строгую проверку на соответствие требований версии стандарта и запрещать использование таких deprecated вызовов. При написании нового кода проверку сразу включать и она сразу будет зависеть от версии стандарта в опциях компиляции", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812537999/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812539166", + "html_url": "https://github.com/cpp-ru/ideas/issues/403#issuecomment-812539166", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/403", + "id": 812539166, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjUzOTE2Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T13:49:45Z", + "updated_at": "2021-04-02T13:49:45Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 4 февраля 2019, 14:30**\r\nА что именно вы хотите вынести в Legacy ?\r\n\r\n\r\n**andrewandrew1andrew, 4 февраля 2019, 21:29**\r\nСпасибо что опубликовали. Идея была в следующем: для легаси проектов которые используют версии стандарта ниже С++11 и так всё и оставить.А те что используют С++11 стандарт и выше - выкинуть всю С-ную либу и обратную совместимость и все зависимости от прошлых версий .\r\nП.С Если не трудно ответьте в чем я прав/неправ, и возможно ли такое в принципе? Спасибо заранее\r\n\r\n\r\n**yndx-antoshkka, 4 февраля 2019, 21:52**\r\nВозникнут все те проблемы, котрые испытал Python при переезде на версию 3. Вместо одного языка C++, будет два языка.\r\n\r\nТакже полмается обратная совместимость с C, и новые проекты просто перестанут на C++ писать, так как множество полезных вещей доступны только в C.\r\n\r\n\r\n**Mihail Slobodyanuk, 26 февраля 2019, 22:34**\r\nВ JavaScript есть механизм deprecate, хоть и не масштабируемый. Это я про директиву \"use strict\". Он вроде не разделил язык на два.\r\n\r\nА вообще предложение, видимо, мотивируется теми же проблемами, откуда появился проект C++ Core Guidelines. И действительно хотелось бы его видеть в стандарте\r\n\r\nДаже в естественных языках есть такой механизм в виде лингвистических справочников и учебников. \r\n\r\nЕсли не отказываться от старого, то не будет активного развития нового. Просто головы не хватит, чтобы упомнить все.\r\n\r\n\r\n**artur1ivanov, 3 апреля 2019, 21:21**\r\nMihail Slobodyanuk, мне кажется автор это и имел ввиду .Ведь C++ уже распух до больших размеров почему бы не вынести С либу и всё легаси из него.\r\n\r\n\r\n**andrewandrew1andrew, 5 февраля 2019, 11:59**\r\nСпасибо за ответ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812539166/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812539658", + "html_url": "https://github.com/cpp-ru/ideas/issues/404#issuecomment-812539658", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/404", + "id": 812539658, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjUzOTY1OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T13:51:02Z", + "updated_at": "2021-04-02T13:51:02Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 4 февраля 2019, 14:30**\r\nstd::min_element и std::max_element не подходят?\r\n\r\n\r\n**Айдар Фаттахов, 6 февраля 2019, 17:11**\r\nyndx-antoshkka, а со scan что?\r\n\r\n\r\n**yndx-antoshkka, 24 февраля 2019, 4:03**\r\nasschool, напишите пожалуйста подробнее, что вы хотите получить и чем не устраивает min_element/max_element", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812539658/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812540662", + "html_url": "https://github.com/cpp-ru/ideas/issues/405#issuecomment-812540662", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/405", + "id": 812540662, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU0MDY2Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T13:53:41Z", + "updated_at": "2021-04-02T13:53:41Z", + "author_association": "MEMBER", + "body": "**languagelawyer, 4 февраля 2019, 15:53**\r\nО нет, только не member-функции!\r\n\r\n\r\n**Andrey Davydov, 5 февраля 2019, 7:12**\r\nВо-первых, это сломает существующий код:\r\n```cpp\r\nusing namespace boost::assign;\r\n\r\nstd::set s;\r\ns += 1,2,3;\r\n```\r\nВо-вторых, мотивация \"на контестах надо экономить число нажатий клавиш\" очень слабая.\r\n\r\n\r\n**mrgordonfreman, 5 февраля 2019, 11:45**\r\nAndrey Davydov, вроде бы код не ломается\r\n```cpp\r\n#include \r\n#include \r\n\r\nusing namespace boost::assign;\r\n\r\ntemplate\r\nstd::set& operator +=(std::set& s, std::initializer_list il)\r\n{\r\n s.insert(il);\r\n return s;\r\n}\r\n\r\nint main()\r\n{\r\n std::set s;\r\n s += 1,2,3;\r\n s += {3,4,5};\r\n for (auto&x : s)\r\n std::cout << x << ' ';\r\n std::cout << std::endl;\r\n}\r\n```\r\n\r\n**Andrey Davydov, 5 февраля 2019, 12:59**\r\nmrgordonfreman, Вы правы, не ломает, зря я поленился проверить. Тем не менее Ваше предложение мне все равно не нравится, как-то оно неконсистентно с остальной STL. Почему тогда, к примеру, у vector-а push_back а не operator += ?\r\n\r\n\r\n**Ivan Azoyan, 14 февраля 2019, 11:42**\r\nAndrey Davydov, справедливости ради (насчёт консистентности STL) замечу, что в basic_string есть такая перегрузка. http://cpp.sh/8ogdg\r\n```cpp\r\n#include \r\n#include \r\n\r\nint main() {\r\n std::basic_string v = { 1, 2, 3, 4 };\r\n v += 5;\r\n v += { 6, 7 };\r\n for (auto i : v) std::cout << i << \" \"; // 1 2 3 4 5 6 7\r\n}\r\n```\r\n\r\n**Andrey Davydov, 14 февраля 2019, 15:09**\r\nIvan Azoyan, вот же ж. Иметь operator +=(initializer_list) для basic_string, но не иметь его для вектора, это неожиданно.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812540662/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812543988", + "html_url": "https://github.com/cpp-ru/ideas/issues/407#issuecomment-812543988", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/407", + "id": 812543988, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU0Mzk4OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:02:11Z", + "updated_at": "2021-04-02T14:02:11Z", + "author_association": "MEMBER", + "body": "Мы закинули эту проблему комментарием от России для C++20. В виде quickfix идею не приняли, но Андрей начал прорабатывать её сам https://wg21.link/P2037 , за что ему большое спасибо!\r\n\r\nК несчастью, обсуждение закончилось плачевно и идею не приняли https://github.com/cplusplus/papers/issues/767 . Нужно больше мотивации", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812543988/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812545094", + "html_url": "https://github.com/cpp-ru/ideas/issues/408#issuecomment-812545094", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/408", + "id": 812545094, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU0NTA5NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:04:49Z", + "updated_at": "2021-04-02T14:04:49Z", + "author_association": "MEMBER", + "body": "**Andrey Davydov, 19 февраля 2019, 10:54**\r\nВо-первых, для типов с нетривиальными конструкторами важно, в какой момент они исполнятся, сейчас у пользователя есть возможность повлиять на это, а с Вашим предложением -- не будет.\r\n\r\nВо-вторых, если принять такое правило, то весь старый код, где у static полей уже был definition, начнет нарушать ODR, не так ли?\r\n\r\n\r\n**Vyacheslav Meshkov, 25 февраля 2019, 20:03**\r\nAndrey Davydov, Мне тут сложно знать тонкости, потому что я не компиляторщик, и деталей не знаю. Могу лишь предположить, что вроде как сейчас оба варианта ниже уже допустимы, и проблем ODR не вызывают, верно?\r\n\r\n1:\r\n```cpp\r\nclass A {\r\n\r\nstatic int a = 10;\r\n\r\n};\r\n```\r\n2:\r\n```cpp\r\nclass A {\r\n\r\nstatic int a;\r\n\r\n};\r\n\r\nint A::a = 10;\r\n```\r\n \r\n\r\n\r\n**Andrey Davydov, 25 февраля 2019, 21:50**\r\nVyacheslav Meshkov, ну коли Вы не компиляторщик, так проверили бы компиляторами: https://gcc.godbolt.org/z/7J_20F. non-const static data member нельзя инициализировать inplace.\r\n\r\n\r\n**Vyacheslav Meshkov, 25 февраля 2019, 22:46**\r\nAndrey Davydov, Тут возникло недопонимание ввиду того, что я допустил ошибку, в отличие от первого поста. Имелось ввиду static const int. А теперь также можете проверить на godbolt.org.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812545094/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812548440", + "html_url": "https://github.com/cpp-ru/ideas/issues/409#issuecomment-812548440", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/409", + "id": 812548440, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU0ODQ0MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:13:25Z", + "updated_at": "2021-04-02T14:13:25Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 24 февраля 2019, 4:00**\r\nНад этой идеей работает новая подгруппа SG19 Machine Learning. Если захотите написать предложение, скажите, я поспрашиваю у них о планах и о том, как лучше всего им помочь.\r\n\r\n\r\n**Vyacheslav Meshkov, 25 февраля 2019, 21:15**\r\nyndx-antoshkka, Вот тут без черновиков с их стороны сложно. В каком это состоянии, в каком направлении движется? Насколько это будет близко к тем, кто это использует? Статьи на хабре показывают, что тема имеет весьма узкий охват аудитории.\r\n\r\nПоэтому тут буду писать осторожно и со словами `лично мне`.\r\n\r\nЛично мне хотелось бы видеть вариант более близкий к glsl. Хотя при желании имена типов можно заменить через using. Но тем менее, иметь что-то вроде\r\n```cpp\r\nvec3f u(1.f,0.f,0.f,0.f), v(0.f, 1.f, 0.f, 0.f);\r\n\r\nauto w = u ^ v; // cross-product, w = 0.f, 0.f, 1.f, 0.f\r\n\r\nvec4 v(...);\r\n\r\nauto w = v.wzyx(); // shufps xmm0, xmm1, 0b00011011\r\n\r\nfloat t = w.get<0>(); // movss DWORD PTR [t], 0\r\n\r\nvec4 p = mtx4::rotation(90.f, 1.f, 0.f, 0.f) * vec4(1.f, 0.f, 0.f, 1.f);\r\n```\r\nПонятно, что весь код должен идеально инлайнится без всяких префиксов и постфиксов функций, что нормально работает уже сейчас.\r\n\r\nВ общем, в плане простоты финального кода, хотелось бы получить что-то на уровне: https://habr.com/ru/post/418247. Хотя здесь в демонстративных целях было использовано введение глобальных функций, а вообще следует делать через классы.\r\n\r\nНо с точки зрения кода, не имеющего узкой графической специализации, к этому коду куча вопросов, когда не до конца ясно надо ли вводить point4 (w=1.f) в дополнении к вектору? А как в конце концов должны размещаться компоненты в регистре: xyzw, wzyx? В каком формате должна храниться матрица? И тем более насколько общими должны быть классы? Плюс требуется поддерживать разные форматы simd данных на разном железе.\r\n\r\nВ итоге, есть предположение, что до конца непонятно. Реализовывать классы специализированные классы вектора, матрицы, кватернионов, которые всех точно не удовлетворят. Или всё-таки реализовать промежуточные simd классы с функционалом общего назначения (class xmm, с прямыми железными операциями +, -, *, /, shuffle, and, or и прочими), а уже через них реализовать специализированные классы вектора, матрицы и другие. И тогда если кому-то специализированные классы по разным причинам будут неудобны, они смогут их сами реализовать через промежуточные классы. В любом случае необходимость создавать новые классы будет.\r\n\r\nНу и в финале. Есть мысль, что с разными наборами simd инструций тоже всё непросто. На той же x86 есть sse1-3, ssse3, sse4.1, sse4.2, avx, avx2. И уже одна реализация никак не может устроить всех. Делаем вектор на sse1, и тогда теряем преимущества более новых инструций. Делаем на более новых, терям поддержку на старом железе. И вот уже получается неплохо бы иметь\r\n```cpp\r\nnamespace sse {\r\n\r\nstruct alignas(16) vec4 {\r\n\r\n //...\r\n\r\n vec4 mad(vec4 const& u, vec4 const& v) const { return _mm_add_ps(_mm_mul_ps(fmm, u.fmm), v.fmm); }\r\n\r\n};\r\n\r\n};\r\n\r\nnamespace fma {\r\n\r\nstruct vec4 : sse::vec4 {\r\n\r\n template vec4(Args&&... args) : avx::vec4(std::forward(args)...) {}\r\n\r\n vec4 mad(vec4 const& u, vec4 const& v) const { return _mm_fmadd_ps(fmm, u.fmm, v.fmm); }\r\n\r\n};\r\n```\r\n \r\n\r\n\r\n**Vyacheslav Meshkov, 25 февраля 2019, 21:57**\r\nПод общими классами имел ввиду всё таки не class xmm, а float4, float4x2 (именно так, потому что ближе к логие работы avx), double2, double4. Для других архитектур набор классов может отличаться). Да и по поводу float/double тоже вопрос. Лучше так, или неплохо бы как с интами уже перейти на float32, float64, float80.\r\n\r\n\r\n**WPMGPRoSToTeMa, 26 февраля 2019, 20:30**\r\nyndx-antoshkka, речь случаем не о библиотеке для линейной алгебры? Она вроде изначально зародилась из пропозала о 2D-графике?\r\n\r\n\r\n**neondev9, 25 февраля 2019, 0:24**\r\nС одной стороны предложение толковое, ибо у каждого есть своя пачка тех же векторов, а это не очень хорошо.\r\nС другой стороны, здесь ооочень тяжело будет угодить всем и сразу.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812548440/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812549865", + "html_url": "https://github.com/cpp-ru/ideas/issues/410#issuecomment-812549865", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/410", + "id": 812549865, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU0OTg2NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:17:01Z", + "updated_at": "2021-04-02T14:17:01Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 26 февраля 2019, 11:41**\r\nТочно не взлетит: self уже используется многими людьми в коде. Если сделать это слово ключевым - поломается сборка, поэтому предложение не примут.\r\n\r\nПравильным решением было бы сделать this ссылкой на текущий класс, а не указателем. Но это надо было делать 30 лет назад, сейчас уже поздно что-то менять.\r\n\r\n\r\n**WPMGPRoSToTeMa, 26 февраля 2019, 19:53**\r\nВ [deducing this пропозале](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0847r2.html) присутствует нечто подходящее.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812549865/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812550425", + "html_url": "https://github.com/cpp-ru/ideas/issues/410#issuecomment-812550425", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/410", + "id": 812550425, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU1MDQyNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:18:14Z", + "updated_at": "2021-04-02T14:18:14Z", + "author_association": "MEMBER", + "body": "Пересекается/конфликтует с #281 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812550425/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812551527", + "html_url": "https://github.com/cpp-ru/ideas/issues/411#issuecomment-812551527", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/411", + "id": 812551527, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU1MTUyNw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:21:01Z", + "updated_at": "2021-04-02T14:21:35Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 26 февраля 2019, 12:13**\r\nСейчас всё метапрограммирование поставлено на паузу до тех пор, пока не выйдет [Reflections TS](https://stdcpp.ru/proposals/wg21.link/n4766). Когда он выйдет, его ещё раз поменяют в сторону обычных переменных:\r\n\r\n```cpp\r\nconstexpr auto t1 = reflexpr(int);\r\nconstexpr auto t2 = reflexpr(double);\r\n\r\nconstexpr auto t3 = ????(t1, t2);\r\nstatic_assert(t3 == reflexpr(double));\r\n```\r\nstd::type_identity там просто не будет использоваться.\r\n\r\nНо вот идея сделать так, чтобы type_traits работали с reflexpr - весьма годная! Попробуйте подумать, как это сделать, и перепроверить, нет ли уже готовой базы для этого в Reflections TS\r\n\r\n\r\n**Andrey Davydov, 27 февраля 2019, 9:42**\r\nyndx-antoshkka, говоря \"type_traits работали с reflexpr\" Вы имеете в виду, возможность с constexpr-based рефлексией вместо TriviallyCopyable писать reflexpr(X).is_trivially_copyable()? А существует ли вообще хоть какой-то набросок интерфейса constexpr-based рефлексии (всех-этих классов meta::type, meta::expression и т.д.)?\r\n\r\n\r\n**yndx-antoshkka, 27 февраля 2019, 16:57**\r\nAndrey Davydov, да, что-то наподобие reflexpr(X).is_trivially_copyable()\r\n\r\nНабросок интерфейса есть тут http://wg21.link/P0953\r\n\r\n\r\n**Andrey Davydov, 27 февраля 2019, 17:40**\r\nyndx-antoshkka, в том proposal-е, на который Вы сослались, есть даже секция type_traits. И в альтернативном предложении http://wg21.link/p1240 (который мне нравится даже больше) также есть соответствующий раздел: \"Transcribing the standard library's [meta] section\".\r\n\r\n \r\n\r\n\r\n**yndx-antoshkka, 27 февраля 2019, 22:29**\r\nAndrey Davydov, о, я эту секцию упустил из виду. Тогда что остаётся от идеи? common_type_v просто добавить нельзя, будет конфликс с имеющимися type_traits.\r\n\r\n\r\n**Andrey Davydov, 27 февраля 2019, 23:43**\r\nyndx-antoshkka, наверное, предложение Олега все равно имеет смысл для пользовательских метафункций (или таких трейтов, как common_type, которые могут быть специализированы пользователем). Только реализация в мире с reflection будет совсем другой, попробовал набросать в терминах http://wg21.link/p1240:\r\n```cpp\r\nauto value_fn_v(meta::info F) {\r\n return [F] (span types) {\r\n return template(F)<()...>::value;\r\n };\r\n}\r\n\r\nauto is_same_v = value_fn_v(reflexpr(std::is_same));\r\nstatic_assert(!is_same_v({ reflexpr(int), reflexpr(float) }));\r\n```\r\n\r\n**yndx-antoshkka, 28 февраля 2019, 14:18**\r\nВ таком виде выглядит очень полезным. Надо попробовать накидать рабочий прототип и можно закидывать бумагу в SG7 Reflections and Metaprogramming.\r\n\r\n\r\n**Олег Фатхиев, 28 февраля 2019, 15:58**\r\nyndx-antoshkka, ок, разузнаю поподробнее и напишу вам.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812551527/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812554806", + "html_url": "https://github.com/cpp-ru/ideas/issues/412#issuecomment-812554806", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/412", + "id": 812554806, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU1NDgwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:28:58Z", + "updated_at": "2021-04-02T14:29:26Z", + "author_association": "MEMBER", + "body": "**Евгений Гагауз, 28 февраля 2019, 9:24**\r\nЗабыл отметить, что пример выше вызывает [ошибку](https://godbolt.org/z/U9JUe2) компиляции.\r\n\r\n\r\n**amlet, 28 февраля 2019, 11:35**\r\nНужно всего-то во всех стандартных контейнерах вместо:\r\n```cpp\r\nconstructor(std::initializer_list list);\r\n```\r\nиспользовать (и реализовать)\r\n```cpp\r\nconstructor(const std::initializer_list & list);\r\nconstructor(std::initializer_list && list);\r\n```\r\nЭто даже вроде ничего поломать не должно :)\r\n\r\n\r\n**Andrey Davydov, 28 февраля 2019, 12:58**\r\nБыло бы здорово, если бы initializer_list изначально поддерживал move semantics, но поправить это задним числом вряд ли возможно. Есть такие идеи: https://wg21.link/n4166, https://wg21.tartanllama.xyz/initializer_list.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812554806/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812555857", + "html_url": "https://github.com/cpp-ru/ideas/issues/413#issuecomment-812555857", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/413", + "id": 812555857, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU1NTg1Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:31:44Z", + "updated_at": "2021-04-02T14:31:44Z", + "author_association": "MEMBER", + "body": "**Олег Фатхиев, 5 марта 2019, 11:16**\r\nТекущая реализация не ошибочна, std::invoke_result_t обязан принимать строго больше 0 параметров. Проблема, видимо, в overload resolution для алиасов, они не умеют принимать variadic pack-и в таком случае. Кажется подобная проблема уже была в gcc, могу ошибаться. Интересно то, что этот код работает в msvc. Нужно разобраться, что об этом говорит стандарт.\r\n\r\n\r\n**Дмитрий, 6 марта 2019, 12:14**\r\nОлег Фатхиев, std::invoke_result_t — это просто псевдоним. Он прокинет аргументы в std::invoke_result, и если их там окажется 0, то вывалится ошибки.\r\n\r\n\r\n**yndx-antoshkka, 5 марта 2019, 18:33**\r\nЭто уберёт симптом, но не вылечит болезнь. Надо на уровне языка сделать так, чтобы текущая реализация работала. Тогда автоматически исправится множество подобных проблем.\r\n\r\nСпрошу у специалистов по ядру языка, что можно с этим сделать на данный момент.\r\n\r\n\r\n**yndx-antoshkka, 5 марта 2019, 20:23**\r\nСкинули ссылку на проблему: https://wg21.link/CWG1430\r\n\r\n\r\n**Дмитрий, 6 марта 2019, 12:22**\r\nyndx-antoshkka, я внимательно прочитал ссылку, но не понял, какие оттуда следуют выводы.\r\n\r\nМожем ли мы \"вылечить болезнь\"? Если не можем, то нужно хотя бы \"устранить симптом\", то есть все псевдонимы метафункций, которые ломают логичный и осмысленный код.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812555857/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812556392", + "html_url": "https://github.com/cpp-ru/ideas/issues/413#issuecomment-812556392", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/413", + "id": 812556392, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU1NjM5Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:33:15Z", + "updated_at": "2021-04-02T14:33:15Z", + "author_association": "MEMBER", + "body": "Первопричину кажется что пока не починить, придётся чинить симптомы", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812556392/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812557500", + "html_url": "https://github.com/cpp-ru/ideas/issues/414#issuecomment-812557500", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/414", + "id": 812557500, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU1NzUwMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:36:08Z", + "updated_at": "2021-04-02T14:36:08Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 5 марта 2019, 18:30**\r\n1. Эта проблема обсуждалась. Она лежит за пределами стандарта C++, как и маппирование заголовочных файлов на их идентификаторы. Другими словами - да, это проблема, но многие подобные случаи не описываются стандартом C++. Ревью в SG-15 Tooling возможно позволит многие implementation-defined вещи связанные со сборкой перенести в стандарт, и унифицировать часть флагов сборки. Но это случится явно не к C++20.\r\n\r\n2. Модули надо трактовать как некое подобие shared library. Тоесть разработчик в билд системах сам укажет как и из чего формаировать модули, после чего будет ставить их зависимостями к проектам. Вся ответственность за организацию правильных модулей ложится на разработчика. Стандарт C++ может помочь разве что примерами, но со стороны стандарта больше сделать ничего нельзя.\r\n\r\n3. Опять таки, смотрите выше - модуль, это shared library. Пользователь сам должен указать зависимости, магии и автоматики тут не будет. Более того, системы сборки не могут его в принципе сами прекомипилировать, так как не знают на какое поведение макросов закладывается автор legacy файла. Другими словами, это 3 совершенно различных поведения:\r\n```cpp\r\n#include \r\nimport \r\nimport legacy;\r\n```\r\nИ модули для последних двух случаев могут компилироаваться по разному.\r\n\r\n \r\n\r\n> Дать возможность производителям инструментов попробовать поддержать модули и прислушаться к их мнению\r\n\r\nИменно для этого модули и смержили в стандарт C++ пораньше. Чтобы производители инструментов осознали, что модули готовы, но у них всё ещё было 2 года на проверку и коментарии к ним.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812557500/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812559242", + "html_url": "https://github.com/cpp-ru/ideas/issues/415#issuecomment-812559242", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/415", + "id": 812559242, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU1OTI0Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:40:32Z", + "updated_at": "2021-04-02T14:42:37Z", + "author_association": "MEMBER", + "body": "**Antervis, 11 марта 2019, 11:07**\r\nи заодно перегрузку по constexpr'ness аргументов, а-ля\r\n```cpp\r\nbool foo(int i) {\r\n return true;\r\n}\r\nbool foo(constexpr int i) {\r\n return false;\r\n}\r\n\r\nfoo(1); // false\r\nint i;\r\nfoo(i); // true\r\n```\r\nТакое вроде рассматривалось еще к включению в с++11, но комитет решил что сильно многословно получается\r\n\r\n\r\n**yndx-antoshkka, 11 марта 2019, 16:11**\r\nAntervis, любая модификация правил перегрузок в 99.999% случаев ведёт к отклонению предложения. Так что лучше подобное не добавлять, и сосредоточиться на базовом функционале.\r\n\r\n\r\n**Antervis, 11 марта 2019, 17:12**\r\nyndx-antoshkka, речь же идет не об изменении а о дополнении правил перегрузок. Никакой существующий код в таком случае не пострадает.\r\n\r\nВообще, не хватает языку встроенной семантики pure функций, вот только приделать её походу уже не получится\r\n\r\n\r\n**yndx-antoshkka, 11 марта 2019, 18:20**\r\nAntervis, описание правил Overload resolution [занимает 21 страницу](http://eel.is/c++draft/over.match). Удачи с правками ;)\r\n\r\n\r\n**WPMGPRoSToTeMa, 13 марта 2019, 19:51**\r\nAntervis, я думаю куда разумнее будет ввести какой-нибудь `maybe_constexpr` (или `maybe_const`), правда нужен ещё какой-нибудь магический механизм в виде `constexpr bool std::is_constant(maybe_constexpr const auto& x)`. В принципе `constexpr` и `maybe_constexpr` параметры уже можно эмулировать с помощью аргументов завёрнутых в лямбды и `__builtin_constant_p` (или другими хаками) для проверки на константность https://godbolt.org/z/Oysrwe. Но с такой эмуляцией конечно проблема в том, что на каждый call-site инстанциируется новый шаблон.\r\n\r\n**yndx-antoshkka, 11 марта 2019, 16:09**\r\nЭта идея обсуждалась, и одна из подгруп была сильно против того, чтобы функция в некоторых случаях неявно становилась шаблонной функцией.\r\n\r\nИдея бузусловно стоящая, но надо придумать какой-то аргумент, чтобы успокоить одну из подгруп. Возможно что с недавно принятым terse syntax для концептов (аля void foo(auto SemiRegular val); ), комитет будет не сильно против.\r\n\r\nВообще, основное преимущество подобных аргументов - это возможность делать проверки на этапе компиляции в тех местах, где раньше были только runtime:\r\n```cpp\r\nint array::at(constepxr usinged index) const {\r\n try_static_assert(index < size(); std::range_error{\"out of range\"});\r\n return __data[index];\r\n}\r\n```\r\n\r\n**Юра Левченко, 11 марта 2019, 20:10**\r\nyndx-antoshkka, большое спасибо, за ответ! Смотря на тенденцию развития, мне тоже показалось что уже пора вводить такую возможность. Я думаю многие будут благодарны если Вы все таки с второй попытки протолкнете это предложение ;)\r\n\r\n\r\n**Юра Левченко, 12 марта 2019, 12:05**\r\nyndx-antoshkka, Добрый день, а хотел бы еще спросить, есть ли возможность как то почитать прошлые отзывы? Ну и совсем наглость, как-то быть подписаным на ответы (ридонли) нового запроса, зарание спасибо!\r\n\r\n\r\n**Игорь Гусаров, 29 января 2020, 19:27**\r\nyndx-antoshkka, данное предложение очень помогло бы реализовать оператор [] для кортежей. Тут ведь уже были предложения как заменить get(tuple) на более интуитивно понятный tuple[index].\r\n\r\n\r\n**WPMGPRoSToTeMa, 18 марта 2019, 13:36**\r\nКстати, а как это будет сочетаться с эмуляцией именованных аргументов с помощью designated initializers?\r\n\r\n\r\n**Юра Левченко, 21 марта 2019, 13:20**\r\nWPMGPRoSToTeMa, А можно подробней? Я просто не помню что бы было принято designated initializers для аргументов функций.\r\n\r\n\r\n**WPMGPRoSToTeMa, 22 марта 2019, 20:47**\r\nЮра Левченко,\r\n```cpp\r\nstruct Args {\r\n int a;\r\n double b;\r\n char c;\r\n};\r\n\r\nvoid f(Args);\r\n\r\nf({.a = 42, .b = 13.37, .c = 'x'});\r\n```\r\n\r\n**Юра Левченко, 11 апреля 2019, 12:50**\r\nWPMGPRoSToTeMa, Но здесь у нас один аргумент Args и то что мы передаем это неявное конструирование данного объекта перед тем как передать его в функцию. В данном случае если мы объявим Args как \"возможный\" constexpr то тогда если все \"аргументы\" передались как константы то и args будет константный\r\n\r\n\r\n**Виктор Губин, 26 марта 2019, 15:41**\r\nУ GCC и clang вместо этого введена встроенная функция __builtin_constant_p, в итоге можно делать что-то вроде\r\n```cpp\r\nconstexpr inline __attribute__((always_inline) int foo(int a) noexcept {\r\n // need inline\r\n if( __builtin_constant_p(a) ) {\r\n // some constexpr alg\r\n return 0;\r\n } else {\r\n // some non constexpr alg \r\n return 1;\r\n }\r\n}\r\n```\r\nЕсли перегрузку сложно внести в стандарт, неплохо-бы было иметь хотя-бы стандартный оператор проверки на константность аргумента. Скажем что-то вроде:\r\n```cpp\r\nif( constexpr( a ) ) {\r\n....\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812559242/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812567147", + "html_url": "https://github.com/cpp-ru/ideas/issues/415#issuecomment-812567147", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/415", + "id": 812567147, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU2NzE0Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T14:59:27Z", + "updated_at": "2021-04-02T14:59:27Z", + "author_association": "MEMBER", + "body": "Дубликат #330 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812567147/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812567671", + "html_url": "https://github.com/cpp-ru/ideas/issues/416#issuecomment-812567671", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/416", + "id": 812567671, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU2NzY3MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:00:48Z", + "updated_at": "2021-04-02T15:00:48Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 11 марта 2019, 16:16**\r\nДля добавления Machine Learning в стандарт C++ недавно была создана целая подгруппа SG19. Они сейчас занимаются добавлением линейной алгебры в стандарт, после этого примутся за более продвинутые решения.\r\n\r\n\r\n**artur1ivanov, 12 марта 2019, 14:58**\r\nСпасибо за информацию .Будет что почитать", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812567671/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812568983", + "html_url": "https://github.com/cpp-ru/ideas/issues/417#issuecomment-812568983", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/417", + "id": 812568983, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU2ODk4Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:04:08Z", + "updated_at": "2021-04-02T15:04:08Z", + "author_association": "MEMBER", + "body": "**Yuriy Chernyshov, 11 марта 2019, 14:19**\r\nstd::from_chars решает эту задачу.\r\n\r\n\r\n**yndx-antoshkka, 11 марта 2019, 16:47**\r\nПодобная идея уже предлагалась: #263", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812568983/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812570321", + "html_url": "https://github.com/cpp-ru/ideas/issues/418#issuecomment-812570321", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/418", + "id": 812570321, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU3MDMyMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:07:46Z", + "updated_at": "2021-04-02T15:07:46Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 11 марта 2019, 16:15**\r\n+1. Стоит большую часть сделать constexpr. Нужны добровольцы для написания прототипа.\r\n\r\n\r\n**Nate Reinar Windwood, 16 марта 2019, 2:29**\r\nyndx-antoshkka, ну прототип strlen пишется на коленке:\r\n```cpp\r\nnamespace std\r\n{\r\n\tconstexpr size_t strlen(const char *str)\r\n\t{\r\n\t\tauto result = size_t(0);\r\n\t\twhile (*(str++) != '\\0')\r\n\t\t\t++result;\r\n\t\treturn result;\r\n\t}\r\n}\r\n```\r\nИли вот еще версия поизящнее, но она полагается на TCO:\r\n```cpp\r\nnamespace std\r\n{\r\n\tconstexpr size_t strlen(const char *str, const size_t tail = 0)\r\n\t{\r\n\t\treturn (*str == '\\0') ? tail : strlen(str + 1, tail + 1);\r\n\t}\r\n}\r\n```\r\nДумаю, и с остальной частью проблем не должно быть. Могу взяться, если надо.\r\n\r\n\r\n**yndx-antoshkka, 18 марта 2019, 11:41**\r\nNate Reinar Windwood, возьмитесь пожайлуйста, буду благодарен!\r\n\r\nСамой простой имплементации без рекурсий будет достаточно. Особый смак - если имплементация будет использовать __builtin_* на платформах, которые умеют constexpr __builtin_* (например GCC умеет constepxr __builtins_strlen)\r\n\r\n\r\n**Виктор Губин, 18 марта 2019, 16:34**\r\nyndx-antoshkka, к сожалению не всегда работает, хоть и очень заманчиво\r\n```cpp\r\n#include \r\n\r\n#ifdef __GNUG__\r\n#\tdefine __strlen(__x) __builtin_strlen((__x))\r\n#elif defined(_MSC_VER)\r\n# include \r\n# include \r\n# pragma intrinsic(strlen)\r\n# define __strlen(__x) strlen( (__x) )\r\n#endif // compiler specific\r\n\r\n#include \r\n\r\nstatic constexpr std::size_t strlen_impl(const char* s, std::size_t ret) noexcept {\r\n return '\\0' == *s ? ret : strlen_impl(s+1,ret+1);\r\n}\r\n\r\nconstexpr std::size_t ct_strlen(const char* s) noexcept {\r\n return nullptr == s ? 0 : strlen_impl(s,0); \r\n} \r\n\r\nstatic constexpr uint8_t atob_imp(const char* a,uint8_t ret) noexcept {\r\n return '\\0' == *a ? ret : atob_imp(a+1, (ret * 10) + ( *a - '0') );\r\n}\r\n\r\nconstexpr uint8_t atob(const char* a) noexcept {\r\n// static_assert(__strlen(a) <= 3, \"3 is max\" );\r\n return atob_imp(a, static_cast(0) );\r\n}\r\n\r\nint main(int argc, const char** argv)\r\n{\r\n constexpr const char* str = \"123\";\r\n // static_assert( 3U == __strlen(str), \"123 expected\");\r\n static_assert( ct_strlen(str) <= 3, \"3 is max\" );\r\n\tstatic_assert( 123U == atob(str), \"123 expected\");\r\n\tunsigned int ret = atob(str);\r\n std::cout << ret << std::endl;\r\n\treturn 0;\r\n}\r\n```\r\n \r\n\r\n\r\n**yndx-antoshkka, 18 марта 2019, 17:10**\r\nВиктор Губин, достаточно чтобы работало на одном компиляторе (GCC умеет лучше других constexpr)\r\n\r\n\r\n**Виктор Губин, 18 марта 2019, 18:05**\r\nyndx-antoshkka, в том-то и дело что __builtin_ как и pragma intinsic это рекомендация компилятору к оптимизации, а не constxepr. Компилятор - смотрит на это добро, и сам решает что с этим делать, вычислить на compile time, вставить ассемблерный блок наподобие\r\n```cpp\r\nsize_t strlen(const char *s)\r\n{\r\n\tint d0;\r\n\tsize_t res;\r\n\tasm volatile(\"repne\\n\\t\"\r\n\t\t\"scasb\"\r\n\t\t: \"=c\" (res), \"=&D\" (d0)\r\n\t\t: \"1\" (s), \"a\" (0), \"0\" (0xffffffffu)\r\n\t\t: \"memory\");\r\n\treturn ~res - 1;\r\n}\r\n```\r\nили вызвать библиотечную функцию (call strlen)\r\n\r\nЕсли в примере вернуть static_assert-ты, то все 4-ре компилятора откажутся компилировать. \r\n\r\n2. Тривиальный байт-луп, типа strlen(str+1, tail +1) работает за O(N). Миниум, нужно как-то так. Но reintrepret_cast(str) как и ассемблерные вставки и constrxpr не дружат по известным причинам.\r\n\r\n\r\n**Nate Reinar Windwood, 20 марта 2019, 1:28**\r\nyndx-antoshkka, ок, на выходных тогда. Для начала без билтинов напишу, а там посмотрим. Я в компиляторах не то чтобы разбираюсь, а у вас тут консенсуса пока, вроде, нету)\r\n\r\n\r\n**Виктор Губин, 22 марта 2019, 22:29**\r\nNate Reinar Windwood, Можно и с интрисиками без особых проблем. Правда contexpr только наивные алгоритмы толком можно реализовать, что пагубно скажется на скорости компиляции, особенно всякого рода генераторов паресеров или компайл тайм регекспов наподобие sprit или expressive. Впрочем они и без того комплируются дико долго.\r\n\r\n\r\n**Nate Reinar Windwood, 24 марта 2019, 19:57**\r\nyndx-antoshkka, в общем, я создал: https://github.com/natewind/cstring-constexpr\r\n\r\nНадеюсь, на буднях буду успевать понемногу доделывать.\r\n\r\n\r\n**Nate Reinar Windwood, 24 марта 2019, 20:07**\r\nВиктор Губин, это выглядит страшно >_<\r\n\r\nПожалуй, я пока не готов разбираться в интринсиках.\r\n\r\n\r\n**languagelawyer, 11 марта 2019, 19:08**\r\nДопустимо, что `std::X` и `::X` для `X` из библиотеки C будут вести себя по-разному?\r\n\r\n\r\n**yndx-antoshkka, 11 марта 2019, 19:39**\r\nДа, это ОК\r\n\r\n\r\n**Konstantin Lazukin, 12 марта 2019, 12:29**\r\nДля этих целей можно воспользоваться std::string_view, у которого есть constexpr конструктор и метод length.\r\n```cpp\r\n#include \r\n\r\nconstexpr std::size_t mystrlen(std::string_view sv)\r\n{\r\n return sv.size();\r\n}\r\n\r\nstatic_assert(mystrlen(\"123\")==3);\r\n```\r\n\r\n**Виктор Губин, 18 марта 2019, 15:02**\r\nНа самом деле компиляторы давно уже оптимизируют все так как нужно. Cмотрим ассемблерный вывод. \r\n\r\nОднако есть другой вопрос, strlen посчитывает кол-во байт в строке, однако кол-во символов в строке может быть меньше чем кол-во байт в ней нарпимер если в const char* мы храним UTF-8. \r\n\r\nПоложим наша строка вылядит вот так:\r\n```cpp\r\nconst char* umessage = \"Hello!Привет!Χαιρετίσματα!Helló!Hallå!你好!こんにちは!\";\r\n```\r\nЕе длина в байтах имеем 81, однако в символах - 47. Этот не маловажный факт хотелось-бы знать во многих случаях. Реализовать функцию определения длины в символах можно напимер вот так:\r\n```cpp\r\n#include \r\n\r\n#ifdef __GNUG__\r\n#\tif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__\r\n#\t\tdefine IS_LITTLE_ENDIAN 1\r\n#\tendif // __ORDER_LITTLE_ENDIAN__\r\n#\tdefine __clz(__x) __builtin_clz((__x))\r\n#elif defined(_MSC_VER)\r\n#\tdefine IS_LITTLE_ENDIAN 1\r\n#\tifdef __ICL\r\n#\t\tdefine __clz(__x) _lzcnt_u32((__x))\r\n#\telif defined(_M_AMD64) || ( defined(_M_IX86_FP) && (_M_IX86_FP >= 2) )\r\n#\t\tpragma intrinsic(__lzcnt)\r\n#\t\tdefine __clz(__x) __lzcnt((__x))\r\n#\telse\r\n\t\t#pragma intrinsic(_BitScanReverse)\r\n\t\t__forceinline int __clz(unsigned long x) noexcept {\r\n\t\t\tunsigned long ret = 0;\r\n\t\t\t_BitScanReverse(&ret, x);\r\n\t\t\treturn static_cast(ret);\r\n\t\t}\r\n#\tendif\r\n#endif // compiler specific\r\n\r\n#include \r\n\r\nnamespace utf8 {\r\n\r\n/// Checks a byte is UTF-8 single byte character\r\ninline constexpr bool isonebyte(const char c)\r\n{\r\n\treturn static_cast(c) < uint8_t(0x80U);\r\n}\r\n\r\n/// Checks a byte is UTF-8 character tail byte\r\ninline constexpr bool ismbtail(const char c) noexcept\r\n{\r\n\treturn 2 == ( uint8_t(c) >> 6);\r\n}\r\n\r\n/// Returns UTF-8 character size in bytes, based on first UTF-8 byte\r\ninline constexpr unsigned int char_size(const char ch)\r\n{\r\n\treturn isonebyte(ch)\r\n\t? 1\r\n\t:\r\n\t// bit scan forward on inverted value gives number of leading multi-byte bits\r\n#ifdef IS_LITTLE_ENDIAN\r\n\tstatic_cast( __clz( ~( static_cast(ch) << ((sizeof(unsigned int) << 3 ) - 8) ) ) );\r\n#else\r\n\tstatic_cast( __clz( ~ ( static_cast(ch) ) ) );\r\n#endif // IS_LITTLE_ENDIAN\r\n}\r\n\r\ninline std::size_t strlength(const char* u8str) noexcept {\r\n\tstd::size_t ret = 0;\r\n\tfor(const char *c = u8str; '\\0' != *c; c += char_size(*c) )\r\n\t\t++ret;\r\n\treturn ret;\r\n}\r\n\r\n} // namespace utf8\r\n\r\nconst char* umessage = \"Hello!Привет!Χαιρετίσματα!Helló!Hallå!你好!こんにちは!\";\r\n\r\nint main(int argc, const char** argv)\r\n{\r\n\r\n\tstd::cout << std::strlen(umessage) << std::endl;\r\n\tstd::cout << utf8::strlength(umessage) << std::endl;\r\n\r\n\treturn 0;\r\n}\r\n```\r\nОднако это \"велосипед\", хотелось-бы иметь поддержку со стороны стороны стандартной билиотеки.\r\n\r\n \r\n\r\n\r\n**yndx-antoshkka, 18 марта 2019, 19:09**\r\nВиктор Губин, вы усложняете: static_assert от параметра функции и не должен работать; MSVC не умеет constexpr builtin (как и многих других вещей).\r\n\r\nВсё что нужно для proposal, это показать что предожение на constexpr в принципе реализуемо с текущим развитием компиляторов. Тоесть нужна подобная имплементация и тесты. А после принятия предложения - уже дело разработчиков компиляторов сделать эффективно (добавить constexpr интринсики).\r\n\r\n\r\n**Виктор Губин, 20 марта 2019, 18:44**\r\nyndx-antoshkka, почему-бы тогда не пойти еще дальше и прописать в стандатре С++XX что все функции стандартной библиотеки С из ctype, cstring, cmath, stdarg (+ что-то еще типа snprintf, sscanf ...) объявляются операторами языка.\r\n\r\nТаковые доступны вообще без #include-ов или префиксов типа __builtin и их можно использовать в constrexpr выражениях и функциях если позволяет контекст. \r\n\r\nВозможно потребуется поддержка со стороны ABI, как и в случае с: __cxa_guard_xxx, RTTI и exceptions. Т.е. подобное не сработает если нет ABI (в драйверах, ядрах ОС и т.п. ABI как и либс реализуют свой или подключают что-то готовое)\r\n```cpp\r\nstatic foo _foo;\r\n\r\nfoo *f = dynamic_cast(bar);\r\n\r\nthrow std::runtime_error();\r\n\r\nclass foo {\r\n...\r\nvirtual ~foo() noexcept = 0;\r\n...\r\n};\r\n\r\nfoo::~foo() noexcept\r\n{}\r\n```\r\n\r\n**Daniil Goncharov, 24 октября 2019, 19:42**\r\nProof of concept реализация доступна здесь: https://github.com/Neargye/cstring-constexpr-proposal\r\nТекст прополза можно посмотреть здесь: https://github.com/Neargye/cstring-constexpr-proposal/blob/master/papers/proposal.md\r\nВерсия в pdf: https://github.com/Neargye/cstring-constexpr-proposal/blob/master/papers/P1944R0.pdf\r\n\r\nНайденные ошибки и улучшения можно отсылать в issues или pr.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812570321/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812571550", + "html_url": "https://github.com/cpp-ru/ideas/issues/419#issuecomment-812571550", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/419", + "id": 812571550, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU3MTU1MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:10:53Z", + "updated_at": "2021-04-02T15:10:53Z", + "author_association": "MEMBER", + "body": "**Marat Abrarov, 13 марта 2019, 4:26**\r\nСмысл идеи понятен и по началу идея кажется правильной (меня очень \"смущает\" большая стандартная библиотека по тем самым причинам, что указаны в данном предложении). Но есть и обратная сторона медали (спросите тех, кто переходил с Java SE на Java ME о том, что \"хорошего\" они думают про эту самую Java ME) - например, фрагментация.\r\n\r\nАргумент \"против\" от Страуструпа - такое разделение на уровни введет никому не нужную фрагментацию в C++, где и так хватает проблем с разными платформами (их всех нужно поддерживать) и компиляторами (каждый добавляет свою специфику, включая опции сборки). Кажется, был Embedded C++ с урезанной стандартной библиотекой (не могу найти правильные ссылки), но идея давно потухла.\r\n\r\nВ той же Java можно быстро нарастить нехватку чего-то в стандартной библиотеке легким подключением сторонних библиотек (5-6 строк в maven-проекте). В C++ подключить (собрать, а потом подключить) стороннюю бибилиотеку - целое (зачастую печальное) приключение.\r\n\r\n\r\n**Александр Коновалов, 19 марта 2019, 15:46**\r\nMarat Abrarov, не понятно, какая разница: поддерживать весь совокупный функционал в одной библиотеке или растащить его по разным. Относительно текущего состояния дел ничего нового не появится.\r\n\r\nОпция сборки считай добавляется только одна: уровень. Кроме того, думаю, что могут начать появляться компиляторы, которые поддерживают функционал только до определенного уровня (с наличием llvm вероятность небольшая, но всё же есть).\r\n\r\n\r\n**Виктор Губин, 18 марта 2019, 19:19**\r\nНе стоит делать то-же что и Java 9. Сломали все что только можно было сломать.\r\n\r\n\r\n**Александр Коновалов, 19 марта 2019, 15:42**\r\nВиктор Губин, на сколько помню, это было задолго до Java 9.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812571550/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812576598", + "html_url": "https://github.com/cpp-ru/ideas/issues/419#issuecomment-812576598", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/419", + "id": 812576598, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU3NjU5OA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:23:05Z", + "updated_at": "2021-04-02T15:23:05Z", + "author_association": "MEMBER", + "body": "Работа начата в рамках https://wg21.link/P1642", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812576598/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812577209", + "html_url": "https://github.com/cpp-ru/ideas/issues/420#issuecomment-812577209", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/420", + "id": 812577209, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU3NzIwOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:24:31Z", + "updated_at": "2021-04-02T15:24:31Z", + "author_association": "MEMBER", + "body": "**Antervis, 13 марта 2019, 11:48**\r\nextern тоже одна старая болезнь с++\r\n\r\n\r\n**Александр Коновалов, 19 марта 2019, 15:55**\r\nAntervis, он действительно выглядит как болезнь, но при этом мне осталось не понятно, зачем эту болезнь (если это всё же болезнь) потащили в D?\r\n\r\n\r\n**Andrey Davydov, 13 марта 2019, 18:57**\r\nЕсть идея (очень неоднозначная) иметь разные диалекты языка в разных модулях. Одна из дискуссий, к примеру, тут: https://www.reddit.com/r/cpp/comments/agcw7d/c_modules_a_chance_to_clean_up_the_language/. Может быть такого рода решение удолетворит Вас?\r\n\r\n\r\n**Александр Коновалов, 19 марта 2019, 15:54**\r\nAndrey Davydov, да, по сути то же, что и я предлагаю, только на основе модулей. По факту, в моём предложении механизм не самое главное.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812577209/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812578019", + "html_url": "https://github.com/cpp-ru/ideas/issues/421#issuecomment-812578019", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/421", + "id": 812578019, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU3ODAxOQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:26:18Z", + "updated_at": "2021-04-02T15:26:18Z", + "author_association": "MEMBER", + "body": "**Александр Коганов, 18 марта 2019, 12:01**\r\nОчень часто приходится копипастить название базового класса, который к тому же шаблон с несколькими параметрами, которые тоже шаблоны, чьи параметры зависят от параметров производного класса. И если где-то нужно что-то поменять, приходится делать это дважды. И каждый раз удивляюсь, почему нельзя было сделать в языке такой алиас\r\n\r\n\r\n**Antervis, 18 марта 2019, 13:48**\r\nНеплохая идея. Вот только ключевого слова as в языке нет, а оператор => для типов не очень уместен, лучше подойдут typedef или ->. Я бы предпочел typedef. \r\n\r\n\r\n**Sasha Sitnikov, 25 марта 2019, 15:05**\r\nТакже можно использовать using, причем модификуатор доступа по умолчанию такой же (для struct - public, для class - private)\r\n```cpp\r\ntemplate\r\nclass Derived\r\n : public using super = public Base\r\n , using help = public Policy\r\n{/*...*/};\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812578019/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812578770", + "html_url": "https://github.com/cpp-ru/ideas/issues/287#issuecomment-812578770", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/287", + "id": 812578770, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU3ODc3MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:28:17Z", + "updated_at": "2021-04-02T15:28:17Z", + "author_association": "MEMBER", + "body": "Идея #421 дублирует эту, но прорботана лучше", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812578770/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812580035", + "html_url": "https://github.com/cpp-ru/ideas/issues/422#issuecomment-812580035", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/422", + "id": 812580035, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU4MDAzNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:31:30Z", + "updated_at": "2021-04-02T15:31:30Z", + "author_association": "MEMBER", + "body": "**iksk810, 20 марта 2019, 15:13**\r\nЛично я бы хотел вместо этого увидеть нечто похожее на when из kotlin-а.\r\nНапример:\r\n```cpp\r\nauto value = when(error_code) {\r\n network_error -> doSomething()\r\n database_error -> doAnother()\r\n user_error -> doSomethingElse()\r\n default -> doDefault()\r\n}\r\n```\r\n\r\n\r\n**Игорь Савенков, 21 марта 2019, 4:50**\r\niksk810, а какое значение будет в value?\r\n\r\nи я в описании синтаксиса when в kotlin видел ветку else. но не видел default. Перепутал?\r\n\r\nhttps://kotlinlang.org/docs/reference/control-flow.html#when-expression\r\n\r\n\r\n**iksk810, 21 марта 2019, 5:32**\r\nВ value будет ровно то, что вернёт конкретное выбранное выражение. Типы должны совпадать, разумеется.\r\n\r\nЧто касаемо синтаксиса, то это не так принципиально. На вкус и цвет. )\r\n\r\n\r\n**Andrey Davydov, 21 марта 2019, 9:55**\r\nСейчас уже всерьез обсуждается настоящий pattern matching, причем ставят амбициозную цель успеть к C++23. Текущий proposal: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1371r0.pdf\r\n\r\n\r\n**Alexey Kreschuk, 21 марта 2019, 21:44**\r\nНасколько я помню, компилятор должен игнорировать неизвестные аттрибуты. Если он проигнорирует [[autobreak]], поведение программы изменится. Ловить эту проблему значительно сложнее, чем везде писать break, тем более что об отсутствии break'а есть warning.\r\n\r\n\r\n**Игорь Савенков, 22 марта 2019, 5:42**\r\nAlexey Kreschuk, да мне уже указали в \"соседнем\" предложении, что атрибуты плохо подходят для изменения поведения кода. Поэтому вот еще один вариант синтаксиса ниже ↓\r\n\r\n\r\n**Игорь Савенков, 22 марта 2019, 5:38**\r\nМеня сегодня на еще один вариант синтаксиса натолкнули, имхо, этот вариант лучше смотрится и + решает проблему с \"обратной несовместимостью\", которую не может решить атрибут:\r\n```cpp\r\nint v = 0;\r\n\r\nswitch break (v)\r\n{\r\n case 0: zero();\r\n case 1: one();\r\n default: default();\r\n}\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812580035/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812581240", + "html_url": "https://github.com/cpp-ru/ideas/issues/423#issuecomment-812581240", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/423", + "id": 812581240, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU4MTI0MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:34:36Z", + "updated_at": "2021-04-02T15:34:36Z", + "author_association": "MEMBER", + "body": "**Александр Коганов, 21 марта 2019, 14:36**\r\nexpects/ensures выглядит понятнее, но это вопрос привычки скорее. Зато pre/post короче. И так приходится писать длинные сигнатуры с параметрами шаблона, conditional noexcept, enable_if, хитрыми decltype(std::declval.......().function()) в типе возвращаемого значения и тп. Временами все это сразу. Получается много букв. Так что имхо спорно :)\r\n\r\n\r\n**webreh, 22 марта 2019, 3:15**\r\nexpectes/ensures выглядят как два слова с одинаковыми первой, последней и количеством букв.\r\n\r\n\r\n**yndx-antoshkka, 1 апреля 2019, 13:33**\r\nТут нужны какие-нибудь аргументы, которые не были изложены в бумаге: https://github.com/cplusplus/papers/issues/162\r\n\r\nЕсли такие аргументы найдутся - можно будет возобновить обсуждение. Один из возможных аргументов: ensures, expects уже используются в тексте стандарта при описаниях поведения стандартной библиотеки. Но нужны ещё аргументы.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812581240/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812588102", + "html_url": "https://github.com/cpp-ru/ideas/issues/424#issuecomment-812588102", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/424", + "id": 812588102, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU4ODEwMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:52:03Z", + "updated_at": "2021-04-02T15:52:03Z", + "author_association": "MEMBER", + "body": "**Игорь, 29 ноября 2017, 14:01**\r\nТо есть, если мы не выполним .release() у нас по ошибке может произойти двойное очищение ресурсов? Как то не безопасно, следить получается нужно будет за тем чтобы не забыть написать .release() и чтобы выполнение кода дошло до .release() и чтобы release() находился после ручного освобождения ресурсов.\r\n\r\nЕсли такое и делать, то тогда release внутри должен не просто переключать флаг, а еще и выполнять код. Тогда, вероятно это будет работать. Но при этом нужно будет помнить, что вне функции .release освобождать ресурс нельзя. И тогда, можно спокойно забывать писать функцию release и guard вызовет code при своем уничтожении\r\n\r\n**Antervis, 1 декабря 2017, 22:41**\r\nс таким синтаксисом можно и unique_ptr для подобного использовать. Хорошая реализация бы выглядела как-то так: scoped_exit(=) { close(fd); } Стоит ли тащить в ядро языка то, что можно сделать на макросе, при тенденции уходить от макросов?\r\n\r\n**Andrey Davydov, 4 декабря 2017, 11:50**\r\nProposal на подобную штуку (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0052r3.pdf) уверенно движется в C++20 (на сколько я могу судить со стороны, сам я никакого отношения к работе комитета не имею).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812588102/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812589330", + "html_url": "https://github.com/cpp-ru/ideas/issues/424#issuecomment-812589330", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/424", + "id": 812589330, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU4OTMzMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T15:54:59Z", + "updated_at": "2021-04-02T15:54:59Z", + "author_association": "MEMBER", + "body": "В C++20 не пролезло https://wg21.link/p0052 , решили внести в Library Funcdamentals TS 3", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812589330/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812592281", + "html_url": "https://github.com/cpp-ru/ideas/issues/425#issuecomment-812592281", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/425", + "id": 812592281, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU5MjI4MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T16:01:52Z", + "updated_at": "2021-04-02T16:02:23Z", + "author_association": "MEMBER", + "body": "**Antervis, 13 декабря 2017, 06:40**\r\nтогда корректнее использовать char_type вместо char и is_convertible::value вместо is_integral. Жаль, что такое нововведение может сломать существующий код, поэтому для начала надо пометить такие перегрузки как [[deprecated]] вместо = delete\r\n\r\n**Andrey Davydov, 13 декабря 2017, 15:35**\r\nПредлагаю в тот же proposal родственное изменение: добавить deleted конструктор, так чтобы\r\nstd::string s('c', 23);\r\nне компилировалось. Люди путают порядок аргументов конструктора достаточно часто, чтобы в clang-tidy добавили проверку \"misc-string-constructor\".\r\n\r\n**Andrey Davydov, 14 декабря 2017, 08:37**\r\nК сожалению, это сломает такой валидный код:\r\n```cpp\r\nvoid test(int digit)\r\n{\r\n string s;\r\n s = '0' + digit; // 0 <= digit <= 9\r\n}\r\n```\r\n\r\n**Khurshid Normuradov, 17 декабря 2017, 21:13**\r\nAndrey Davydov,\r\nПусть сломает! В С++20 режиме !!! Посмотрим две случий:\r\n1) Автор сможет редактировать код -- значить сломанный код пофиксид.\r\n2) Автор не сможет редактирова код, т.е. это библиотека или чужой код, но развивающий (alive). В этом случий заранье предупредить об этом изменений чтобы не писали в С++20 такой код.\r\n2.2) Здесь есть куча хороших библиотеки уже не развивающий - Вот они действительно может сломается -- надо анализировать сколько % код будет сломат , если это % больше определенное значение, можно хотябы добавить [deprecated], иначи сразу \"= deleted\".\r\n\r\n**Antervis, 18 декабря 2017, 12:03**\r\nKhurshid Normuradov, Khurshid Normuradov, комитет стремится сохранить работоспособность всего легаси-кода.\r\n\r\n**Удалённый пользователь, 31 декабря 2017, 10:00**\r\nAntervis, Лучше бы компиляторы добавили предупреждение такого присвоение. Или добавили [depricated] .\r\n\r\n**yndx-antoshkka, 20 июля 2020, 20:48**\r\nЗакидывали это предложение комментарием от страны к C++20. Тогда не починили, но Андрей взялся за бумагу https://wg21.link/P2037 за что ему огромное спасибо!\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812592281/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812592603", + "html_url": "https://github.com/cpp-ru/ideas/issues/425#issuecomment-812592603", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/425", + "id": 812592603, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU5MjYwMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T16:02:32Z", + "updated_at": "2021-04-02T16:02:32Z", + "author_association": "MEMBER", + "body": "Дубликат #407", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812592603/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812595430", + "html_url": "https://github.com/cpp-ru/ideas/issues/426#issuecomment-812595430", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/426", + "id": 812595430, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU5NTQzMA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T16:09:20Z", + "updated_at": "2021-04-02T16:09:20Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 1 апреля 2019, 13:22**\r\n\r\nPlaceholders не очень удобные, лучше использовать литералы по налогии с Boost.Hana:\r\n```cpp\r\n#include \r\n#include \r\n\r\ntemplate \r\nconstexpr std::integral_constant operator\"\" _c() {\r\n return {};\r\n}\r\n\r\nstruct Fish { std::string name; };\r\nstruct Cat { std::string name; };\r\nstruct Dog { std::string name; };\r\n\r\nauto animals = std::make_tuple(Fish{\"Nemo\"}, Cat{\"Garfield\"}, Dog{\"Snoopy\"});\r\n\r\n// Access tuple elements with operator[] instead of std::get.\r\nCat garfield = animals[1_c];\r\n```\r\n\r\n**Удалённый пользователь, 1 апреля 2019, 16:33**\r\nyndx-antoshkka,\r\n\r\n\r\nНу тогда, да реализация будет еще простой:\r\n```cpp\r\ntemplate< typename ...Args > struct tuple\r\n{\r\n.......\r\n\r\n // Вроде такого.\r\n template< size_t I >\r\n auto operator [] ( std::integral_constant ) const { return std::get(*this); }\r\n\r\n // и пара перегрузок для non-const , r-value references.\r\n};\r\n```\r\n \r\n\r\nМне безумно не нравится использовать std::get в своем коде, потому что там сначала думать об индекс , а потом сам контайнер. В Массиве наоборот, сначала пищем контайнер, а потом сам индекс.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812595430/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812596081", + "html_url": "https://github.com/cpp-ru/ideas/issues/426#issuecomment-812596081", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/426", + "id": 812596081, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjU5NjA4MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T16:11:02Z", + "updated_at": "2021-04-02T16:11:02Z", + "author_association": "MEMBER", + "body": "Дубликат #158 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812596081/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812651180", + "html_url": "https://github.com/cpp-ru/ideas/issues/47#issuecomment-812651180", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/47", + "id": 812651180, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjY1MTE4MA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-02T18:19:33Z", + "updated_at": "2021-04-02T18:19:33Z", + "author_association": "MEMBER", + "body": "to_chars/from_chars в C++17 работают без создания std::string\r\n\r\nstd::stoi и аналоги улучшаются в #263 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812651180/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812880162", + "html_url": "https://github.com/cpp-ru/ideas/issues/427#issuecomment-812880162", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/427", + "id": 812880162, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjg4MDE2Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-03T15:25:00Z", + "updated_at": "2021-04-03T15:25:00Z", + "author_association": "MEMBER", + "body": "**Удалённый пользователь, 1 апреля 2019, 23:13**\r\n\r\nС появлением std::to_chars, std::from_chars, все std::stoi, stol, stoll -- можно считать \"старый\" (old-school). Есть ли смысл поддерживать их дальше для новых типах.\r\n\r\n**yndx-antoshkka, 31 июля 2019, 13:39**\r\nstringstream были дотюнены в https://wg21.link/p0408. Теперь есть методы для получения string_view на внутреннее содержимое и методы для передачи/извлечения буфера.\r\n\r\nstring_view умеют выводиться в поток, так что по стандарту строка создваваться не должна, да и на практике это не происходит.\r\n\r\nА вот stoi стоит заняться.\r\n\r\n**ujos, 17 марта 2020, 16:56**\r\n\r\n> можно считать \"старый\" (old-school).\r\n\r\nВо первых, to_char/from_chars не поддерживают локаль. std::stoi вроде поддерживает\r\n\r\nВо вторых, `operator<<(ostream&, T)` часто используется как способ конвертации Т в строку, и `operator>>(istream&, T&)` для конвертации строки в Т.\r\n\r\n> stringstream были дотюнены в https://wg21.link/p0408.\r\n\r\nЧто-то не нахожу там перегрузки конструктора std::istringstream для std::string_view...\r\n\r\n**yndx-antoshkka, 22 июля 2020, 11:58**\r\nujos,\r\n\r\n>> stringstream были дотюнены в https://wg21.link/p0408.\r\n\r\n>Что-то не нахожу там перегрузки конструктора std::istringstream для std::string_view...\r\n\r\nТам добавилась перегрузка от string&&, что даёт похожий эффект т.к. строка обязана быть скопирована/перемещена во внутрений буфер.\r\n\r\n**yndx-antoshkka, 22 июля 2020, 11:52**\r\n\r\nИдея string_view перегрузок для stoi была представлена в бумаге https://wg21.link/P0506 и отклонена комитетом:\r\n\r\n* если заменять const std::string& на string_view, то ломается пользовательский код с неявными преобразованиями\r\n\r\n* если добавлять перегрузки, то необходимо иметь по 3 перегрузки для каждого метода или много шаблонного безобразия\r\n\r\n* если добовлять новые методы, с новыми именами... то производительность это не особо улучшает, т.к. большая часть времени тратится на локали, а конструирование малой строки как правило происходид без динамической аллокации\r\n\r\n \r\n\r\nТак что P0506 отклонили в 2017 году. Но возможно с C++20 и концептами можно придумать хорошее решение, без недостатоков 2017 года.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812880162/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812880275", + "html_url": "https://github.com/cpp-ru/ideas/issues/427#issuecomment-812880275", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/427", + "id": 812880275, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjg4MDI3NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-03T15:25:59Z", + "updated_at": "2021-04-03T15:25:59Z", + "author_association": "MEMBER", + "body": "Подобная идея уже предлагалась: #263", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812880275/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812880544", + "html_url": "https://github.com/cpp-ru/ideas/issues/428#issuecomment-812880544", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/428", + "id": 812880544, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjg4MDU0NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-03T15:28:18Z", + "updated_at": "2021-04-03T15:28:18Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 1 апреля 2019, 12:51**\r\n\r\nЭто описано в стандарте, но несколько в иной форме: каждый заголовочный файл содержит только то, что непосредственно в нём описано. Всё что \"приезжает\" в единицу трансляции помимо этого - платформо специфично и на это нельзя полагаться.\r\n\r\nДругими словами, подключая вы можете \"бонусом\" получить , но при этом на другом компиляторе/платформе может вам не подключиться, при подключении . Так что если вам нужно что-то из - лучше его явно подключить, и не надеяться на то, что подтянет .", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812880544/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812880944", + "html_url": "https://github.com/cpp-ru/ideas/issues/429#issuecomment-812880944", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/429", + "id": 812880944, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjg4MDk0NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-03T15:31:19Z", + "updated_at": "2021-04-03T15:31:19Z", + "author_association": "MEMBER", + "body": "**Удалённый пользователь, 4 апреля 2019, 21:48**\r\n1) google : c++20 wide integers\r\n2) https://habr.com/ru/company/yandex/blog/323972/\r\n3) #264 \r\n\r\n**Alexander, 10 апреля 2019, 06:05**\r\nRaiden LuiKang, справедливости ради - это длинная арифметика, которая всё равно имеет фиксированный размер числа. К стандартизации не предлагается пока что длинная арифметика с автоматически расширяемым размером числа.\r\n\r\nРабота над данным предложением ведется, хоть и не так быстро, как этого бы нам хотелось.\r\n\r\n**Удалённый пользователь, 11 апреля 2019, 14:47**\r\nAlexander,\r\n\r\nAlexander, boost-multiprecision хороший вариант.\r\n\r\nНо тащить такой большой код на стандартную библиотеку многому не хочеться, потому что не все использует длинная арифметика.\r\n\r\n**NeoProgramming, 9 июня 2019, 22:55**\r\nБиблиотека это хорошо, и разных реализаций может быть много; а вот литералы для сколь угодно длинных чисел (а также и для чисел с фиксированной десятичной точкой) в стандарт нужно непременно. \r\n\r\n**Владислав Петров, 26 июня 2019, 09:04**\r\nuint/int<16...8192...>; // Было такое предложение", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812880944/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812881215", + "html_url": "https://github.com/cpp-ru/ideas/issues/430#issuecomment-812881215", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/430", + "id": 812881215, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjg4MTIxNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-03T15:33:33Z", + "updated_at": "2021-04-03T15:33:33Z", + "author_association": "MEMBER", + "body": "**yndx-antoshkka, 11 марта 2019, 16:17**\r\n\r\nМожно и добавить. Нужен работающий прототип.\r\n\r\n**Удалённый пользователь, 19 марта 2019, 21:47**\r\n\r\nЗдесь несколько кандидат пришло в мою голову ( из http://json.org/ ) .\r\n\r\n1) nlohman json https://github.com/nlohmann/json\r\n2) rapidjson https://github.com/Tencent/rapidjson\r\n3) jsoncpp https://github.com/open-source-parsers/jsoncpp\r\n\r\nНо у них каждого есть минусы, например \r\n (1) nlohman громоздкий - более 15 тысяч строк исходный код и медленный, но использует более современный C++.\r\n\r\n(2) rapidjson -- быстрый , но всегда придётся тащить за сабой аллокатор - очень не удобный.\r\n\r\n(3) jsoncpp -- стабильный, но требует много ресурс.\r\n\r\n\r\nБыло бы здорово если найти как нибудь средный баланс между быстрота и удобности, и добавить эту.\r\n\r\n\r\nИ я удивляюсь, а почему в boost ( boost.org ) библиотекам никто не предлагает добавить json или XML формат парсери? \r\n\r\nя в курсе там есть property_tree - - но это далеко от стандарта, нет там чисел, везде строка, нет массив, и очень медленный, еще бросает исключение когда парсирует, еще требует basic_stream , нет способ парсит обычная строка ( может я ошибаюсь).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812881215/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812881626", + "html_url": "https://github.com/cpp-ru/ideas/issues/431#issuecomment-812881626", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/431", + "id": 812881626, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjg4MTYyNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-03T15:36:55Z", + "updated_at": "2021-04-03T15:36:55Z", + "author_association": "MEMBER", + "body": "**Antervis, 20 марта 2019, 12:59**\r\nв языке есть fold expressions, для вариадик пака можно сделать if (((a == args) && ...)).\r\n\r\n**Лягуха Пепе, 20 марта 2019, 15:40**\r\nAntervis,\r\n\r\nAntervis, я хочу в подобные мини-хелперы засовывать не вариадик-пак. а нормальные переменные. А вон внутри, да, вариадик пак и фолд экспрешшены, по идее\r\n\r\n**Andrey Davydov, 21 марта 2019, 10:28**\r\n\r\nА так не подойдет?\r\n```\r\nranges::any_of({1, 2, 3}, a)\r\n```\r\n\r\n**Лягуха Пепе, 22 марта 2019, 22:18**\r\nAndrey Davydov, мне кажется, что это будет не zero_cost\r\n\r\n**Andrey Davydov, 22 марта 2019, 23:20**\r\nЛягуха Пепе,\r\nJordanRudess, для этих 2-х функций\r\n```cpp\r\nnamespace v1 {\r\n template\r\n bool any_of(T t, Ts... ts) {\r\n return ((t == ts) || ...);\r\n }\r\n\r\n bool test(int a, int b, int c, int d) {\r\n return any_of(a, b, c, d);\r\n }\r\n}\r\n\r\nnamespace v2 {\r\n template\r\n bool any_of(T x, std::initializer_list ys) {\r\n for (T y : ys) {\r\n if (x == y)\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n bool test(int a, int b, int c, int d) {\r\n return any_of(a, { b, c, d });\r\n }\r\n}\r\n```\r\nclang выдает дословно совпадающий assembler: https://gcc.godbolt.org/z/JVo6Nr\r\n\r\n**Лягуха Пепе, 29 марта 2019, 22:12**\r\nAndrey Davydov, ну, де-факто это закрывает мой юзкейс, но, хочется чего-то... почище? :)\r\nПравда, я не уверен, что \"почище\" это достаточная мотивация для комитета.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812881626/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812883262", + "html_url": "https://github.com/cpp-ru/ideas/issues/431#issuecomment-812883262", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/431", + "id": 812883262, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjg4MzI2Mg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-03T15:48:41Z", + "updated_at": "2021-04-03T15:48:41Z", + "author_association": "MEMBER", + "body": "С компилятором поновее и с std::array код оптимизируется до одинакового состояния https://gcc.godbolt.org/z/rWvKjr5E8\r\n\r\nstd::ranges получается так же производительно: https://gcc.godbolt.org/z/8ba6vro5r\r\n\r\nКодга добавят std::ranges::contians , то будет ещё и коротко :)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812883262/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812886285", + "html_url": "https://github.com/cpp-ru/ideas/issues/432#issuecomment-812886285", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/432", + "id": 812886285, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjg4NjI4NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-03T16:08:49Z", + "updated_at": "2021-04-03T16:08:49Z", + "author_association": "MEMBER", + "body": "**Antervis, 20 марта 2019, 12:54**\r\n\r\nВ данном случае от аттрибута зависит поведение кода. Однако:\r\nAll attributes unknown to an implementation are ignored without causing an error.(since C++17)\r\nТ.е. так сделать не получится. И соседнее предложение тоже не прокатит, по той же причине\r\n\r\n**Игорь Савенков, 20 марта 2019, 13:02**\r\nAntervis, Может тогда вообще вместо switch какое то другое ключевое слово завести? select? choise?\r\n\r\n**Игорь Савенков, 20 марта 2019, 13:05**\r\nИгорь Савенков, *choice\r\n\r\n**Удалённый пользователь, 20 марта 2019, 17:31**\r\n\r\n-Wswitch-enum GCC хорошо умеют это.\r\n\r\nhttps://stackoverflow.com/questions/5402745/gcc-switch-on-enum-retain-missing-warning-but-use-default\r\n\r\n\r\nVisual studio C++ тоже есть такой варнинг. \r\n\r\n\r\nhttps://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-4-c4062?view=vs-2017", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812886285/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812887766", + "html_url": "https://github.com/cpp-ru/ideas/issues/433#issuecomment-812887766", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/433", + "id": 812887766, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjg4Nzc2Ng==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-03T16:18:59Z", + "updated_at": "2021-04-03T16:18:59Z", + "author_association": "MEMBER", + "body": "**Nate Reinar Windwood, 17 апреля 2019, 19:46**\r\nКонтрпродуктивно: вся суть enum class в строгой типизации. Если нужен только скоупинг — засуньте enum в неймспейс.\r\n\r\n**Удалённый пользователь, 18 апреля 2019, 15:51**\r\nNate Reinar Windwood, enum class очень удобно в компайл тайм вычеслениях, а реальный пример где можно использовать его в рантайм есть? Я свой проекте все enum ы перевел на enum class и об этом сожелел, пришлось для каждого enum class написать операция сравнений на int . Конца, концов отказал от этий идей.\r\n \r\n**Удалённый пользователь, 18 апреля 2019, 15:57**\r\n```cpp\r\n// Вот один пример.\r\n\r\nstruct table_row\r\n{\r\n int id;\r\n int color;\r\n};\r\n\r\n\r\nenum class color{ red, blue, white } ;\r\n\r\nvoid read_from_db(table_row& row)\r\n{\r\n\r\n row = read_from_outside_library();\r\n\r\n // Не комплириуется без operator != ( int , enum color ) overload.\r\n\r\n if ( row.color != color::red && row.color != color::blue && row.color != color.white )\r\n throw std::runtime_error(\"row.color invalid\");\r\n}\r\n```\r\n\r\n**Удалённый пользователь, 18 апреля 2019, 16:05**\r\nЯ не предлагаю, изменить каких либо свойства enum class а. \r\n\r\nПредлагаю, implicit добавить operation == , != , < , > , <= , >= с enum class and its underlying-type.\r\n\r\n \r\n\r\nНапример, если вот эту компилятор сам генерирует, будет здорово!\r\n\r\n \r\n```cpp\r\ntemplate< typename Enum > \r\nbool operator == ( Enum e, typename std::underlying_type::type value)\r\n{\r\n return static_cast< typename std::underlying_type::type > ( e ) == value ;\r\n}\r\n\r\ntemplate< typename Enum > \r\nbool operator == ( typename std::underlying_type::type value , Enum e)\r\n{\r\n return static_cast< typename std::underlying_type::type > ( e ) == value ;\r\n}\r\n```\r\n\r\n \r\n**Виктор Губин, 2 августа 2019, 12:38**\r\nЧем вас не устраивает\r\n```cpp\r\nswitch( static_cast(value) )\r\n```\r\n?\r\n\r\nВнутри enum так или иначе это unsigned integer, есть только возможность \"подрезать\" тип. Скажем для Windows/DOS символов консоли,\r\n```cpp\r\nenum class color: uint8_t { red = 0x04; green = 0x02; blue = 0x01 };\r\n```\r\nестественно static_cast попросту сведет байт к двойному слову.\r\n\r\nК сожалению привять дополнительное константное значаение другого типа прямо внути enum С++ нельзя, хотя было-бы очень полезным:\r\n```cpp\r\nenum class error_condition {\r\n ok(\"no error\") = 0,\r\n file_not_found(\"no such file or directory\") = 1\r\npublic:\r\n constexp const char* message() const noexcept {\r\n return msg_;\r\n }\r\nprivate:\r\n explicit constexpr error_condition(const char* msg) noexcept:\r\n msg_(msg)\r\n {}\r\n const char* msg_;\r\n}\r\n```\r\nТогда вообще отпадет надобность писать switch, достаточно просто спросить у константы\r\n```cpp\r\nec.message()\r\n```\r\n2. В других языках такое уже есть :)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812887766/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812888344", + "html_url": "https://github.com/cpp-ru/ideas/issues/434#issuecomment-812888344", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/434", + "id": 812888344, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjg4ODM0NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-03T16:22:45Z", + "updated_at": "2021-04-03T16:22:45Z", + "author_association": "MEMBER", + "body": "**Antervis, 26 апреля 2019, 16:04**\r\nдалеко для всех языков начало/конец строки слева/справа соответственно )\r\n\r\n**Айдар Фаттахов, 14 мая 2019, 14:47**\r\n```cpp\r\nstd::string_view::remove_prefix\r\nstd::string_view::remove_suffix\r\n```\r\n\r\n**Удалённый пользователь, 22 мая 2019, 09:04**\r\nПредставте, нужен последный 9 символ строка. Сейчас пишем.\r\n```cpp\r\n//Current implementation. 'phone' variable used 5 times(!!)\r\nstd::string phone = read_from_outside();\r\nif (phone.length() > 9 ) {\r\n phone = phone.substr( phone.length() - 9 ) ;\r\n}\r\n\r\n//with left, right, 'phone' variable used single, ready to use.\r\nstd::string phone = right( read_from_outside(), 9 ) ; // right no more 9 symbols.\r\n```\r\n\r\n**Владимир Топунов, 19 июля 2019, 19:26**\r\nleft, right нужно добавить в span и string_view. remove_prefix, remove_suffix - не const и плохо сочетаются с функциональным стилем\r\n\r\n**Владимир Топунов, 19 июля 2019, 21:25**\r\n```cpp\r\n constexpr span left(size_t size) const noexcept\r\n {\r\n return { span_data, size };\r\n }\r\n\r\n constexpr span right(size_t size) const noexcept\r\n {\r\n return { span_data + span_size - size, size };\r\n }\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812888344/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812898105", + "html_url": "https://github.com/cpp-ru/ideas/issues/434#issuecomment-812898105", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/434", + "id": 812898105, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMjg5ODEwNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-03T17:30:47Z", + "updated_at": "2021-04-03T17:30:47Z", + "author_association": "MEMBER", + "body": "std::ranges уже отчасти позволяют это делать https://gcc.godbolt.org/z/4xKW9fP11\r\n\r\nГде-то в районе C++23 добавят std::ranges::take_last http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2214r0.html и std::ranges::to. Тогда запись будет совсем короткой:\r\n```cpp\r\n#include \r\n#include \r\n#include \r\n\r\nint main() {\r\n std::string name = \"Hello, world\";\r\n auto hello = name | std::views::take(5) | to;\r\n auto world = name | std::views::take_last(5) | to;\r\n\r\n std::cout << hello;\r\n std::cout << '\\n';\r\n std::cout << world;\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/812898105/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813046931", + "html_url": "https://github.com/cpp-ru/ideas/issues/256#issuecomment-813046931", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/256", + "id": 813046931, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMzA0NjkzMQ==", + "user": { + "login": "rusyaev-roman", + "id": 38460316, + "node_id": "MDQ6VXNlcjM4NDYwMzE2", + "avatar_url": "https://avatars.githubusercontent.com/u/38460316?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/rusyaev-roman", + "html_url": "https://github.com/rusyaev-roman", + "followers_url": "https://api.github.com/users/rusyaev-roman/followers", + "following_url": "https://api.github.com/users/rusyaev-roman/following{/other_user}", + "gists_url": "https://api.github.com/users/rusyaev-roman/gists{/gist_id}", + "starred_url": "https://api.github.com/users/rusyaev-roman/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/rusyaev-roman/subscriptions", + "organizations_url": "https://api.github.com/users/rusyaev-roman/orgs", + "repos_url": "https://api.github.com/users/rusyaev-roman/repos", + "events_url": "https://api.github.com/users/rusyaev-roman/events{/privacy}", + "received_events_url": "https://api.github.com/users/rusyaev-roman/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-04T14:57:20Z", + "updated_at": "2021-04-04T14:57:37Z", + "author_association": "MEMBER", + "body": "PoC здесь https://github.com/rusyaev-roman/llvm-project/tree/ultimate_copy_elision_v4.\r\n\r\nЧто осталось:\r\n\r\n* рефакторинг по мелочи (правильность комментариев, удаление закомменченного кода, имена функций и т.п)\r\n* адаптация проходов к интринсикам copy и cleanup -- работа простая, но муторная и кропотливая\r\n* адаптация проходов к пробросу метаданных cleanup, init, copy -- работа аналогична предыдущей, но еще проще, т.к. всех, кто не пробрасывает метаданные, можно поймать ассертами\r\n* добавить поддержку для нового pass manager (его недавно включили по умолчанию) -- работа на 1-2 часа\r\n* пофиксить баги, которые есть и те, которые могут появиться после адаптации к интринсикам, метаданным или после ребейза/рефакторинга\r\n* написать дополнительные регрессионные тесты для lit (я написал только 2, нужно еще штук 5-7)\r\n* обновить LangRef документ, добавив описание введенных интринсиков и метаданных -- небольшая работа\r\n* подготовить подробный коммит message и письмо на llvm-dev, cfe-dev, залить патч на фабрикатор и добиться мержа патча", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813046931/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813047519", + "html_url": "https://github.com/cpp-ru/ideas/issues/256#issuecomment-813047519", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/256", + "id": 813047519, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMzA0NzUxOQ==", + "user": { + "login": "rusyaev-roman", + "id": 38460316, + "node_id": "MDQ6VXNlcjM4NDYwMzE2", + "avatar_url": "https://avatars.githubusercontent.com/u/38460316?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/rusyaev-roman", + "html_url": "https://github.com/rusyaev-roman", + "followers_url": "https://api.github.com/users/rusyaev-roman/followers", + "following_url": "https://api.github.com/users/rusyaev-roman/following{/other_user}", + "gists_url": "https://api.github.com/users/rusyaev-roman/gists{/gist_id}", + "starred_url": "https://api.github.com/users/rusyaev-roman/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/rusyaev-roman/subscriptions", + "organizations_url": "https://api.github.com/users/rusyaev-roman/orgs", + "repos_url": "https://api.github.com/users/rusyaev-roman/repos", + "events_url": "https://api.github.com/users/rusyaev-roman/events{/privacy}", + "received_events_url": "https://api.github.com/users/rusyaev-roman/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-04T15:01:48Z", + "updated_at": "2021-04-04T15:01:48Z", + "author_association": "MEMBER", + "body": "Сейчас есть несколько известных ошибок, которые удалось локазиловать. Исправление нужно сделать аккуратным, т.к исправление в лоб может повлиять на время компиляции.\r\n\r\nБудет свободный промежуток с 19.04.21 по 25.04.21, в который постраюсь завершить работу.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813047519/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813047857", + "html_url": "https://github.com/cpp-ru/ideas/issues/252#issuecomment-813047857", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/252", + "id": 813047857, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMzA0Nzg1Nw==", + "user": { + "login": "rusyaev-roman", + "id": 38460316, + "node_id": "MDQ6VXNlcjM4NDYwMzE2", + "avatar_url": "https://avatars.githubusercontent.com/u/38460316?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/rusyaev-roman", + "html_url": "https://github.com/rusyaev-roman", + "followers_url": "https://api.github.com/users/rusyaev-roman/followers", + "following_url": "https://api.github.com/users/rusyaev-roman/following{/other_user}", + "gists_url": "https://api.github.com/users/rusyaev-roman/gists{/gist_id}", + "starred_url": "https://api.github.com/users/rusyaev-roman/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/rusyaev-roman/subscriptions", + "organizations_url": "https://api.github.com/users/rusyaev-roman/orgs", + "repos_url": "https://api.github.com/users/rusyaev-roman/repos", + "events_url": "https://api.github.com/users/rusyaev-roman/events{/privacy}", + "received_events_url": "https://api.github.com/users/rusyaev-roman/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-04T15:03:54Z", + "updated_at": "2021-04-04T15:03:54Z", + "author_association": "MEMBER", + "body": "see https://github.com/cpp-ru/ideas/issues/256#issuecomment-813046931", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813047857/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813048397", + "html_url": "https://github.com/cpp-ru/ideas/issues/256#issuecomment-813048397", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/256", + "id": 813048397, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMzA0ODM5Nw==", + "user": { + "login": "rusyaev-roman", + "id": 38460316, + "node_id": "MDQ6VXNlcjM4NDYwMzE2", + "avatar_url": "https://avatars.githubusercontent.com/u/38460316?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/rusyaev-roman", + "html_url": "https://github.com/rusyaev-roman", + "followers_url": "https://api.github.com/users/rusyaev-roman/followers", + "following_url": "https://api.github.com/users/rusyaev-roman/following{/other_user}", + "gists_url": "https://api.github.com/users/rusyaev-roman/gists{/gist_id}", + "starred_url": "https://api.github.com/users/rusyaev-roman/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/rusyaev-roman/subscriptions", + "organizations_url": "https://api.github.com/users/rusyaev-roman/orgs", + "repos_url": "https://api.github.com/users/rusyaev-roman/repos", + "events_url": "https://api.github.com/users/rusyaev-roman/events{/privacy}", + "received_events_url": "https://api.github.com/users/rusyaev-roman/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-04T15:07:06Z", + "updated_at": "2021-04-04T15:07:06Z", + "author_association": "MEMBER", + "body": "Еще нужно бы открыть issue по обсуждению пропозала на добавление атрибута nocapture (который обсуждали [здесь](https://youtu.be/NalyO0Rg868?t=3751)). Открою, когда выложу патч по UCE на фабрикатор", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813048397/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813055513", + "html_url": "https://github.com/cpp-ru/ideas/issues/252#issuecomment-813055513", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/252", + "id": 813055513, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMzA1NTUxMw==", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-04T15:49:24Z", + "updated_at": "2021-04-04T15:49:24Z", + "author_association": "NONE", + "body": "Для `struct S { int a; int b; int c; }; int f() { S s; reutrn s.b; } int main() { int b = f(); }` во фрейме функции main должно быть распределено место для `S::a`. Ну и в более тяжёлом случае, когда возвращается элемент из середины массива -- полмассива должны непроизводительно занимать фрейм caller-а.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813055513/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813062069", + "html_url": "https://github.com/cpp-ru/ideas/issues/252#issuecomment-813062069", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/252", + "id": 813062069, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMzA2MjA2OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-04T16:36:42Z", + "updated_at": "2021-04-04T16:36:42Z", + "author_association": "MEMBER", + "body": "> Для `struct S { int a; int b; int c; }; int f() { S s; reutrn s.b; } int main() { int b = f(); }` во фрейме функции main должно быть распределено место для `S::a`. Ну и в более тяжёлом случае, когда возвращается элемент из середины массива -- полмассива должны непроизводительно занимать фрейм caller-а.\r\n\r\nВсё верно для случая если тело `f()` не заинлайнилось. Это предложение и #256 срабатывают если `f()` встроено в вызывающего. См примеры в https://wg21.link/P0878 , где для сложных объектов это позволяет сильно сократить размер бинарника и подускорить код.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813062069/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813323825", + "html_url": "https://github.com/cpp-ru/ideas/issues/435#issuecomment-813323825", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/435", + "id": 813323825, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMzMyMzgyNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-05T10:19:14Z", + "updated_at": "2021-04-05T10:39:22Z", + "author_association": "MEMBER", + "body": "Идею заказали и чуть-чуть обсудили вот тут https://lists.isocpp.org/std-proposals/2020/11/2086.php", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813323825/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813346485", + "html_url": "https://github.com/cpp-ru/ideas/issues/435#issuecomment-813346485", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/435", + "id": 813346485, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMzM0NjQ4NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-05T11:22:27Z", + "updated_at": "2021-04-05T11:22:27Z", + "author_association": "MEMBER", + "body": "Note: проверить, как новая функция работает в обработчике `std::terminate` при выкидывании исключения из `noexcept` функции", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813346485/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813349801", + "html_url": "https://github.com/cpp-ru/ideas/issues/423#issuecomment-813349801", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/423", + "id": 813349801, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMzM0OTgwMQ==", + "user": { + "login": "shiz01", + "id": 45585072, + "node_id": "MDQ6VXNlcjQ1NTg1MDcy", + "avatar_url": "https://avatars.githubusercontent.com/u/45585072?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/shiz01", + "html_url": "https://github.com/shiz01", + "followers_url": "https://api.github.com/users/shiz01/followers", + "following_url": "https://api.github.com/users/shiz01/following{/other_user}", + "gists_url": "https://api.github.com/users/shiz01/gists{/gist_id}", + "starred_url": "https://api.github.com/users/shiz01/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/shiz01/subscriptions", + "organizations_url": "https://api.github.com/users/shiz01/orgs", + "repos_url": "https://api.github.com/users/shiz01/repos", + "events_url": "https://api.github.com/users/shiz01/events{/privacy}", + "received_events_url": "https://api.github.com/users/shiz01/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-05T11:32:03Z", + "updated_at": "2021-04-05T11:32:03Z", + "author_association": "NONE", + "body": "> require/ensure используется в Eiffel.\r\n\r\nА в контрактах SPARK используются pre и post.\r\nК тому же, в концептах уже используется requires, может возникнуть путаница и/или опечатки require{,s}.\r\n\r\n**Я за оставить pre/post в контрактах.**", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813349801/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813362897", + "html_url": "https://github.com/cpp-ru/ideas/issues/423#issuecomment-813362897", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/423", + "id": 813362897, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxMzM2Mjg5Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-05T12:11:06Z", + "updated_at": "2021-04-05T12:11:21Z", + "author_association": "MEMBER", + "body": "Контракты не приняли в C++20, а вот в стандарте слова подправили и теперь везде preconditions и postconditions, например https://eel.is/c++draft/stacktrace.entry.ctor\r\n\r\nШансы на то что в контрактах будут pre/post повышаются", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/813362897/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/815811478", + "html_url": "https://github.com/cpp-ru/ideas/issues/430#issuecomment-815811478", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/430", + "id": 815811478, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNTgxMTQ3OA==", + "user": { + "login": "ValentiWorkLearning", + "id": 25596072, + "node_id": "MDQ6VXNlcjI1NTk2MDcy", + "avatar_url": "https://avatars.githubusercontent.com/u/25596072?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/ValentiWorkLearning", + "html_url": "https://github.com/ValentiWorkLearning", + "followers_url": "https://api.github.com/users/ValentiWorkLearning/followers", + "following_url": "https://api.github.com/users/ValentiWorkLearning/following{/other_user}", + "gists_url": "https://api.github.com/users/ValentiWorkLearning/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ValentiWorkLearning/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ValentiWorkLearning/subscriptions", + "organizations_url": "https://api.github.com/users/ValentiWorkLearning/orgs", + "repos_url": "https://api.github.com/users/ValentiWorkLearning/repos", + "events_url": "https://api.github.com/users/ValentiWorkLearning/events{/privacy}", + "received_events_url": "https://api.github.com/users/ValentiWorkLearning/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-08T13:10:17Z", + "updated_at": "2021-04-08T13:10:17Z", + "author_association": "NONE", + "body": "@apolukhin https://www.boost.org/doc/libs/1_75_0/libs/json/doc/html/index.html\r\nМне почему-то кажется, что в boost уже завезли библиотеку для работы с json. Когда-то давно еще был json-spirit, но он outdated давно. А в 1.75, похоже, завезли что-то новое.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/815811478/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/815875906", + "html_url": "https://github.com/cpp-ru/ideas/issues/436#issuecomment-815875906", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/436", + "id": 815875906, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNTg3NTkwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-08T14:35:44Z", + "updated_at": "2021-04-08T14:37:11Z", + "author_association": "MEMBER", + "body": "**Andrey, 5 ноября 2019, 14:53**\r\n\r\nДля этого есть return {}", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/815875906/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/815876787", + "html_url": "https://github.com/cpp-ru/ideas/issues/436#issuecomment-815876787", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/436", + "id": 815876787, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNTg3Njc4Nw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-08T14:36:58Z", + "updated_at": "2021-04-08T14:36:58Z", + "author_association": "MEMBER", + "body": "Как верно заметили, `return {}` предоставляет необходимый функционал", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/815876787/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/816029543", + "html_url": "https://github.com/cpp-ru/ideas/issues/430#issuecomment-816029543", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/430", + "id": 816029543, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNjAyOTU0Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-08T18:06:41Z", + "updated_at": "2021-04-08T18:06:41Z", + "author_association": "MEMBER", + "body": "Boost.JSON выглядит многообещающе. Несколько смущает непривычная для Standard Library работа с аллокаторами и самописный string. Давайте я спрошу у авторов, планируют ли они её стандартизировать", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/816029543/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/816753414", + "html_url": "https://github.com/cpp-ru/ideas/issues/111#issuecomment-816753414", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/111", + "id": 816753414, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNjc1MzQxNA==", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-09T15:12:17Z", + "updated_at": "2021-04-09T15:12:17Z", + "author_association": "MEMBER", + "body": "https://wg21.link/p1251", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/816753414/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817101984", + "html_url": "https://github.com/cpp-ru/ideas/issues/437#issuecomment-817101984", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437", + "id": 817101984, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzEwMTk4NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-10T08:42:50Z", + "updated_at": "2021-04-10T08:42:50Z", + "author_association": "MEMBER", + "body": "@Roman-Koshelev\r\n\r\n### vDSO\r\nВ стандарте C++ не прописываются реализации методов, только их поведение. Это решает две проблемы:\r\n* на разных платформах разные методы для достижения наибольшей производительности. Например на Windows нет vDSO и соответственно в стандарте придётся прописывать разные имплементации для разных платформ. Это займёт уйму времени\r\n* тот платформо специфичный метод, что сегодня эффективен, может перестать быть эффективным завтра. Придумают что-то быстрее vDSO, а использовать нельзя будет - в стандарте прописано `vDSO.`.\r\n\r\nПоэтому стандарт опирается на предположение, что разработчики компиляторов и стандартных библиотек будут делать самую эффективную реализацию. Это предположение называется `Quality of Implementation` или `QoI`\r\n\r\n### QoI\r\nНе у всех всегда получается с первого раза сделать идеальную имплементацию. При этом разработчики с радостью принимают патчи и фиксы.\r\n\r\nЯ проверил для своей системы. В libstdc++ есть код https://github.com/gcc-mirror/gcc/blob/16e2427f50c208dfe07d07f18009969502c25dc8/libstdc%2B%2B-v3/src/c%2B%2B11/chrono.cc#L85-L89 , соответственно если не определён макрос `_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL` то вызов должен идти в vDSO версию функции в glibc https://github.com/lattera/glibc/blob/master/sysdeps/unix/sysv/linux/clock_gettime.c\r\nЛокальная сборка libstdc++ макрос `_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL` не определяет:\r\n```\r\ngrep -r '_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL' /data/gcc_build/\r\n/data/gcc_build/stage1-x86_64-pc-linux-gnu/32/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/c++config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n/data/gcc_build/stage1-x86_64-pc-linux-gnu/32/libstdc++-v3/config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n/data/gcc_build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/c++config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n/data/gcc_build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n/data/gcc_build/x86_64-pc-linux-gnu/32/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/c++config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n/data/gcc_build/x86_64-pc-linux-gnu/32/libstdc++-v3/config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n/data/gcc_build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/c++config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n/data/gcc_build/x86_64-pc-linux-gnu/libstdc++-v3/config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n/data/gcc_build/prev-x86_64-pc-linux-gnu/32/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/c++config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n/data/gcc_build/prev-x86_64-pc-linux-gnu/32/libstdc++-v3/config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n/data/gcc_build/prev-x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/c++config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n/data/gcc_build/prev-x86_64-pc-linux-gnu/libstdc++-v3/config.h:/* #undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL */\r\n```\r\n\r\nКакая именно у вас платформа (версия C++ библиотеки, ядра ОС, версия C библиотеки)? Заведу им багрепорты, если можно поправить.\r\n\r\n### Точность\r\nПо идее, точность можно достать из `std::chrono::*_clock::period` http://eel.is/c++draft/time#clock.req\r\nОна на вашей платформе показывает истину?\r\n\r\n### sleep_*\r\nТут всё чудаковато на разных платформах и процессорах http://gcc.1065356.n8.nabble.com/PATCH-v5-2-8-libstdc-futex-Use-FUTEX-CLOCK-REALTIME-for-wait-tp1692640p1788061.html\r\n\r\nЕсли знаете как улучшить ситуацию - пожалуйста пишите и прикладывайте бенчмарки, оформим фиксы в стандартные библиотеки. Бенчмарки можно набросать на коленке вот тут https://quick-bench.com/", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817101984/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817119232", + "html_url": "https://github.com/cpp-ru/ideas/issues/336#issuecomment-817119232", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/336", + "id": 817119232, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzExOTIzMg==", + "user": { + "login": "alexey-milovidov", + "id": 18581488, + "node_id": "MDQ6VXNlcjE4NTgxNDg4", + "avatar_url": "https://avatars.githubusercontent.com/u/18581488?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/alexey-milovidov", + "html_url": "https://github.com/alexey-milovidov", + "followers_url": "https://api.github.com/users/alexey-milovidov/followers", + "following_url": "https://api.github.com/users/alexey-milovidov/following{/other_user}", + "gists_url": "https://api.github.com/users/alexey-milovidov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/alexey-milovidov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/alexey-milovidov/subscriptions", + "organizations_url": "https://api.github.com/users/alexey-milovidov/orgs", + "repos_url": "https://api.github.com/users/alexey-milovidov/repos", + "events_url": "https://api.github.com/users/alexey-milovidov/events{/privacy}", + "received_events_url": "https://api.github.com/users/alexey-milovidov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-10T11:09:41Z", + "updated_at": "2021-04-10T11:09:41Z", + "author_association": "NONE", + "body": "Слишком много случаев, когда простое добавление restrict решает проблемы с производительностью:\r\nhttps://github.com/ClickHouse/ClickHouse/pull/19946\r\n\r\nИли просто канонический пример, где складываем поэлементно два массива в третий.\r\n\r\nА это чуть ли не единственная причина, по которой \"из коробки\" код на Rust может быть более производительным, чем на C++.\r\n\r\nПравда с учётом того, что `__restrict` работает, предложение в стандарт не так важно.\r\nХотя он работает неудобно - много непонятных случаев.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817119232/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817171732", + "html_url": "https://github.com/cpp-ru/ideas/issues/437#issuecomment-817171732", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437", + "id": 817171732, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzE3MTczMg==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-10T17:04:25Z", + "updated_at": "2021-04-10T17:04:25Z", + "author_association": "NONE", + "body": "Большое спасибо за подробный ответ. По vDSO согласен (не обязательно оно, но хотелось бы чтобы самым оптимальным доступным способом). Про \"Точность\" мой недосмотр (там все хорошо). Остается только добавить более быстрые версии часов (если они доступны на платформе), чтобы можно было получить самые быстрые часы с разрешением не менее ... . \r\nsleep_* поисследую", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817171732/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817173424", + "html_url": "https://github.com/cpp-ru/ideas/issues/438#issuecomment-817173424", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438", + "id": 817173424, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzE3MzQyNA==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-10T17:16:03Z", + "updated_at": "2021-04-10T17:18:52Z", + "author_association": "NONE", + "body": "На всякий случай привожу пример реализации\r\n`#include `\r\n`#include `\r\n`#include `\r\n\r\n`template ::value_type>>`\r\n`void sift_down(Iter first, Iter last, Compare comp = {})`\r\n`{`\r\n` std::size_t len = last - first;`\r\n` std::size_t head = 0;`\r\n` std::size_t next = head;`\r\n` while (head < (len - 1) / 2) {`\r\n` next = 2 * (next + 1);`\r\n` if (comp(*(first + next), *(first + (next - 1)))) next--;`\r\n` if (comp(*(first + next), *(first + head))) break;`\r\n` std::iter_swap(first + next, first + head);`\r\n` head = next;`\r\n` }`\r\n\r\n` if (((len % 2) == 0) && (next == (len - 2) / 2)) {`\r\n` next = 2 * head + 1;`\r\n` if (!comp(*(first + next), *(first + head))) std::iter_swap(first + next, first + head);`\r\n` }`\r\n\r\n`}`\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817173424/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817184200", + "html_url": "https://github.com/cpp-ru/ideas/issues/437#issuecomment-817184200", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437", + "id": 817184200, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzE4NDIwMA==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-10T18:31:16Z", + "updated_at": "2021-04-10T22:12:37Z", + "author_association": "NONE", + "body": "Попробовал разные функции. Вот результаты\r\nnanosleep mean duration 1641857ns\r\nrealtime_clock_nanosleep mean duration 1065419ns\r\nmonotonic_clock_nanosleep mean duration 2373212ns\r\nrealtime_abs_clock_nanosleep mean duration 1155873ns\r\nmonotonic_abs_clock_nanosleep mean duration 1715776ns\r\nsleep_for mean duration 1687494ns\r\n\r\nПока не понял чем сон в абсолютном времени хуже. И почему вообще функции абсолютного сна имеют право переходить на относительный? Это же значит что по-любому придется писать свою реализацию sleep_unit, если хочешь кода независимого от реализации стандартной библиотеки\r\n\r\nBench - [https://yadi.sk/d/PJASVaEtqgZkwg](url)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817184200/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817211512", + "html_url": "https://github.com/cpp-ru/ideas/issues/438#issuecomment-817211512", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438", + "id": 817211512, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzIxMTUxMg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-10T22:38:25Z", + "updated_at": "2021-04-10T22:38:25Z", + "author_association": "MEMBER", + "body": "Расскажите пожалуйста подробнее, можно ли расширить алгоритм, чтобы просеивать не только первый элемент вниз, но и \r\n* элементы из середины вниз\r\n* элементы из середины вверх\r\n\r\nНужны примеры помимо таймеров, где подобный подход полезен. Чем больше примеров - тем проще будет уговаривать людей из комитета", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817211512/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817259276", + "html_url": "https://github.com/cpp-ru/ideas/issues/438#issuecomment-817259276", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438", + "id": 817259276, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzI1OTI3Ng==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-11T06:48:46Z", + "updated_at": "2021-04-11T06:49:15Z", + "author_association": "NONE", + "body": "Думаю что нет смысла просеивать из середины, тк после построения кучи вся работа идет с вершиной. По крайней мере мне трудно придумать для чего может понадобится просеивание элемента из середины, и как мы вообще его получили из кучи (линейным поиском?). А вот то, что получив вершину мы ее модифицируем, а не удалим вполне логично.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817259276/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817283405", + "html_url": "https://github.com/cpp-ru/ideas/issues/438#issuecomment-817283405", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438", + "id": 817283405, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzI4MzQwNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-11T10:17:52Z", + "updated_at": "2021-04-11T10:19:41Z", + "author_association": "MEMBER", + "body": "По бенчмаркам получается, что sift_down даже немного проигрывает pop_heap+push_heap https://quick-bench.com/q/uGgN7SV6NWzoWmTwnjRBFpNX-t4\r\n\r\n![image](https://user-images.githubusercontent.com/1700098/114300332-76ab3300-9ac8-11eb-92e0-a08098735931.png)\r\n\r\n\r\n\r\n```cpp\r\n#include \r\n#include \r\n\r\nconstexpr std::size_t kCount = 1024;\r\nconstexpr std::size_t kIntervals = 1024;\r\n\r\nauto make_vector_heap() {\r\n std::vector v;\r\n v.reserve(kCount);\r\n for (std::size_t i = 0; i < kCount; ++i) {\r\n v.push_back(i);\r\n }\r\n\r\n std::make_heap(v.begin(), v.end());\r\n return v; \r\n}\r\n\r\ntemplate ::value_type>>\r\nvoid sift_down(Iter first, Iter last, Compare comp = {}) {\r\n std::size_t len = last - first;\r\n std::size_t head = 0;\r\n std::size_t next = head;\r\n while (head < (len - 1) / 2) {\r\n next = 2 * (next + 1);\r\n if (comp(*(first + next), *(first + (next - 1)))) next--;\r\n if (comp(*(first + next), *(first + head))) break;\r\n std::iter_swap(first + next, first + head);\r\n head = next;\r\n }\r\n\r\n if (((len % 2) == 0) && (next == (len - 2) / 2)) {\r\n next = 2 * head + 1;\r\n if (!comp(*(first + next), *(first + head))) std::iter_swap(first + next, first + head);\r\n }\r\n}\r\n\r\n/*\r\nstatic void MakeHeap(benchmark::State& state) {\r\n auto heap = make_vector_heap();\r\n const auto addition = state.range(0);\r\n for (auto _ : state) {\r\n heap[0] += addition;\r\n std::make_heap(heap.begin(), heap.end());\r\n if (!std::is_heap(heap.begin(), heap.end())) throw 42;\r\n benchmark::DoNotOptimize(heap);\r\n }\r\n}\r\n// Register the function as a benchmark\r\nBENCHMARK(MakeHeap)->Range(kCount / kIntervals, kCount);\r\n// */\r\n\r\nstatic void PopPush(benchmark::State& state) {\r\n auto heap = make_vector_heap();\r\n const auto addition = state.range(0);\r\n for (auto _ : state) {\r\n heap[0] += addition;\r\n std::pop_heap(heap.begin(), heap.end());\r\n std::push_heap(heap.begin(), heap.end());\r\n if (!std::is_heap(heap.begin(), heap.end())) throw 42;\r\n benchmark::DoNotOptimize(heap);\r\n }\r\n}\r\n// Register the function as a benchmark\r\nBENCHMARK(PopPush)->Range(kCount / kIntervals, kCount);\r\n\r\nstatic void SiftDown(benchmark::State& state) {\r\n auto heap = make_vector_heap();\r\n const auto addition = state.range(0);\r\n for (auto _ : state) {\r\n heap[0] += addition;\r\n sift_down(heap.begin(), heap.end());\r\n if (!std::is_heap(heap.begin(), heap.end())) throw 42;\r\n benchmark::DoNotOptimize(heap);\r\n }\r\n}\r\n// Register the function as a benchmark\r\nBENCHMARK(SiftDown)->Range(kCount / kIntervals, kCount);\r\n```\r\n\r\nМожно ли что-то соптимизировать?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817283405/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817285219", + "html_url": "https://github.com/cpp-ru/ideas/issues/438#issuecomment-817285219", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438", + "id": 817285219, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzI4NTIxOQ==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-11T10:33:49Z", + "updated_at": "2021-04-11T10:43:06Z", + "author_association": "NONE", + "body": "К сожалению вы допустили серьезную ошибку. С std::is_heap хорошо прогнать один раз для проверки, но она только сильно портит результаты. \r\n\r\nПрогнал у себя\r\n\r\ngcc 9.3. stdlib=libstdc++\r\n\r\nДебаг сборка (-O0)\r\n\r\n2021-04-11 13:29:57\r\nRunning ./a.out\r\nRun on (4 X 3000 MHz CPU s)\r\nCPU Caches:\r\n L1 Data 32K (x4)\r\n L1 Instruction 32K (x4)\r\n L2 Unified 256K (x4)\r\n L3 Unified 12288K (x4)\r\nLoad Average: 0.55, 0.36, 0.32\r\n--------------------------------------------------------\r\nBenchmark Time CPU Iterations\r\n--------------------------------------------------------\r\nPopPush/1 725 ns 725 ns 935610\r\nPopPush/8 717 ns 717 ns 958056\r\nPopPush/64 718 ns 718 ns 948277\r\nPopPush/512 720 ns 720 ns 922112\r\nPopPush/4096 718 ns 718 ns 950095\r\nPopPush/8192 720 ns 720 ns 938844\r\nSiftDown/1 44.7 ns 44.6 ns 15657294\r\nSiftDown/8 44.8 ns 44.8 ns 15647386\r\nSiftDown/64 44.6 ns 44.6 ns 15587821\r\nSiftDown/512 44.8 ns 44.7 ns 15629534\r\nSiftDown/4096 45.1 ns 45.1 ns 14752498\r\nSiftDown/8192 44.7 ns 44.6 ns 15405241\r\n\r\nРелиз сборка (-O2)\r\n2021-04-11 13:30:17\r\nRunning ./a.out\r\nRun on (4 X 3000 MHz CPU s)\r\nCPU Caches:\r\n L1 Data 32K (x4)\r\n L1 Instruction 32K (x4)\r\n L2 Unified 256K (x4)\r\n L3 Unified 12288K (x4)\r\nLoad Average: 0.68, 0.40, 0.33\r\n--------------------------------------------------------\r\nBenchmark Time CPU Iterations\r\n--------------------------------------------------------\r\nPopPush/1 24.5 ns 24.5 ns 27903927\r\nPopPush/8 24.9 ns 24.9 ns 28272596\r\nPopPush/64 24.8 ns 24.8 ns 27600987\r\nPopPush/512 24.5 ns 24.5 ns 28117353\r\nPopPush/4096 24.5 ns 24.5 ns 28302327\r\nPopPush/8192 25.5 ns 25.4 ns 28033435\r\nSiftDown/1 2.24 ns 2.23 ns 308260079\r\nSiftDown/8 2.21 ns 2.21 ns 315506332\r\nSiftDown/64 2.20 ns 2.19 ns 316876814\r\nSiftDown/512 2.19 ns 2.19 ns 315840977\r\nSiftDown/4096 2.22 ns 2.22 ns 311711964\r\nSiftDown/8192 2.21 ns 2.21 ns 315256111\r\n\r\nВыигрыш на порядок", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817285219/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817319406", + "html_url": "https://github.com/cpp-ru/ideas/issues/438#issuecomment-817319406", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438", + "id": 817319406, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzMxOTQwNg==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-11T14:45:29Z", + "updated_at": "2021-04-11T14:45:29Z", + "author_association": "MEMBER", + "body": "Да, результат получается великолепный https://quick-bench.com/q/NggXPvvYT947oplUbmyhLNQUobo\r\n\r\n![image](https://user-images.githubusercontent.com/1700098/114308530-006cf780-9aed-11eb-8464-2014e4124d4f.png)\r\n\r\nПопробуйте написать предложение для международного комитета по инструкции https://stdcpp.ru/instruction ? Если что - я помогу\r\n\r\nПара мелочей, которые надо учитывать:\r\n* В C++20 добавили ranges, так что алгоритм должен быть продублирован и в ranges стиле тоже\r\n* Остальные алгоритмы с кучами имеют `_heap` в названии. Стоит подумать на таким же именем, например `update_heap` или `sift_down_heap`\r\n* на забудьте про `constexpr` :)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817319406/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817353247", + "html_url": "https://github.com/cpp-ru/ideas/issues/418#issuecomment-817353247", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/418", + "id": 817353247, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzM1MzI0Nw==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-11T18:40:00Z", + "updated_at": "2021-04-11T18:40:00Z", + "author_association": "NONE", + "body": "std::char_traits<...>::length() помечена как constexpr. Её использует constexpr конструктор std::string_view", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817353247/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817363628", + "html_url": "https://github.com/cpp-ru/ideas/issues/418#issuecomment-817363628", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/418", + "id": 817363628, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzM2MzYyOA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-11T19:57:31Z", + "updated_at": "2021-04-11T19:57:31Z", + "author_association": "MEMBER", + "body": "Писать `std::string_view(s).length();` вместо `std::strlen(s);` - чудн**о**. Ну и https://wg21.link/p1944 предлагает добавить constexpr и к множеству других C функций.\r\n\r\nПравда у предложения есть проблемы из-за особенностей некоторых стандартных библиотек (::strlen и std::strlen должны быть одной и той же функцией)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817363628/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817566580", + "html_url": "https://github.com/cpp-ru/ideas/issues/437#issuecomment-817566580", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437", + "id": 817566580, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxNzU2NjU4MA==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-12T07:37:33Z", + "updated_at": "2021-04-12T07:37:33Z", + "author_association": "NONE", + "body": "\"Какая именно у вас платформа (версия C++ библиотеки, ядра ОС, версия C библиотеки)? Заведу им багрепорты, если можно поправить.\"\r\n\r\nldd (GNU libc) 2.28\r\nuname -r\r\n4.18.0-193.19.1.el8_2.x86_64\r\ngcc version 7.1.0\r\nx86_64-redhat-linux", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/817566580/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/819618145", + "html_url": "https://github.com/cpp-ru/ideas/issues/441#issuecomment-819618145", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/441", + "id": 819618145, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxOTYxODE0NQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-14T15:41:53Z", + "updated_at": "2021-04-14T15:42:14Z", + "author_association": "MEMBER", + "body": "### Альтернативный подход - std::any_storage (но он очень неудобный)\r\n\r\nБазовый класс хранилища, делающий type erasure.\r\n\r\nПример использования:\r\n```cpp\r\nstd::unique_ptr var;\r\n// var = 42; // ill formed\r\n// var.emplace(std::in_place); // no emplace\r\nvar = std::make_any_storage(42);\r\n\r\nvar.reset();\r\n\r\nstd::lock_guard lock{std::any_cast(var)};\r\nauto my_var = boost::shared_ptr(std::make_any_storage(42)); // 2 allocations\r\n```\r\nПлюсы:\r\n* мы получаем безопасный аналог std::unique_ptr\r\n* решение не масштабируется на любые умные указатели (например std::shared_ptr)\r\n\r\nМинусы:\r\n* интерфейс настолько неудобен, чтоб проще написать свой `unique_any` и пользоваться им", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/819618145/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/819620425", + "html_url": "https://github.com/cpp-ru/ideas/issues/441#issuecomment-819620425", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/441", + "id": 819620425, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxOTYyMDQyNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-14T15:44:58Z", + "updated_at": "2021-04-14T15:44:58Z", + "author_association": "MEMBER", + "body": "Микро обсуждение на std-proposals https://lists.isocpp.org/std-proposals/2020/05/1428.php", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/819620425/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/819743413", + "html_url": "https://github.com/cpp-ru/ideas/issues/440#issuecomment-819743413", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/440", + "id": 819743413, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxOTc0MzQxMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-14T18:35:20Z", + "updated_at": "2021-04-14T18:35:20Z", + "author_association": "MEMBER", + "body": "Это поломает очень много кода, такая идея не пройдёт голосование", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/819743413/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/819890041", + "html_url": "https://github.com/cpp-ru/ideas/issues/439#issuecomment-819890041", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/439", + "id": 819890041, + "node_id": "MDEyOklzc3VlQ29tbWVudDgxOTg5MDA0MQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-14T22:27:12Z", + "updated_at": "2021-04-14T22:27:12Z", + "author_association": "MEMBER", + "body": "Дубликат #111 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/819890041/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821040314", + "html_url": "https://github.com/cpp-ru/ideas/issues/437#issuecomment-821040314", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437", + "id": 821040314, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyMTA0MDMxNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-16T09:15:27Z", + "updated_at": "2021-04-16T09:15:27Z", + "author_association": "MEMBER", + "body": "_COARSE часы быстрее более чем в 100 раз https://quick-bench.com/q/IAaixmnh5wW5_Qe0CdMm4CCV_Pw\r\n\r\n![image](https://user-images.githubusercontent.com/1700098/115002427-68388f00-9ead-11eb-8452-2deb3eafc4fd.png)\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821040314/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821094971", + "html_url": "https://github.com/cpp-ru/ideas/issues/409#issuecomment-821094971", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/409", + "id": 821094971, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyMTA5NDk3MQ==", + "user": { + "login": "yeputons", + "id": 1297325, + "node_id": "MDQ6VXNlcjEyOTczMjU=", + "avatar_url": "https://avatars.githubusercontent.com/u/1297325?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/yeputons", + "html_url": "https://github.com/yeputons", + "followers_url": "https://api.github.com/users/yeputons/followers", + "following_url": "https://api.github.com/users/yeputons/following{/other_user}", + "gists_url": "https://api.github.com/users/yeputons/gists{/gist_id}", + "starred_url": "https://api.github.com/users/yeputons/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/yeputons/subscriptions", + "organizations_url": "https://api.github.com/users/yeputons/orgs", + "repos_url": "https://api.github.com/users/yeputons/repos", + "events_url": "https://api.github.com/users/yeputons/events{/privacy}", + "received_events_url": "https://api.github.com/users/yeputons/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-16T10:57:27Z", + "updated_at": "2021-04-16T10:57:27Z", + "author_association": "NONE", + "body": "Кажется, этим активно занимается Guy Davidson? Делал доклады на последних C++ Russia.\r\n\r\nhttps://www.youtube.com/watch?v=hPlEN_UtJSI", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821094971/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821112925", + "html_url": "https://github.com/cpp-ru/ideas/issues/393#issuecomment-821112925", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/393", + "id": 821112925, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyMTExMjkyNQ==", + "user": { + "login": "pavel-zhigulin", + "id": 6321795, + "node_id": "MDQ6VXNlcjYzMjE3OTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/6321795?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavel-zhigulin", + "html_url": "https://github.com/pavel-zhigulin", + "followers_url": "https://api.github.com/users/pavel-zhigulin/followers", + "following_url": "https://api.github.com/users/pavel-zhigulin/following{/other_user}", + "gists_url": "https://api.github.com/users/pavel-zhigulin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavel-zhigulin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavel-zhigulin/subscriptions", + "organizations_url": "https://api.github.com/users/pavel-zhigulin/orgs", + "repos_url": "https://api.github.com/users/pavel-zhigulin/repos", + "events_url": "https://api.github.com/users/pavel-zhigulin/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavel-zhigulin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-16T11:34:14Z", + "updated_at": "2021-04-16T11:34:14Z", + "author_association": "NONE", + "body": "Я не знаю, имеет смысл тут вообще что-то писать? :) Я вот тоже выскажусь против. Увеличивается связность кода, а профит - не ясен. Единственный пока приведенный пример с паттерн-матчингом не убедителен. Лучше уж заморочиться и ввести rust-like enum-ы, где каждый элемент - это тип.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821112925/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821119608", + "html_url": "https://github.com/cpp-ru/ideas/issues/432#issuecomment-821119608", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/432", + "id": 821119608, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyMTExOTYwOA==", + "user": { + "login": "pavel-zhigulin", + "id": 6321795, + "node_id": "MDQ6VXNlcjYzMjE3OTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/6321795?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavel-zhigulin", + "html_url": "https://github.com/pavel-zhigulin", + "followers_url": "https://api.github.com/users/pavel-zhigulin/followers", + "following_url": "https://api.github.com/users/pavel-zhigulin/following{/other_user}", + "gists_url": "https://api.github.com/users/pavel-zhigulin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavel-zhigulin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavel-zhigulin/subscriptions", + "organizations_url": "https://api.github.com/users/pavel-zhigulin/orgs", + "repos_url": "https://api.github.com/users/pavel-zhigulin/repos", + "events_url": "https://api.github.com/users/pavel-zhigulin/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavel-zhigulin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-16T11:48:53Z", + "updated_at": "2021-04-16T11:48:53Z", + "author_association": "NONE", + "body": "Согласен с \"удаленный пользователь\" :)\r\n\r\nКомпиляторы давно умеют бросать warning на этот счёт, атрибут не нужен.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821119608/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821123206", + "html_url": "https://github.com/cpp-ru/ideas/issues/433#issuecomment-821123206", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/433", + "id": 821123206, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyMTEyMzIwNg==", + "user": { + "login": "pavel-zhigulin", + "id": 6321795, + "node_id": "MDQ6VXNlcjYzMjE3OTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/6321795?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavel-zhigulin", + "html_url": "https://github.com/pavel-zhigulin", + "followers_url": "https://api.github.com/users/pavel-zhigulin/followers", + "following_url": "https://api.github.com/users/pavel-zhigulin/following{/other_user}", + "gists_url": "https://api.github.com/users/pavel-zhigulin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavel-zhigulin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavel-zhigulin/subscriptions", + "organizations_url": "https://api.github.com/users/pavel-zhigulin/orgs", + "repos_url": "https://api.github.com/users/pavel-zhigulin/repos", + "events_url": "https://api.github.com/users/pavel-zhigulin/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavel-zhigulin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-16T11:56:23Z", + "updated_at": "2021-04-16T11:57:09Z", + "author_association": "NONE", + "body": ">Чем вас не устраивает\r\n>\r\n>```cpp\r\n>switch( static_cast(value) )\r\n>```\r\n>?\r\n\r\nЭто UB, если value нековертируем\r\n\r\n> ```cpp\r\n> template< typename Enum > \r\n> bool operator == ( Enum e, typename std::underlying_type::type value)\r\n> {\r\n> return static_cast< typename std::underlying_type::type > ( e ) == value ;\r\n> }\r\n>\r\n> template< typename Enum > \r\n> bool operator == ( typename std::underlying_type::type value , Enum e)\r\n> {\r\n> return static_cast< typename std::underlying_type::type > ( e ) == value ;\r\n> }\r\n> ```\r\n\r\nА это - почти полное стирание грани между enum class и enum classic. Если добавить еще `operator=`, то будет совсем полное.\r\n\r\nЛучше бы в стандартную библиотеку добавить такое:\r\n\r\n```cpp\r\nenum class Enum\r\n{\r\n X = 1,\r\n Y = 100,\r\n};\r\n\r\nstd::is_enumerated(1); // true\r\nstd::is_enumerated(101); // false\r\n```\r\nОбъявить реализацию как `unspecified` и жить спокойно в ожидании нормальной рефлексии (которую хрен пойми когда привезут).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821123206/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821257848", + "html_url": "https://github.com/cpp-ru/ideas/issues/437#issuecomment-821257848", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437", + "id": 821257848, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyMTI1Nzg0OA==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-16T15:30:16Z", + "updated_at": "2021-04-16T15:30:16Z", + "author_association": "NONE", + "body": "Боюсь это предложение я сам не напишу)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821257848/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821519031", + "html_url": "https://github.com/cpp-ru/ideas/issues/437#issuecomment-821519031", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437", + "id": 821519031, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyMTUxOTAzMQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-16T19:37:04Z", + "updated_at": "2021-04-16T19:37:04Z", + "author_association": "MEMBER", + "body": "> Боюсь это предложение я сам не напишу)\r\n\r\nГлавное начните, а как поймёте что застряли - говорите и скидывайте результат. Это как правило сильно упрощает мне дальнейшую задачу по доработке... а порой и дорабатывать не надо ;-)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821519031/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821963239", + "html_url": "https://github.com/cpp-ru/ideas/issues/438#issuecomment-821963239", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438", + "id": 821963239, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyMTk2MzIzOQ==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-18T09:43:53Z", + "updated_at": "2021-04-18T09:43:53Z", + "author_association": "NONE", + "body": "Внезапно во время придумывания std::heap наткнулся на давно забытый std::priority_queue. Он не только имеет ряд недостатков (методы не constexpr. Нет reserve метода. И тд), но и ужасное название. Думаю можно наверное сделать\r\nusing heap = priority_queue прямо в std чтоб каждый не писал эту строчку сам. \r\n\r\nTODO: Также продумать как новый std::update_heap ляжет на priority_queue", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821963239/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821979841", + "html_url": "https://github.com/cpp-ru/ideas/issues/437#issuecomment-821979841", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437", + "id": 821979841, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyMTk3OTg0MQ==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-18T11:54:59Z", + "updated_at": "2021-04-18T11:54:59Z", + "author_association": "NONE", + "body": "@apolukhin \r\n\"По идее, точность можно достать из std::chrono::*_clock::period http://eel.is/c++draft/time#clock.req\r\nОна на вашей платформе показывает истину?\"\r\nНет не показывает. В Microsoft STL std::steady_clock::period == std::nano, хотя на самом деле для получения времени там используются функции _Query_perf_frequency() (говорит сколько тиков в секунде, везде где я проверил это 10^7. Гарантирует что результат постоянен с момента загрузки ПК и до выключения) и _Query_perf_counter() (возвращает те самые тики). Получается что разрешение часов у монотонных часов как и у системных 100ns а не 1 ns", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/821979841/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/822056691", + "html_url": "https://github.com/cpp-ru/ideas/issues/437#issuecomment-822056691", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437", + "id": 822056691, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyMjA1NjY5MQ==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-18T20:34:23Z", + "updated_at": "2021-04-18T20:38:58Z", + "author_association": "NONE", + "body": "В windows тоже возможна реализация быстрых часов. Например std::time (которая возвращает секунды) в windows, работает со скоростью COARSE часов в linux (примечательно то что glibc не использует вызовы gettimeofday и time которые сильно быстрее, а просто обрезает время взятое из clock_gettime до нужной точности)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/822056691/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/824881875", + "html_url": "https://github.com/cpp-ru/ideas/issues/444#issuecomment-824881875", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/444", + "id": 824881875, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNDg4MTg3NQ==", + "user": { + "login": "Russkov", + "id": 5708222, + "node_id": "MDQ6VXNlcjU3MDgyMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5708222?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Russkov", + "html_url": "https://github.com/Russkov", + "followers_url": "https://api.github.com/users/Russkov/followers", + "following_url": "https://api.github.com/users/Russkov/following{/other_user}", + "gists_url": "https://api.github.com/users/Russkov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Russkov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Russkov/subscriptions", + "organizations_url": "https://api.github.com/users/Russkov/orgs", + "repos_url": "https://api.github.com/users/Russkov/repos", + "events_url": "https://api.github.com/users/Russkov/events{/privacy}", + "received_events_url": "https://api.github.com/users/Russkov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-22T14:17:13Z", + "updated_at": "2021-04-22T14:17:13Z", + "author_association": "NONE", + "body": "я полагаю binary_search не возвращает итератор потому, что в диапазоне может быть несколько эквивалентных объектов, и в общем случае тратить несколько дополнительных итераций на поиск конкретно первого из них совершенно не обязательно.\r\n\r\nМожно было бы назвать этот алгоритм binary_search_first, т.к. он вернет итератор первый элемент из эквивалентных.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/824881875/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/824884894", + "html_url": "https://github.com/cpp-ru/ideas/issues/444#issuecomment-824884894", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/444", + "id": 824884894, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNDg4NDg5NA==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-22T14:20:57Z", + "updated_at": "2021-04-22T14:28:54Z", + "author_association": "NONE", + "body": "std::lower_bound возвращает итератор на первый элемент >= преданному. Следовательно доп итераций не будет. А вот замечание что одинаковых элементов может быть несколько ценно", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/824884894/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/824891201", + "html_url": "https://github.com/cpp-ru/ideas/issues/443#issuecomment-824891201", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/443", + "id": 824891201, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNDg5MTIwMQ==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-22T14:28:34Z", + "updated_at": "2021-04-24T17:45:26Z", + "author_association": "NONE", + "body": "А нет. Такая возможность есть", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/824891201/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/824901465", + "html_url": "https://github.com/cpp-ru/ideas/issues/444#issuecomment-824901465", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/444", + "id": 824901465, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNDkwMTQ2NQ==", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-22T14:40:03Z", + "updated_at": "2021-04-22T14:44:48Z", + "author_association": "NONE", + "body": "Для поиска нескольких эквивалентных есть `auto [lo, hi] = equal_range(beg, end, x);` (`O(logb(distance(beg,end)))`). Условие `lo != hi` - это как раз `bool`, нужный @Roman-Koshelev.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/824901465/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/825041394", + "html_url": "https://github.com/cpp-ru/ideas/issues/445#issuecomment-825041394", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/445", + "id": 825041394, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNTA0MTM5NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-22T17:21:01Z", + "updated_at": "2021-04-22T17:21:01Z", + "author_association": "MEMBER", + "body": "https://www.realworldtech.com/forum/?threadid=189711&curpostid=189723\r\n\r\n\"First off, spinlocks can only be used if you actually know you're not being scheduled while using them.\"\r\n\r\nНужны очень веские аргументы и убедительные бенчмарки, что именно spinlock эффективен для решения некоторых задач. Именно он, а не std::atomic::wait, транзакционная память или lockfree.\r\n\r\nУ меня таких аргументов и бенчмарков нет.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/825041394/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/825044358", + "html_url": "https://github.com/cpp-ru/ideas/issues/445#issuecomment-825044358", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/445", + "id": 825044358, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNTA0NDM1OA==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-22T17:25:50Z", + "updated_at": "2021-04-22T17:25:50Z", + "author_association": "NONE", + "body": "А при чем здесь эффективность? Очевидно он не будет лучше atomic::wait, но он точно используется в каждом проекте и каждый велосипедит как может. Разве этого не достаточно чтобы быть в стандарте? ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/825044358/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826333269", + "html_url": "https://github.com/cpp-ru/ideas/issues/446#issuecomment-826333269", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/446", + "id": 826333269, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNjMzMzI2OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-25T14:25:10Z", + "updated_at": "2021-04-25T14:25:10Z", + "author_association": "MEMBER", + "body": "Тогда придётся отказаться от браузеров, игр, веб серверов, банковского ПО, медицинского оборудования, графических и видео редакторов, SpaceX и прочих космических программ, фондовых бирж, Андроида, C#, Java, Javascript, C, Rust...\r\n\r\n... ведь всё это написано на C++", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826333269/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826333654", + "html_url": "https://github.com/cpp-ru/ideas/issues/445#issuecomment-826333654", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/445", + "id": 826333654, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNjMzMzY1NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-25T14:27:45Z", + "updated_at": "2021-04-25T14:27:45Z", + "author_association": "MEMBER", + "body": "Зачем добавлять плохие вещи, если можно добавлять хорошие?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826333654/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826334034", + "html_url": "https://github.com/cpp-ru/ideas/issues/444#issuecomment-826334034", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/444", + "id": 826334034, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNjMzNDAzNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-25T14:30:40Z", + "updated_at": "2021-04-25T14:30:40Z", + "author_association": "MEMBER", + "body": "Закрываю, уже есть std::equal_range", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826334034/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826334121", + "html_url": "https://github.com/cpp-ru/ideas/issues/445#issuecomment-826334121", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/445", + "id": 826334121, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNjMzNDEyMQ==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-25T14:31:11Z", + "updated_at": "2021-04-25T14:31:11Z", + "author_association": "NONE", + "body": "Надо добавлять распространённые вещи которые всеми используются. Да и то что спинлок \"плохая вещь\" очень спорно. А зачем его повсеместно используют? У вас он не используется? ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826334121/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826334934", + "html_url": "https://github.com/cpp-ru/ideas/issues/445#issuecomment-826334934", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/445", + "id": 826334934, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNjMzNDkzNA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-25T14:36:59Z", + "updated_at": "2021-04-25T14:36:59Z", + "author_association": "MEMBER", + "body": "У нас он не используется, но это не важно.\r\n\r\nВажно, что для принятия предложения международным комитетом нужна хорошая мотивация, доказательства что это полезная вещь.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826334934/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826336725", + "html_url": "https://github.com/cpp-ru/ideas/issues/119#issuecomment-826336725", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/119", + "id": 826336725, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNjMzNjcyNQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-25T14:49:08Z", + "updated_at": "2021-04-25T14:49:19Z", + "author_association": "MEMBER", + "body": "Ребята из Интела продолжают жечь https://wg21.link/p2363 - добавляют оставшиеся недостающие гетерогенные перегрузки", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826336725/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826361041", + "html_url": "https://github.com/cpp-ru/ideas/issues/444#issuecomment-826361041", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/444", + "id": 826361041, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNjM2MTA0MQ==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-25T17:40:27Z", + "updated_at": "2021-04-25T17:41:04Z", + "author_association": "NONE", + "body": "@apolukhin К сожалению этот алгоритм менее оптимален для случая когда найденный диапазон состоит из 0 или 1 элемента (а это 100% случаев которые были в моей практике). Но да с этим можно жить (однако велосипедить свой search через lower_bound все же придется)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/826361041/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/827141601", + "html_url": "https://github.com/cpp-ru/ideas/issues/450#issuecomment-827141601", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/450", + "id": 827141601, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNzE0MTYwMQ==", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-26T20:56:31Z", + "updated_at": "2021-04-26T20:56:31Z", + "author_association": "NONE", + "body": "В C++ Core Guidelines такое [предлагается](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/827141601/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/827792981", + "html_url": "https://github.com/cpp-ru/ideas/issues/451#issuecomment-827792981", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/451", + "id": 827792981, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNzc5Mjk4MQ==", + "user": { + "login": "kirillgrachoff", + "id": 35011824, + "node_id": "MDQ6VXNlcjM1MDExODI0", + "avatar_url": "https://avatars.githubusercontent.com/u/35011824?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kirillgrachoff", + "html_url": "https://github.com/kirillgrachoff", + "followers_url": "https://api.github.com/users/kirillgrachoff/followers", + "following_url": "https://api.github.com/users/kirillgrachoff/following{/other_user}", + "gists_url": "https://api.github.com/users/kirillgrachoff/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kirillgrachoff/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kirillgrachoff/subscriptions", + "organizations_url": "https://api.github.com/users/kirillgrachoff/orgs", + "repos_url": "https://api.github.com/users/kirillgrachoff/repos", + "events_url": "https://api.github.com/users/kirillgrachoff/events{/privacy}", + "received_events_url": "https://api.github.com/users/kirillgrachoff/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-27T17:45:52Z", + "updated_at": "2021-04-27T17:45:52Z", + "author_association": "NONE", + "body": "Это прикольно и легко реализуемо в случае, если там идёт раскрытие вызовов на 1, а не до самого низа.\r\n\r\nЕсли раскрытие подразумевается до самого низа, то будет сложно...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/827792981/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/827861085", + "html_url": "https://github.com/cpp-ru/ideas/issues/451#issuecomment-827861085", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/451", + "id": 827861085, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyNzg2MTA4NQ==", + "user": { + "login": "deiuch", + "id": 26200443, + "node_id": "MDQ6VXNlcjI2MjAwNDQz", + "avatar_url": "https://avatars.githubusercontent.com/u/26200443?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/deiuch", + "html_url": "https://github.com/deiuch", + "followers_url": "https://api.github.com/users/deiuch/followers", + "following_url": "https://api.github.com/users/deiuch/following{/other_user}", + "gists_url": "https://api.github.com/users/deiuch/gists{/gist_id}", + "starred_url": "https://api.github.com/users/deiuch/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/deiuch/subscriptions", + "organizations_url": "https://api.github.com/users/deiuch/orgs", + "repos_url": "https://api.github.com/users/deiuch/repos", + "events_url": "https://api.github.com/users/deiuch/events{/privacy}", + "received_events_url": "https://api.github.com/users/deiuch/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-27T19:28:59Z", + "updated_at": "2021-04-27T20:48:43Z", + "author_association": "NONE", + "body": "> Это прикольно и легко реализуемо в случае, если там идёт раскрытие вызовов на 1, а не до самого низа.\n> \n> Если раскрытие подразумевается до самого низа, то будет сложно...\n\nДа, задумка подразумевает только просмотр сигнатур вызываемых функций без прохода вглубь, конечно :)\nТолько там, где пользователь сам попросил компилятор просчитать возможность исключений.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/827861085/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/829500739", + "html_url": "https://github.com/cpp-ru/ideas/issues/448#issuecomment-829500739", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/448", + "id": 829500739, + "node_id": "MDEyOklzc3VlQ29tbWVudDgyOTUwMDczOQ==", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-04-29T18:45:10Z", + "updated_at": "2021-04-29T18:45:33Z", + "author_association": "NONE", + "body": "Это имеет смысл возможно только при наличии каких-либо других аргументов, помимо указанного пака параметров, хотя и тут выкрутиться можно. Что же касается случая, приведенного выше, то оно, начиная с C++17 решается при помощи `std::apply`:\r\n\r\n```cpp\r\nvoid foo(int a, char b, const std::string& c) { ... }\r\n\r\nstd::tuple tpl(...);\r\nstd::apply(foo, tpl);\r\n```\r\n\r\nКроме того, приведенные в посте примеры сильно ограничивают типы аргументов. Так, например, не получится сделать, чтобы инты передавались по значению, а строки - по ссылке.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/829500739/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/830960689", + "html_url": "https://github.com/cpp-ru/ideas/issues/448#issuecomment-830960689", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/448", + "id": 830960689, + "node_id": "MDEyOklzc3VlQ29tbWVudDgzMDk2MDY4OQ==", + "user": { + "login": "kirillgrachoff", + "id": 35011824, + "node_id": "MDQ6VXNlcjM1MDExODI0", + "avatar_url": "https://avatars.githubusercontent.com/u/35011824?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kirillgrachoff", + "html_url": "https://github.com/kirillgrachoff", + "followers_url": "https://api.github.com/users/kirillgrachoff/followers", + "following_url": "https://api.github.com/users/kirillgrachoff/following{/other_user}", + "gists_url": "https://api.github.com/users/kirillgrachoff/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kirillgrachoff/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kirillgrachoff/subscriptions", + "organizations_url": "https://api.github.com/users/kirillgrachoff/orgs", + "repos_url": "https://api.github.com/users/kirillgrachoff/repos", + "events_url": "https://api.github.com/users/kirillgrachoff/events{/privacy}", + "received_events_url": "https://api.github.com/users/kirillgrachoff/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-03T00:22:48Z", + "updated_at": "2021-05-03T00:22:48Z", + "author_association": "NONE", + "body": "Для передачи по ссылке и т.д. можно подключить что-то из предыдущего предложения #447.\r\n**Но** тогда непонятно, как копировать и где хранить объект.\r\n\r\nК тому же, `std::apply` работает только для `std::tuple`, а здесь предлагается реализовать это для всех типов, где есть structured binding. (в т.ч. и своих)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/830960689/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/832120229", + "html_url": "https://github.com/cpp-ru/ideas/issues/409#issuecomment-832120229", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/409", + "id": 832120229, + "node_id": "MDEyOklzc3VlQ29tbWVudDgzMjEyMDIyOQ==", + "user": { + "login": "AKonia", + "id": 7058335, + "node_id": "MDQ6VXNlcjcwNTgzMzU=", + "avatar_url": "https://avatars.githubusercontent.com/u/7058335?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AKonia", + "html_url": "https://github.com/AKonia", + "followers_url": "https://api.github.com/users/AKonia/followers", + "following_url": "https://api.github.com/users/AKonia/following{/other_user}", + "gists_url": "https://api.github.com/users/AKonia/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AKonia/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AKonia/subscriptions", + "organizations_url": "https://api.github.com/users/AKonia/orgs", + "repos_url": "https://api.github.com/users/AKonia/repos", + "events_url": "https://api.github.com/users/AKonia/events{/privacy}", + "received_events_url": "https://api.github.com/users/AKonia/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-04T17:37:55Z", + "updated_at": "2021-05-04T17:37:55Z", + "author_association": "NONE", + "body": "Идея хорошая, но если ничего не путаю, то MSVC-DirectX фанаты не сразу заценят, вернее т.к. в DirectX система координат левосторонняя, а в opengl правосторонняя, скорее всего выйдет спорная библиотека, т.к. тут либо опционально устанавливать систему координат, либо получить неодобрение от двух лагерей игровых разработчиков. Плюс напомню, что в gccшных расширениях было что-то подобное.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/832120229/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/832163065", + "html_url": "https://github.com/cpp-ru/ideas/issues/91#issuecomment-832163065", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/91", + "id": 832163065, + "node_id": "MDEyOklzc3VlQ29tbWVudDgzMjE2MzA2NQ==", + "user": { + "login": "AKonia", + "id": 7058335, + "node_id": "MDQ6VXNlcjcwNTgzMzU=", + "avatar_url": "https://avatars.githubusercontent.com/u/7058335?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AKonia", + "html_url": "https://github.com/AKonia", + "followers_url": "https://api.github.com/users/AKonia/followers", + "following_url": "https://api.github.com/users/AKonia/following{/other_user}", + "gists_url": "https://api.github.com/users/AKonia/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AKonia/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AKonia/subscriptions", + "organizations_url": "https://api.github.com/users/AKonia/orgs", + "repos_url": "https://api.github.com/users/AKonia/repos", + "events_url": "https://api.github.com/users/AKonia/events{/privacy}", + "received_events_url": "https://api.github.com/users/AKonia/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-04T18:45:54Z", + "updated_at": "2021-05-04T18:46:50Z", + "author_association": "NONE", + "body": "как вариант вместо срезов просто разрешить нецелочисленный аргумент в operator[] и тогда если уж так хочется то можно\r\n```cpp\r\nobj[rng(1, 20, 1)]\r\n```\r\nМожет и не так сахарно, но задачу решает, притом гибко - возвращай что хочешь, с другой стороны сводится к:\r\n```cpp\r\nobj(rng(1, 20, 1))\r\n```\r\nРезультат возвращается по желанию.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/832163065/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/836500711", + "html_url": "https://github.com/cpp-ru/ideas/issues/455#issuecomment-836500711", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/455", + "id": 836500711, + "node_id": "MDEyOklzc3VlQ29tbWVudDgzNjUwMDcxMQ==", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-10T10:03:23Z", + "updated_at": "2021-05-10T10:03:23Z", + "author_association": "NONE", + "body": "Как пример, можно ещё рассмотреть `zip_iterator` в [Thrust](https://thrust.github.io/doc/classthrust_1_1zip__iterator.html).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/836500711/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/837252917", + "html_url": "https://github.com/cpp-ru/ideas/issues/456#issuecomment-837252917", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/456", + "id": 837252917, + "node_id": "MDEyOklzc3VlQ29tbWVudDgzNzI1MjkxNw==", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-10T20:05:10Z", + "updated_at": "2021-05-10T20:05:10Z", + "author_association": "NONE", + "body": "> Я думаю, в C++ есть и другие примеры зависимости языка от собственной стандартной библиотеки, которые также стоит исправить, если будут найдены\r\n\r\n`type_info`, `nullptr_t`. Собственно, `type_info` был первым классом, использующимся в core language, и в тот момент (C++98), когда для его использования решили требовать `#include ` выбор был сделан.\r\n\r\n> using initializer_list = decltype(x);\r\nusing strong_ordering = decltype(0 <=> 42);\r\n\r\nТак сделано для `std::nullptr_t`, но для `type_info`, `initializer_list` и `strong_ordering`, если идти по этому пути, то придется зашивать в компилятор определения этих классов, при этом, заметим, что к `initializer_list`-у в C++14 и С++17 добавляли новые члены. Сейчас в компилятор встроены forward declaration для этих классов (к примеру, `type_info`: https://gcc.godbolt.org/z/7GWb3cab3), а определения по-честному парсятся из хедеров.\r\n\r\n> добавить встроенные языковые типы, например `_Initializer_list`, ...\r\n\r\nВ отличии от других builtin типов (`short`, `int`, `long`, ...) для `initializer_list` потребуется добавлять встроенный шаблон, такого прецедента еще не было.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/837252917/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/839261629", + "html_url": "https://github.com/cpp-ru/ideas/issues/457#issuecomment-839261629", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457", + "id": 839261629, + "node_id": "MDEyOklzc3VlQ29tbWVudDgzOTI2MTYyOQ==", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-11T23:01:20Z", + "updated_at": "2021-05-11T23:01:20Z", + "author_association": "NONE", + "body": "Тогда уж и для `std::jthread` надо такое вводить. \r\n\r\nА еще подумать, как быть с `std::async`, так как там задача по стандарту ***может*** выполняться в отдельном потоке. Напрашивается вопрос, а почему же и тут тогда приоритет нельзя задать. Интересный момент возникает, если задача не выполняется в отдельном потоке. Тогда меняется приоритет текущего потока или как?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/839261629/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/839392866", + "html_url": "https://github.com/cpp-ru/ideas/issues/457#issuecomment-839392866", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457", + "id": 839392866, + "node_id": "MDEyOklzc3VlQ29tbWVudDgzOTM5Mjg2Ng==", + "user": { + "login": "maksimus1210", + "id": 15178782, + "node_id": "MDQ6VXNlcjE1MTc4Nzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/15178782?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/maksimus1210", + "html_url": "https://github.com/maksimus1210", + "followers_url": "https://api.github.com/users/maksimus1210/followers", + "following_url": "https://api.github.com/users/maksimus1210/following{/other_user}", + "gists_url": "https://api.github.com/users/maksimus1210/gists{/gist_id}", + "starred_url": "https://api.github.com/users/maksimus1210/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/maksimus1210/subscriptions", + "organizations_url": "https://api.github.com/users/maksimus1210/orgs", + "repos_url": "https://api.github.com/users/maksimus1210/repos", + "events_url": "https://api.github.com/users/maksimus1210/events{/privacy}", + "received_events_url": "https://api.github.com/users/maksimus1210/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-12T02:51:22Z", + "updated_at": "2021-05-12T02:51:22Z", + "author_association": "NONE", + "body": "Не думаю, что для std::async нужно устанавливать приоритеты. Вместо std::async лучше использовать std::future/promise.\r\nПри написании realtime программ нужно некоторым потокам задавать высокий приоритет, так как обработка данных в приоритете над GUI, сейчас нужно для каждой ОС писать собственную реализацию, что очень не удобно.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/839392866/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/843612005", + "html_url": "https://github.com/cpp-ru/ideas/issues/451#issuecomment-843612005", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/451", + "id": 843612005, + "node_id": "MDEyOklzc3VlQ29tbWVudDg0MzYxMjAwNQ==", + "user": { + "login": "kirillgrachoff", + "id": 35011824, + "node_id": "MDQ6VXNlcjM1MDExODI0", + "avatar_url": "https://avatars.githubusercontent.com/u/35011824?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kirillgrachoff", + "html_url": "https://github.com/kirillgrachoff", + "followers_url": "https://api.github.com/users/kirillgrachoff/followers", + "following_url": "https://api.github.com/users/kirillgrachoff/following{/other_user}", + "gists_url": "https://api.github.com/users/kirillgrachoff/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kirillgrachoff/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kirillgrachoff/subscriptions", + "organizations_url": "https://api.github.com/users/kirillgrachoff/orgs", + "repos_url": "https://api.github.com/users/kirillgrachoff/repos", + "events_url": "https://api.github.com/users/kirillgrachoff/events{/privacy}", + "received_events_url": "https://api.github.com/users/kirillgrachoff/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-18T22:34:50Z", + "updated_at": "2021-05-18T22:34:50Z", + "author_association": "NONE", + "body": "Очень надо прям уже сейчас. Для своей реализации Variant прям очень нужно (ну или для тех кусков кода, где вызываются методы родителя, который package) Т.е. что-то такое:\r\n```cpp\r\ntemplate \r\nclass Derived : Base... {\r\n\r\n template \r\n void test(T&& value) noexcept(auto) {\r\n return (::Base::test(std::forward(value)) || ...);\r\n }\r\n};\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/843612005/reactions", + "total_count": 2, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 2, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/844039141", + "html_url": "https://github.com/cpp-ru/ideas/issues/458#issuecomment-844039141", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/458", + "id": 844039141, + "node_id": "MDEyOklzc3VlQ29tbWVudDg0NDAzOTE0MQ==", + "user": { + "login": "AKonia", + "id": 7058335, + "node_id": "MDQ6VXNlcjcwNTgzMzU=", + "avatar_url": "https://avatars.githubusercontent.com/u/7058335?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AKonia", + "html_url": "https://github.com/AKonia", + "followers_url": "https://api.github.com/users/AKonia/followers", + "following_url": "https://api.github.com/users/AKonia/following{/other_user}", + "gists_url": "https://api.github.com/users/AKonia/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AKonia/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AKonia/subscriptions", + "organizations_url": "https://api.github.com/users/AKonia/orgs", + "repos_url": "https://api.github.com/users/AKonia/repos", + "events_url": "https://api.github.com/users/AKonia/events{/privacy}", + "received_events_url": "https://api.github.com/users/AKonia/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-19T12:06:28Z", + "updated_at": "2021-05-19T12:06:28Z", + "author_association": "NONE", + "body": "А разве вот этот конструктор не тот, что вы ищете ?\r\n```cpp\r\ntemplate< class InputIt >\r\nbasic_string( InputIt first, InputIt last, \r\n const Allocator& alloc = Allocator() );\r\n```\r\nДа и разве это нормально, чтобы итераторы на основе которых вы создаёте строку имели разный тип, это чисто логически как ? Типо от элемента одного контейнера до элемента другого ? Подумайте, может чего-то просто не поняли и есть способ сделать то, что вы предлагаете по-другому", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/844039141/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/844462543", + "html_url": "https://github.com/cpp-ru/ideas/issues/458#issuecomment-844462543", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/458", + "id": 844462543, + "node_id": "MDEyOklzc3VlQ29tbWVudDg0NDQ2MjU0Mw==", + "user": { + "login": "kirillgrachoff", + "id": 35011824, + "node_id": "MDQ6VXNlcjM1MDExODI0", + "avatar_url": "https://avatars.githubusercontent.com/u/35011824?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kirillgrachoff", + "html_url": "https://github.com/kirillgrachoff", + "followers_url": "https://api.github.com/users/kirillgrachoff/followers", + "following_url": "https://api.github.com/users/kirillgrachoff/following{/other_user}", + "gists_url": "https://api.github.com/users/kirillgrachoff/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kirillgrachoff/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kirillgrachoff/subscriptions", + "organizations_url": "https://api.github.com/users/kirillgrachoff/orgs", + "repos_url": "https://api.github.com/users/kirillgrachoff/repos", + "events_url": "https://api.github.com/users/kirillgrachoff/events{/privacy}", + "received_events_url": "https://api.github.com/users/kirillgrachoff/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-19T20:50:21Z", + "updated_at": "2021-05-19T20:50:21Z", + "author_association": "NONE", + "body": "Нет, это не тот конструктор.\r\n\r\n`std::ranges::split_view` и другие **Ranges** могут иметь своим началом и концом итераторы разного типа. Самое главное, чтобы они были сравниваемы.\r\nПопробуйте следующий код:\r\n```cpp\r\nstd::string s = \"hello world\";\r\nauto v = std::ranges::split_view(s, ' ');\r\nfor (auto i : v) {\r\n std::cout << std::is_same_v << '\\n';\r\n}\r\n```\r\n\r\nКак это логически: хочется за O(1) копировать `view`. Но хочется по нему итерироваться. Хочется за O(1) находить конец. Решение - сделать так, чтобы `end` возвращал другой тип, который бы дёргал объект и спрашивал, есть ли там следующий.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/844462543/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/845263654", + "html_url": "https://github.com/cpp-ru/ideas/issues/458#issuecomment-845263654", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/458", + "id": 845263654, + "node_id": "MDEyOklzc3VlQ29tbWVudDg0NTI2MzY1NA==", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-20T16:20:12Z", + "updated_at": "2021-05-20T16:20:12Z", + "author_association": "NONE", + "body": "Кажется предложения для sentinel-ов уже давно есть и что-то уже [есть](https://en.cppreference.com/w/cpp/experimental/ranges/iterator/Sentinel) в C++20 experimental. Наверняка и для контейнеров уже всё продумывается.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/845263654/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/845284754", + "html_url": "https://github.com/cpp-ru/ideas/issues/458#issuecomment-845284754", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/458", + "id": 845284754, + "node_id": "MDEyOklzc3VlQ29tbWVudDg0NTI4NDc1NA==", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-20T16:50:43Z", + "updated_at": "2021-05-20T16:50:43Z", + "author_association": "NONE", + "body": "Про конструирование контейнеров, которое затруднено на самом деле: https://timur.audio/how-to-make-a-container-from-a-c20-range", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/845284754/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/850273043", + "html_url": "https://github.com/cpp-ru/ideas/issues/459#issuecomment-850273043", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/459", + "id": 850273043, + "node_id": "MDEyOklzc3VlQ29tbWVudDg1MDI3MzA0Mw==", + "user": { + "login": "XRay3D", + "id": 10693876, + "node_id": "MDQ6VXNlcjEwNjkzODc2", + "avatar_url": "https://avatars.githubusercontent.com/u/10693876?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/XRay3D", + "html_url": "https://github.com/XRay3D", + "followers_url": "https://api.github.com/users/XRay3D/followers", + "following_url": "https://api.github.com/users/XRay3D/following{/other_user}", + "gists_url": "https://api.github.com/users/XRay3D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/XRay3D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/XRay3D/subscriptions", + "organizations_url": "https://api.github.com/users/XRay3D/orgs", + "repos_url": "https://api.github.com/users/XRay3D/repos", + "events_url": "https://api.github.com/users/XRay3D/events{/privacy}", + "received_events_url": "https://api.github.com/users/XRay3D/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-05-28T09:09:53Z", + "updated_at": "2021-05-28T09:11:22Z", + "author_association": "NONE", + "body": "Моё предложение чем то похоже на #455 но более очевидно и интуитивно. Но вместо расширения с поморью библиотек немного дорабатывает сам язык, на уровне компилятора возможно провести больше оптимизаций как мне кажется. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/850273043/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/852070998", + "html_url": "https://github.com/cpp-ru/ideas/issues/459#issuecomment-852070998", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/459", + "id": 852070998, + "node_id": "MDEyOklzc3VlQ29tbWVudDg1MjA3MDk5OA==", + "user": { + "login": "nitrofox", + "id": 8256182, + "node_id": "MDQ6VXNlcjgyNTYxODI=", + "avatar_url": "https://avatars.githubusercontent.com/u/8256182?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nitrofox", + "html_url": "https://github.com/nitrofox", + "followers_url": "https://api.github.com/users/nitrofox/followers", + "following_url": "https://api.github.com/users/nitrofox/following{/other_user}", + "gists_url": "https://api.github.com/users/nitrofox/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nitrofox/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nitrofox/subscriptions", + "organizations_url": "https://api.github.com/users/nitrofox/orgs", + "repos_url": "https://api.github.com/users/nitrofox/repos", + "events_url": "https://api.github.com/users/nitrofox/events{/privacy}", + "received_events_url": "https://api.github.com/users/nitrofox/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-01T12:07:08Z", + "updated_at": "2021-06-01T12:12:46Z", + "author_association": "NONE", + "body": "В [range ](https://github.com/ericniebler/range-v3) есть похожая штука. \r\n[godbolt](https://godbolt.org/z/obT5fP8MY)\r\n```cpp\r\n#include \r\n\r\n#include \r\n#include \r\n#include \r\n#include \r\nnamespace rv = ranges::views;\r\nint main() {\r\n std::vector vi{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n std::vector const vs{\"hello\", \"goodbye\", \"hello\", \"goodbye\"};\r\n\r\n for (auto [n, s] : rv::zip(vi, vs)) {\r\n fmt::print(\"n: {} | s: {}\\n\", n, s);\r\n }\r\n for (auto [n, s] : rv::zip(rv::iota(4), vs)) {\r\n fmt::print(\"n: {} | s: {}\\n\", n, s);\r\n }\r\n}\r\n```\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/852070998/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/855632543", + "html_url": "https://github.com/cpp-ru/ideas/issues/454#issuecomment-855632543", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/454", + "id": 855632543, + "node_id": "MDEyOklzc3VlQ29tbWVudDg1NTYzMjU0Mw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-07T06:37:48Z", + "updated_at": "2021-06-07T06:37:48Z", + "author_association": "MEMBER", + "body": "Работ над идеей активно идет в https://wg21.link/p0288\r\nЕсть все шансы увидеть в C++23 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/855632543/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/855687513", + "html_url": "https://github.com/cpp-ru/ideas/issues/458#issuecomment-855687513", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/458", + "id": 855687513, + "node_id": "MDEyOklzc3VlQ29tbWVudDg1NTY4NzUxMw==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-07T07:49:36Z", + "updated_at": "2021-06-07T07:49:36Z", + "author_association": "MEMBER", + "body": "Комитет решил идти немного другим путём, через ranges::to https://wg21.link/p1206", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/855687513/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/855690749", + "html_url": "https://github.com/cpp-ru/ideas/issues/460#issuecomment-855690749", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/460", + "id": 855690749, + "node_id": "MDEyOklzc3VlQ29tbWVudDg1NTY5MDc0OQ==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-07T07:53:44Z", + "updated_at": "2021-06-07T07:53:44Z", + "author_association": "MEMBER", + "body": "Эти методы обладают неопределённым поведением, если им передать не `\\0` терминированную строку. Комитет подобгые местоды с UB на некоторых значениях называет методами с \"узким контрактом\" (narrow contract).\r\n\r\nВсе методы с narrow contract не помечаются в стандарте как noexcept. (Есть правда пара досадных исключений, которые уже невозможно исправить)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/855690749/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/858517194", + "html_url": "https://github.com/cpp-ru/ideas/issues/459#issuecomment-858517194", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/459", + "id": 858517194, + "node_id": "MDEyOklzc3VlQ29tbWVudDg1ODUxNzE5NA==", + "user": { + "login": "XRay3D", + "id": 10693876, + "node_id": "MDQ6VXNlcjEwNjkzODc2", + "avatar_url": "https://avatars.githubusercontent.com/u/10693876?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/XRay3D", + "html_url": "https://github.com/XRay3D", + "followers_url": "https://api.github.com/users/XRay3D/followers", + "following_url": "https://api.github.com/users/XRay3D/following{/other_user}", + "gists_url": "https://api.github.com/users/XRay3D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/XRay3D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/XRay3D/subscriptions", + "organizations_url": "https://api.github.com/users/XRay3D/orgs", + "repos_url": "https://api.github.com/users/XRay3D/repos", + "events_url": "https://api.github.com/users/XRay3D/events{/privacy}", + "received_events_url": "https://api.github.com/users/XRay3D/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-10T10:46:08Z", + "updated_at": "2021-06-10T10:46:16Z", + "author_association": "NONE", + "body": "> В [range ](https://github.com/ericniebler/range-v3) есть похожая штука.\r\n> [godbolt](https://godbolt.org/z/obT5fP8MY)\r\n\r\nЭто хорошо но всё же хотелось иметь это в компиляторе, а не таскать внешние библиотеки.\r\nНадо будет проверить на присваивание к \"забиденным\" полям.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/858517194/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/858687299", + "html_url": "https://github.com/cpp-ru/ideas/issues/459#issuecomment-858687299", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/459", + "id": 858687299, + "node_id": "MDEyOklzc3VlQ29tbWVudDg1ODY4NzI5OQ==", + "user": { + "login": "nitrofox", + "id": 8256182, + "node_id": "MDQ6VXNlcjgyNTYxODI=", + "avatar_url": "https://avatars.githubusercontent.com/u/8256182?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nitrofox", + "html_url": "https://github.com/nitrofox", + "followers_url": "https://api.github.com/users/nitrofox/followers", + "following_url": "https://api.github.com/users/nitrofox/following{/other_user}", + "gists_url": "https://api.github.com/users/nitrofox/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nitrofox/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nitrofox/subscriptions", + "organizations_url": "https://api.github.com/users/nitrofox/orgs", + "repos_url": "https://api.github.com/users/nitrofox/repos", + "events_url": "https://api.github.com/users/nitrofox/events{/privacy}", + "received_events_url": "https://api.github.com/users/nitrofox/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-10T14:47:58Z", + "updated_at": "2021-06-10T14:48:09Z", + "author_association": "NONE", + "body": "> Это хорошо но всё же хотелось иметь это в компиляторе, а не таскать внешние библиотеки.\r\n\r\n[Range](https://en.cppreference.com/w/cpp/ranges) частично впихнули в С++20 . Но в стандарт не вошел zip. Может в С++23 добавят. \r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/858687299/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/859114971", + "html_url": "https://github.com/cpp-ru/ideas/issues/455#issuecomment-859114971", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/455", + "id": 859114971, + "node_id": "MDEyOklzc3VlQ29tbWVudDg1OTExNDk3MQ==", + "user": { + "login": "nitrofox", + "id": 8256182, + "node_id": "MDQ6VXNlcjgyNTYxODI=", + "avatar_url": "https://avatars.githubusercontent.com/u/8256182?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/nitrofox", + "html_url": "https://github.com/nitrofox", + "followers_url": "https://api.github.com/users/nitrofox/followers", + "following_url": "https://api.github.com/users/nitrofox/following{/other_user}", + "gists_url": "https://api.github.com/users/nitrofox/gists{/gist_id}", + "starred_url": "https://api.github.com/users/nitrofox/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nitrofox/subscriptions", + "organizations_url": "https://api.github.com/users/nitrofox/orgs", + "repos_url": "https://api.github.com/users/nitrofox/repos", + "events_url": "https://api.github.com/users/nitrofox/events{/privacy}", + "received_events_url": "https://api.github.com/users/nitrofox/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-10T22:13:53Z", + "updated_at": "2021-06-10T22:13:53Z", + "author_association": "NONE", + "body": "Это все есть в [range](https://github.com/ericniebler/range-v3). И даже намного больше.\r\n[godbolt](https://godbolt.org/z/1dc8oKWb1)\r\n\r\n```c++\r\n#include \r\n#include \r\n#include \r\n#include \r\n#include \r\n#include \r\nnamespace rv = ranges::views;\r\nint main() {\r\n std::vector vi{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\r\n std::vector const vs{\"hello\", \"goodbye\", \"hello\", \"goodbye\"};\r\n\r\n for (auto [n, s] : rv::zip(vi, vs)) {\r\n fmt::print(\"n: {} | s: {}\\n\", n, s);\r\n }\r\n fmt::print(\"\\n=====\\n\\n\");\r\n for (auto [n, s] : rv::zip(rv::iota(4), vs)) {\r\n fmt::print(\"n: {} | s: {}\\n\", n, s);\r\n }\r\n fmt::print(\"\\n=====\\n\\n\");\r\n for (auto [n, s] :\r\n rv::zip(rv::iota(1), rv::concat(vs, vi | rv::transform([](auto i) {\r\n return std::to_string(i);\r\n })))) {\r\n fmt::print(\"n: {} | s: {}\\n\", n, s);\r\n }\r\n}\r\n\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/859114971/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/859539901", + "html_url": "https://github.com/cpp-ru/ideas/issues/74#issuecomment-859539901", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/74", + "id": 859539901, + "node_id": "MDEyOklzc3VlQ29tbWVudDg1OTUzOTkwMQ==", + "user": { + "login": "toughengineer", + "id": 20643126, + "node_id": "MDQ6VXNlcjIwNjQzMTI2", + "avatar_url": "https://avatars.githubusercontent.com/u/20643126?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/toughengineer", + "html_url": "https://github.com/toughengineer", + "followers_url": "https://api.github.com/users/toughengineer/followers", + "following_url": "https://api.github.com/users/toughengineer/following{/other_user}", + "gists_url": "https://api.github.com/users/toughengineer/gists{/gist_id}", + "starred_url": "https://api.github.com/users/toughengineer/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/toughengineer/subscriptions", + "organizations_url": "https://api.github.com/users/toughengineer/orgs", + "repos_url": "https://api.github.com/users/toughengineer/repos", + "events_url": "https://api.github.com/users/toughengineer/events{/privacy}", + "received_events_url": "https://api.github.com/users/toughengineer/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-11T12:16:43Z", + "updated_at": "2021-06-11T12:16:43Z", + "author_association": "NONE", + "body": "я ~~джва года~~ устал ждать эту несчастную перегрузку, блджад!\r\n\r\nещё есть вот такое: \r\nhttp://wg21.link/p1228 \r\nно оно, видимо, протухло. хотя можно было бы и оживить.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/859539901/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/859543160", + "html_url": "https://github.com/cpp-ru/ideas/issues/449#issuecomment-859543160", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/449", + "id": 859543160, + "node_id": "MDEyOklzc3VlQ29tbWVudDg1OTU0MzE2MA==", + "user": { + "login": "toughengineer", + "id": 20643126, + "node_id": "MDQ6VXNlcjIwNjQzMTI2", + "avatar_url": "https://avatars.githubusercontent.com/u/20643126?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/toughengineer", + "html_url": "https://github.com/toughengineer", + "followers_url": "https://api.github.com/users/toughengineer/followers", + "following_url": "https://api.github.com/users/toughengineer/following{/other_user}", + "gists_url": "https://api.github.com/users/toughengineer/gists{/gist_id}", + "starred_url": "https://api.github.com/users/toughengineer/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/toughengineer/subscriptions", + "organizations_url": "https://api.github.com/users/toughengineer/orgs", + "repos_url": "https://api.github.com/users/toughengineer/repos", + "events_url": "https://api.github.com/users/toughengineer/events{/privacy}", + "received_events_url": "https://api.github.com/users/toughengineer/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-11T12:22:20Z", + "updated_at": "2021-06-11T12:22:20Z", + "author_association": "NONE", + "body": "если компутер синхронизировал время с интернетами, то кэширование весело накрывается медным тазом.\r\n\r\nмонотонные часы они на то и монотонные, что не зависят от внешней корректировки часов.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/859543160/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/859544811", + "html_url": "https://github.com/cpp-ru/ideas/issues/449#issuecomment-859544811", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/449", + "id": 859544811, + "node_id": "MDEyOklzc3VlQ29tbWVudDg1OTU0NDgxMQ==", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-11T12:25:17Z", + "updated_at": "2021-06-11T12:25:17Z", + "author_association": "NONE", + "body": "Как не зависят? Зависят, и тикают с той же скоростью что и системные. Для них есть гарантия что каждый следующий вызов получения времени возвращает время больше предыдущего", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/859544811/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/860062044", + "html_url": "https://github.com/cpp-ru/ideas/issues/74#issuecomment-860062044", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/74", + "id": 860062044, + "node_id": "MDEyOklzc3VlQ29tbWVudDg2MDA2MjA0NA==", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-12T14:36:56Z", + "updated_at": "2021-06-12T14:36:56Z", + "author_association": "MEMBER", + "body": "> я ~джва года~ устал ждать эту несчастную перегрузку, блджад!\r\n\r\nНе ждите, напишите proposal, убедитесь что перегрузки не ломают старый код, где строка складывается с `const char*` или с типом с `operator string()`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/860062044/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/863329693", + "html_url": "https://github.com/cpp-ru/ideas/issues/461#issuecomment-863329693", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/461", + "id": 863329693, + "node_id": "MDEyOklzc3VlQ29tbWVudDg2MzMyOTY5Mw==", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-17T15:18:35Z", + "updated_at": "2021-06-17T15:18:35Z", + "author_association": "NONE", + "body": "Для этого в языке должна существовать возможность доступа к таблице идентификаторов. Насколько мне известно, такое предполагается пропозалом по рефлексии.\r\nЕсли не предполагается, то поправьте 😄 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/863329693/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/865128849", + "html_url": "https://github.com/cpp-ru/ideas/issues/438#issuecomment-865128849", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438", + "id": 865128849, + "node_id": "MDEyOklzc3VlQ29tbWVudDg2NTEyODg0OQ==", + "user": { + "login": "toughengineer", + "id": 20643126, + "node_id": "MDQ6VXNlcjIwNjQzMTI2", + "avatar_url": "https://avatars.githubusercontent.com/u/20643126?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/toughengineer", + "html_url": "https://github.com/toughengineer", + "followers_url": "https://api.github.com/users/toughengineer/followers", + "following_url": "https://api.github.com/users/toughengineer/following{/other_user}", + "gists_url": "https://api.github.com/users/toughengineer/gists{/gist_id}", + "starred_url": "https://api.github.com/users/toughengineer/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/toughengineer/subscriptions", + "organizations_url": "https://api.github.com/users/toughengineer/orgs", + "repos_url": "https://api.github.com/users/toughengineer/repos", + "events_url": "https://api.github.com/users/toughengineer/events{/privacy}", + "received_events_url": "https://api.github.com/users/toughengineer/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-06-21T15:31:36Z", + "updated_at": "2021-06-24T11:47:29Z", + "author_association": "NONE", + "body": "Я напилил свою версию, которая имхо проще в написании и понимании, а также слегка быстрее работает (https://quick-bench.com/q/eD-G0nkrHntqdLR0a0CXNj5VNJw):\r\n```c++\r\ntemplate::value_type>>\r\nvoid sift_down(RandomIt begin, RandomIt end, const Compare &comp = {}) { // sift down element at 'begin'\r\n using std::swap;\r\n\r\n const auto length = static_cast(end - begin);\r\n size_t current = 0;\r\n size_t next = 2;\r\n while (next < length) {\r\n if (comp(*(begin + next), *(begin + (next - 1))))\r\n --next;\r\n if (!comp(*(begin + current), *(begin + next)))\r\n return;\r\n swap(*(begin + current), *(begin + next));\r\n\r\n current = next;\r\n next = 2 * current + 2;\r\n }\r\n --next;\r\n if (next < length && comp(*(begin + current), *(begin + next)))\r\n swap(*(begin + current), *(begin + next));\r\n}\r\n```\r\n\r\nТакже, чтобы каждый разработчик на свете не писал каждый раз\r\n```c++\r\nif (value < *begin) {\r\n *begin = value;\r\n sift_down(begin, end);\r\n}\r\n```\r\nнаверное, было бы интересно иметь такую версию:\r\n```c++\r\ntemplate::value_type>>\r\nvoid sift_down(RandomIt begin, RandomIt end, T &&value, Compare comp = {});\r\n```\r\nкоторая могла бы использовать только `move` без `swap`, что должно работать несколько оптимальнее. Тогда можно было бы писать просто\r\n```c++\r\nsift_down(begin, end, value);\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/865128849/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/877099846", + "html_url": "https://github.com/cpp-ru/ideas/issues/453#issuecomment-877099846", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/453", + "id": 877099846, + "node_id": "MDEyOklzc3VlQ29tbWVudDg3NzA5OTg0Ng==", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-09T10:57:27Z", + "updated_at": "2021-07-09T10:57:27Z", + "author_association": "NONE", + "body": "Несколько раз порывался это написать и пришел к выводу что в этом нет смысла. В подавляющем большинстве случаев операции преобразования к строке и из строки производятся при операциях ввода/ вывода. То есть при чтении и записи в файлы и сокеты в текстовых форматах (CSV,XML,HTML,JSON,YAML и т.д.) Тут от constexpr вообще нет толку, эти операции происходят в runtime. А с вещественными числами типа float,double,long double вообще крайне сложно без С библиотеки выполнить преобразование, если операции делать без ассемблерных команд то получится крайне не производительный код потому что не будет задействовано \"ускорительное железо\". Стандартная библиотека С как правило содержит весьма оптимизированный ассемблерный код под целевую платформу. 2. В программе если есть константы которые нужно в файл/cокет писать как значения по умолчанию - лучше сразу строковым литералом и задавать. И время компиляции уменьшиться, и читать код проще будет. Однако даже если этого не делать, компиляторы умеют хорошо оптимизировать такие преобразования и сами подставлять уже преобразованные значения.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/877099846/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/877115107", + "html_url": "https://github.com/cpp-ru/ideas/issues/430#issuecomment-877115107", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/430", + "id": 877115107, + "node_id": "MDEyOklzc3VlQ29tbWVudDg3NzExNTEwNw==", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-09T11:22:52Z", + "updated_at": "2021-07-09T11:33:12Z", + "author_association": "NONE", + "body": "Подавляющее большинство парсеров используют пул строк, в форматах вроде XML и JSON часто встречаются повторяющиеся строки скажем:\r\n```xml\r\n\r\n \r\n \r\n\r\n```\r\nили\r\n\r\n```json\r\n{\r\nadministrator:[ \r\n {\r\n \"userName\": \"John Doe\",\r\n \"userRole\": \"admin\"\r\n },\r\n {\r\n \"userName\": \"John Doe\",\r\n \"userRole\": \"admin\"\r\n }],\r\nusers: [ \r\n {\r\n \"userName\": \"John Doe\",\r\n \"userRole\": \"user\"\r\n },\r\n {\r\n \"userName\": \"John Doe\",\r\n \"userRole\": \"user\"\r\n }],\r\n```\r\nИспользуется часто повторяющийся префикс soapenv и название тегов, аналогично название полей в json и enum значения типа userRole и т.д.. Если помещать copy on write строки в хеш таблицу, можно сократить потребление памяти и ускорить парсинг, причем существенно. К таким срокам можно так же применить и small string optimization если нужно. Второй важный момент - UNICODE в особенности UTF-8, который в std::basic_string не завезли. Поэтому парсеро-писатели с давних времен (expat, xerces, pugi.xml, json-c и т.д.) пишут велосипедные строки вместо универсального std::basic_string. В тех парсерах, где авторы не профилировали то что получается, std::basic_string делает производительности очень плохо, а потреблению памяти еще хуже. Все конечно зависит от реализации в стандартной библиотеке, однако она тоже разной бывает в зависимости от компилятора и платформы.\r\n\r\nСтандартные распределители памяти тоже часто показывают не удовлетворительный результат, для парсеров больше подходят SLAB и stack подобные распределители, private heap-пы, анклавы и тому подобные механизмы. Парсеры в виду своей специфики часто выделяют объекты в памяти переменных размеров - сроки, ноды деревьев и т.п. Часто такие объекты нужно размещать в памяти по возможности ближе друг к другу, для достижения большей производительности и минимизации кеш промахов при обращении к памяти. \r\n\r\nСуммируя - вполне возможно функциональность парсеров вообще не стоит стандартизировать. Потому как на вкус и цвет как известно, все может сильно зависеть как от потребностей программы так и от предпочтений программиста. Рано или поздно появятся альтернативные реализации и API. Если взять Java в стандарную библиотеку только для XML ввели : DOM, SAX и StAX. Для JSON уже ничего не вводили, но никто и не жалуется все пользуются тем что им больше нравится или подходит.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/877115107/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/877147095", + "html_url": "https://github.com/cpp-ru/ideas/issues/25#issuecomment-877147095", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/25", + "id": 877147095, + "node_id": "MDEyOklzc3VlQ29tbWVudDg3NzE0NzA5NQ==", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-09T12:21:47Z", + "updated_at": "2021-07-09T12:29:34Z", + "author_association": "NONE", + "body": "> Как char_traits::copy() и char_traits::length() сделать constexpr, если одна из эффективных реализаций - ассемблер? \r\n\r\nУже предлагал вроде как. Компилятор сам по себе - программа, и по факту всегда линкуется с стандартной библиотекой C. Тоесть по сути может без каких либо особенных проблем вызвать функции стандартной бибилотеки в момент компиляции. Компиляция с С++ превратилась в что-то вроде интерпритации обобщенных аспектов с преобразованием оных в конкретный код, будь то шаблоны или constrexpr. Не вижу причин почему бы не убрать расширения типа интрисиков и сделать функции стандартной билиотеки из сtype, cstring и т.п. - операторами языка. Пукай компилятор сам все делает как и в случае с интрисиками. Единственный вопрос который я тут вижу - кросс компиляция.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/877147095/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/879016458", + "html_url": "https://github.com/cpp-ru/ideas/issues/461#issuecomment-879016458", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/461", + "id": 879016458, + "node_id": "MDEyOklzc3VlQ29tbWVudDg3OTAxNjQ1OA==", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-13T11:42:58Z", + "updated_at": "2021-07-13T11:43:44Z", + "author_association": "NONE", + "body": "В С++ есть разные типы данных, и нет такого что все типы - классы унаследованные от общего предка и имеют метод преобразования в строку, на чем в общем и базируется трюки из $\"Vars: a={a}, b={b}!\" Python, Ruby, Groovy и т.д. В этих языках однозанчно можно сказать что у любого типа есть метод преобразующий его в строку. \r\nC++ язык другого уровня контроля абстракций, за счет чего на нем можно написать как ядро операционной системы так и прикладную CRUD программу. Поэтому типы можно создавать разные: структуры, массивы объединения, перечисления и т.д. И к строке они в общем могут приводится по усмотрению программиста, по умолчанию этого не происходит. \r\nИсходную проблему так же можно решить через библиотеки, например [Boost Format](https://www.boost.org/doc/libs/1_76_0/libs/format/doc/format.html) ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/879016458/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/879323594", + "html_url": "https://github.com/cpp-ru/ideas/issues/461#issuecomment-879323594", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/461", + "id": 879323594, + "node_id": "MDEyOklzc3VlQ29tbWVudDg3OTMyMzU5NA==", + "user": { + "login": "Aegel5", + "id": 10333681, + "node_id": "MDQ6VXNlcjEwMzMzNjgx", + "avatar_url": "https://avatars.githubusercontent.com/u/10333681?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Aegel5", + "html_url": "https://github.com/Aegel5", + "followers_url": "https://api.github.com/users/Aegel5/followers", + "following_url": "https://api.github.com/users/Aegel5/following{/other_user}", + "gists_url": "https://api.github.com/users/Aegel5/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Aegel5/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Aegel5/subscriptions", + "organizations_url": "https://api.github.com/users/Aegel5/orgs", + "repos_url": "https://api.github.com/users/Aegel5/repos", + "events_url": "https://api.github.com/users/Aegel5/events{/privacy}", + "received_events_url": "https://api.github.com/users/Aegel5/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-13T18:56:44Z", + "updated_at": "2021-07-14T17:27:31Z", + "author_association": "NONE", + "body": "Речь идет исключительно о синтаксическом сахаре.\r\n\r\nЕсли такое работает:\r\n`std::cout << std::format(\"Hello {}!\\n\", 123);`\r\nто значит должно работать и такое\r\n`std::cout << $\"Hello {123}!\\n\";`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/879323594/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/882402627", + "html_url": "https://github.com/cpp-ru/ideas/issues/466#issuecomment-882402627", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/466", + "id": 882402627, + "node_id": "IC_kwDOFK7cns40mGVD", + "user": { + "login": "tuminskiy", + "id": 37376764, + "node_id": "MDQ6VXNlcjM3Mzc2NzY0", + "avatar_url": "https://avatars.githubusercontent.com/u/37376764?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tuminskiy", + "html_url": "https://github.com/tuminskiy", + "followers_url": "https://api.github.com/users/tuminskiy/followers", + "following_url": "https://api.github.com/users/tuminskiy/following{/other_user}", + "gists_url": "https://api.github.com/users/tuminskiy/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tuminskiy/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tuminskiy/subscriptions", + "organizations_url": "https://api.github.com/users/tuminskiy/orgs", + "repos_url": "https://api.github.com/users/tuminskiy/repos", + "events_url": "https://api.github.com/users/tuminskiy/events{/privacy}", + "received_events_url": "https://api.github.com/users/tuminskiy/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-19T09:36:55Z", + "updated_at": "2021-07-19T09:36:55Z", + "author_association": "NONE", + "body": "В C++20 есть split_view: https://en.cppreference.com/w/cpp/ranges/split_view", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/882402627/reactions", + "total_count": 5, + "+1": 5, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/882719904", + "html_url": "https://github.com/cpp-ru/ideas/issues/467#issuecomment-882719904", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/467", + "id": 882719904, + "node_id": "IC_kwDOFK7cns40nTyg", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-19T17:17:13Z", + "updated_at": "2021-07-19T17:22:15Z", + "author_association": "NONE", + "body": "В упор не пойму зачем ? std::errc это enum для std::error_category который используеться в std::error_code. У std::error_code пере-определен оператор explicit boolean, который выдает true когда ошибка присутвует. \r\n\r\nВ итоге в примере `ec == std::errc()` нужно поменять на `!er`\r\n\r\nВ свою очередь чтобы создать error_code с ошибкой из std::errc делаем\r\n\r\n```c++\r\nstd::string foo(std::error_code& ec) \r\n{\r\n ...\r\n if( ) {\r\n ec = std::make_error_code(std::errc::illegal_byte_sequence);\r\n return std::string();\r\n } \r\n}\r\n\r\nstd::error_code ec;\r\n\r\nstd::string ret = foo(ec);\r\nif(ec) {\r\n throw std::system_error(ec);\r\n}\r\n\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/882719904/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/882735282", + "html_url": "https://github.com/cpp-ru/ideas/issues/461#issuecomment-882735282", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/461", + "id": 882735282, + "node_id": "IC_kwDOFK7cns40nXiy", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-19T17:41:13Z", + "updated_at": "2021-07-19T17:41:47Z", + "author_association": "NONE", + "body": "[std::format](https://en.cppreference.com/w/cpp/utility/format/format) это шаблонная функция. Она использует синтаксис языка, а не втраиваетсья в него. А значит и не заставляет обязательно линковать стандартную библиотеку к любой программе или библиотеке. И не влияет на оптимизатор кода. В случае с синтаксисом - так уже не получится и выходит что на С++ уже нельзя писать embedded, ядра операционных систем, драйвера устройств и т.д. (да dynamic_cast, typed и static переменные - это явно промах который привел к разделению стандартной библиотеки на части, одна из которых это ABI).\r\nПосмотрите другие компилируемые языки, вы в них не найдете такой возможности, в отличие от интерпретаторов где такой синтаксис - стандарт. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/882735282/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/883073967", + "html_url": "https://github.com/cpp-ru/ideas/issues/467#issuecomment-883073967", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/467", + "id": 883073967, + "node_id": "IC_kwDOFK7cns40oqOv", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-20T05:34:09Z", + "updated_at": "2021-07-20T05:34:09Z", + "author_association": "NONE", + "body": "При чем тут error_code? В стандартной библиотеке есть функции которые возвращают std::errc, который нужно проверить. Не смог написать имплементацию без \"`ec == std::errc()`\"", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/883073967/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/883205112", + "html_url": "https://github.com/cpp-ru/ideas/issues/461#issuecomment-883205112", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/461", + "id": 883205112, + "node_id": "IC_kwDOFK7cns40pKP4", + "user": { + "login": "Aegel5", + "id": 10333681, + "node_id": "MDQ6VXNlcjEwMzMzNjgx", + "avatar_url": "https://avatars.githubusercontent.com/u/10333681?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Aegel5", + "html_url": "https://github.com/Aegel5", + "followers_url": "https://api.github.com/users/Aegel5/followers", + "following_url": "https://api.github.com/users/Aegel5/following{/other_user}", + "gists_url": "https://api.github.com/users/Aegel5/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Aegel5/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Aegel5/subscriptions", + "organizations_url": "https://api.github.com/users/Aegel5/orgs", + "repos_url": "https://api.github.com/users/Aegel5/repos", + "events_url": "https://api.github.com/users/Aegel5/events{/privacy}", + "received_events_url": "https://api.github.com/users/Aegel5/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-20T08:29:03Z", + "updated_at": "2021-07-20T08:30:27Z", + "author_association": "NONE", + "body": "А как насчет суффиксов для строк?\r\n`auto s = \"abc\"s;`\r\nСуффиксы - это **новая** возможность языка. При этом не мешают писать embedded, ядра операционных систем, драйвера устройств и т.д. Просто если нет определенных include, то программа не будет компилироваться.\r\nТак и тут сделать: если определена функция `std::format` - вызываем ее, если нет - ошибка.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/883205112/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/883552537", + "html_url": "https://github.com/cpp-ru/ideas/issues/467#issuecomment-883552537", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/467", + "id": 883552537, + "node_id": "IC_kwDOFK7cns40qfEZ", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-20T17:05:13Z", + "updated_at": "2021-07-20T17:20:53Z", + "author_association": "NONE", + "body": "Предполагается что там будет 0, и error_condition от std::make_error_code(ec) даст отсутствие ошибки. \r\n\r\nНо в целом стоит отметить что дизайн 'std::to_chars' откровенно кривой как для С++, написан по сути на С, используется внутри [std::to_string](https://en.cppreference.com/w/cpp/string/basic_string/to_string) и зачем то доступен всем вместо функций стандартной библиотеки С. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/883552537/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/886224830", + "html_url": "https://github.com/cpp-ru/ideas/issues/470#issuecomment-886224830", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/470", + "id": 886224830, + "node_id": "IC_kwDOFK7cns400re-", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-25T16:18:28Z", + "updated_at": "2021-07-25T16:18:28Z", + "author_association": "NONE", + "body": "До С++ 98, по моему, в Borland C++ 3.1 был тип small как раз half repression 16 битный и математическим со-процессором поддерживался. В стандарте имеем только float, double и long double, как я понимаю потому как десктопные и серверные CPU и GPU в массе своей такой тип не поддерживают. Но вот мобильные GPU как раз поддерживают такой тип.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/886224830/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/887896752", + "html_url": "https://github.com/cpp-ru/ideas/issues/461#issuecomment-887896752", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/461", + "id": 887896752, + "node_id": "IC_kwDOFK7cns407Dqw", + "user": { + "login": "unterumarmung", + "id": 39276703, + "node_id": "MDQ6VXNlcjM5Mjc2NzAz", + "avatar_url": "https://avatars.githubusercontent.com/u/39276703?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/unterumarmung", + "html_url": "https://github.com/unterumarmung", + "followers_url": "https://api.github.com/users/unterumarmung/followers", + "following_url": "https://api.github.com/users/unterumarmung/following{/other_user}", + "gists_url": "https://api.github.com/users/unterumarmung/gists{/gist_id}", + "starred_url": "https://api.github.com/users/unterumarmung/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/unterumarmung/subscriptions", + "organizations_url": "https://api.github.com/users/unterumarmung/orgs", + "repos_url": "https://api.github.com/users/unterumarmung/repos", + "events_url": "https://api.github.com/users/unterumarmung/events{/privacy}", + "received_events_url": "https://api.github.com/users/unterumarmung/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-27T23:19:57Z", + "updated_at": "2021-07-27T23:20:57Z", + "author_association": "NONE", + "body": "@alexzh2, вы не правы.\r\nВо-первых, это называется user-defined literals.\r\nВо-вторых, это user-defined literals - это механизм языка С++: https://en.cppreference.com/w/cpp/language/user_literal\r\nВ-третьих, литералы для `std::string` и других библиотечных типов являются частью стандартной библиотеки языка С++: https://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s. Они были даже добавлены в следующем стандарте после добавления user-defined literals как механизма языка.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/887896752/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/889446397", + "html_url": "https://github.com/cpp-ru/ideas/issues/470#issuecomment-889446397", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/470", + "id": 889446397, + "node_id": "IC_kwDOFK7cns41A9_9", + "user": { + "login": "ilnurkh", + "id": 22670232, + "node_id": "MDQ6VXNlcjIyNjcwMjMy", + "avatar_url": "https://avatars.githubusercontent.com/u/22670232?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/ilnurkh", + "html_url": "https://github.com/ilnurkh", + "followers_url": "https://api.github.com/users/ilnurkh/followers", + "following_url": "https://api.github.com/users/ilnurkh/following{/other_user}", + "gists_url": "https://api.github.com/users/ilnurkh/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ilnurkh/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ilnurkh/subscriptions", + "organizations_url": "https://api.github.com/users/ilnurkh/orgs", + "repos_url": "https://api.github.com/users/ilnurkh/repos", + "events_url": "https://api.github.com/users/ilnurkh/events{/privacy}", + "received_events_url": "https://api.github.com/users/ilnurkh/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-29T20:50:14Z", + "updated_at": "2021-07-29T20:50:14Z", + "author_association": "NONE", + "body": "сейчас почти всё кажется поддерживает уже\r\n cat /proc/cpuinfo | grep f16", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/889446397/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890203966", + "html_url": "https://github.com/cpp-ru/ideas/issues/461#issuecomment-890203966", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/461", + "id": 890203966, + "node_id": "IC_kwDOFK7cns41D28-", + "user": { + "login": "oficsu", + "id": 35731382, + "node_id": "MDQ6VXNlcjM1NzMxMzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/35731382?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/oficsu", + "html_url": "https://github.com/oficsu", + "followers_url": "https://api.github.com/users/oficsu/followers", + "following_url": "https://api.github.com/users/oficsu/following{/other_user}", + "gists_url": "https://api.github.com/users/oficsu/gists{/gist_id}", + "starred_url": "https://api.github.com/users/oficsu/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/oficsu/subscriptions", + "organizations_url": "https://api.github.com/users/oficsu/orgs", + "repos_url": "https://api.github.com/users/oficsu/repos", + "events_url": "https://api.github.com/users/oficsu/events{/privacy}", + "received_events_url": "https://api.github.com/users/oficsu/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-30T22:11:07Z", + "updated_at": "2021-07-30T22:12:53Z", + "author_association": "NONE", + "body": "Возьмём ваш пример:\r\n```cpp\r\nint a = 10;\r\nint b = 20;\r\nauto res = $\"Vars: a={a}, b={b}!\";\r\n```\r\nКогда я захочу поменять тип `a` с `int` на `Foo`, откуда компилятор узнает, как преобразовать экземпляр `Foo` в строку? Нам потребуется решение проблемы. И эта проблема принципиально не имеет универсального решения на текущий момент\r\n\r\nПроблема здесь даже не в классе `Foo`, который мы не умеем преобразовывать — мы можем найти с десяток некрасивых решений. Есть другая, нерешаемая проблема — в самой строке. У нас есть `std::string`, `char const*` и, например, сторонние `folly::fbstring` и `QString`. Дело в том, что часто пользователи хотят в контексте каждого типа строки иметь различный алгоритм преобразования, учитывающий кодировку, ширину символа или даже выбирать другое текстовое представление в зависимости от дальнейшего использования этой строки. Проблема в том, что строковый литерал не знает, к какой из строк будет преобразован в будущем, а значит, не сможет выбирать способ форматирования, основываясь на целевом типе строки:\r\n```cpp\r\nstd::string x = $\"Vars: a={a}, b={b}!\";\r\nfolly::fbstring y = $\"Vars: a={a}, b={b}!\";\r\nQString x = $\"Vars: a={a}, b={b}!\";\r\n```\r\n\r\nМожно придумать что-то с пользовательскими литералами, но всё это костыли на мой взгляд и будет ими оставаться, пока у нас не появятся достаточно мощные инструменты рефлексии, позволяющие создать библиотечную реализацию\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890203966/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890218980", + "html_url": "https://github.com/cpp-ru/ideas/issues/464#issuecomment-890218980", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/464", + "id": 890218980, + "node_id": "IC_kwDOFK7cns41D6nk", + "user": { + "login": "oficsu", + "id": 35731382, + "node_id": "MDQ6VXNlcjM1NzMxMzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/35731382?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/oficsu", + "html_url": "https://github.com/oficsu", + "followers_url": "https://api.github.com/users/oficsu/followers", + "following_url": "https://api.github.com/users/oficsu/following{/other_user}", + "gists_url": "https://api.github.com/users/oficsu/gists{/gist_id}", + "starred_url": "https://api.github.com/users/oficsu/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/oficsu/subscriptions", + "organizations_url": "https://api.github.com/users/oficsu/orgs", + "repos_url": "https://api.github.com/users/oficsu/repos", + "events_url": "https://api.github.com/users/oficsu/events{/privacy}", + "received_events_url": "https://api.github.com/users/oficsu/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-30T22:27:37Z", + "updated_at": "2021-07-30T22:27:37Z", + "author_association": "NONE", + "body": "Есть [более универсальное предложение](https://wg21.link/p0847), в том числе решающее и [эту задачу](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0847r7.html#recursive-lambdas). Крайне вероятно, что оно попадёт уже в ближайшие стандарты. Отличие от предложенного вами синтаксиса будет минимальным — в ключевом слове `this` перед `auto self`, что позволит переиспользовать существующее слово `this` вместо того, чтобы занимать `self` и принуждать пользователя использовать лишь его, а также в отсутствии необходимости явно передавать `self` внутрь вызова `self`:\r\n```cpp\r\nauto factorial = [](this auto self, int n) -> int\r\n{\r\n if (n < 2) return 1;\r\n else return self(s̶e̶l̶f̶, n - 1) * n ;\r\n};\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890218980/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890219665", + "html_url": "https://github.com/cpp-ru/ideas/issues/466#issuecomment-890219665", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/466", + "id": 890219665, + "node_id": "IC_kwDOFK7cns41D6yR", + "user": { + "login": "oficsu", + "id": 35731382, + "node_id": "MDQ6VXNlcjM1NzMxMzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/35731382?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/oficsu", + "html_url": "https://github.com/oficsu", + "followers_url": "https://api.github.com/users/oficsu/followers", + "following_url": "https://api.github.com/users/oficsu/following{/other_user}", + "gists_url": "https://api.github.com/users/oficsu/gists{/gist_id}", + "starred_url": "https://api.github.com/users/oficsu/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/oficsu/subscriptions", + "organizations_url": "https://api.github.com/users/oficsu/orgs", + "repos_url": "https://api.github.com/users/oficsu/repos", + "events_url": "https://api.github.com/users/oficsu/events{/privacy}", + "received_events_url": "https://api.github.com/users/oficsu/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-30T22:29:56Z", + "updated_at": "2021-08-04T07:00:36Z", + "author_association": "NONE", + "body": "Как уже много раз упоминалось, проблема в том, что дизайн `split` каждый разработчик видит немного иначе, чем другие \r\n\r\nКто-то хочет `split` по одному символу, кто-то по строке, кто-то по любому символу в строке. Кто-то хочет легковесный `split`, возвращаеющий вектор из `std::string_view`, кто-то хочет получить копии строк в векторе, кого-то даже вектор не устроит. Кому-то нужна обработка ошибок через исключения, кого-то и коды ошибок устроят, а кто-то хочет поддержку монадических операций\r\n\r\nВ таких условиях написать `split`, способный удовлетворить полностью хотя бы небольшую часть разработчиков крайне сложно, а если вы не удовлетворите запросы большинства — все продолжат писать свой собственный `split` и ничего не изменится, кроме возросшей нагрузки на разработчиков стандартных библиотек и в таком случае неразумно даже тратить время на написание самого предложения. Поэтому, если вы заинтересованы в предложении, вам придётся полностью разработать дизайн `split`, который устроит большинство, а ещё лучше — всех. Кажется, пока ещё это никому не удалось, так что вы бы могли быть первым :)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890219665/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890220333", + "html_url": "https://github.com/cpp-ru/ideas/issues/468#issuecomment-890220333", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/468", + "id": 890220333, + "node_id": "IC_kwDOFK7cns41D68t", + "user": { + "login": "oficsu", + "id": 35731382, + "node_id": "MDQ6VXNlcjM1NzMxMzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/35731382?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/oficsu", + "html_url": "https://github.com/oficsu", + "followers_url": "https://api.github.com/users/oficsu/followers", + "following_url": "https://api.github.com/users/oficsu/following{/other_user}", + "gists_url": "https://api.github.com/users/oficsu/gists{/gist_id}", + "starred_url": "https://api.github.com/users/oficsu/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/oficsu/subscriptions", + "organizations_url": "https://api.github.com/users/oficsu/orgs", + "repos_url": "https://api.github.com/users/oficsu/repos", + "events_url": "https://api.github.com/users/oficsu/events{/privacy}", + "received_events_url": "https://api.github.com/users/oficsu/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-07-30T22:32:20Z", + "updated_at": "2021-07-30T22:32:20Z", + "author_association": "NONE", + "body": "Правильно ли я понимаю, что это предложение языкового способа решения [этого вопроса](https://t.me/ProCxx/422701) от @apolukhin, чтобы получить базовую интроспекцию имён агрегатов? Идея интересная, но у меня почему-то вызывает сомнения сам синтаксис", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890220333/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890570184", + "html_url": "https://github.com/cpp-ru/ideas/issues/471#issuecomment-890570184", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/471", + "id": 890570184, + "node_id": "IC_kwDOFK7cns41FQXI", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-01T19:04:48Z", + "updated_at": "2021-08-01T19:04:48Z", + "author_association": "MEMBER", + "body": "Приблизительно с этого начинали прорабатывать текущие концепты C++20. Только вот при описании в виде класса сложно выразить такие вещи как \"функция возвращает тип, преобразоввываемый к bool\" или \"свободная функция принимает тип X\". Поэтому пришли к текущему виду концептов.\r\n\r\nДля проверки соответствия класса концепту можно использовать static_assert и/или requires. При этом нет необходимости загромождать декларацию класса, делать проверку в хедере (точнее - в каждой единице трансляции, куда этот хедер подключатеся).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890570184/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890570791", + "html_url": "https://github.com/cpp-ru/ideas/issues/470#issuecomment-890570791", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/470", + "id": 890570791, + "node_id": "IC_kwDOFK7cns41FQgn", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-01T19:08:13Z", + "updated_at": "2021-08-01T19:08:13Z", + "author_association": "MEMBER", + "body": "Работа уже идёт https://wg21.link/p1467", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890570791/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890571971", + "html_url": "https://github.com/cpp-ru/ideas/issues/463#issuecomment-890571971", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/463", + "id": 890571971, + "node_id": "IC_kwDOFK7cns41FQzD", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-01T19:16:30Z", + "updated_at": "2021-08-01T19:16:30Z", + "author_association": "MEMBER", + "body": "А чем именно не подходит использование std::exception:\r\n```cpp\r\ntry {\r\n ...\r\n} catch(const std::exception& exc) {\r\n std::cerr << \"Caught exception \" << typeid(exc).name() << \", exit.\";\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890571971/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890589857", + "html_url": "https://github.com/cpp-ru/ideas/issues/471#issuecomment-890589857", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/471", + "id": 890589857, + "node_id": "IC_kwDOFK7cns41FVKh", + "user": { + "login": "kol65536black", + "id": 6318365, + "node_id": "MDQ6VXNlcjYzMTgzNjU=", + "avatar_url": "https://avatars.githubusercontent.com/u/6318365?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kol65536black", + "html_url": "https://github.com/kol65536black", + "followers_url": "https://api.github.com/users/kol65536black/followers", + "following_url": "https://api.github.com/users/kol65536black/following{/other_user}", + "gists_url": "https://api.github.com/users/kol65536black/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kol65536black/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kol65536black/subscriptions", + "organizations_url": "https://api.github.com/users/kol65536black/orgs", + "repos_url": "https://api.github.com/users/kol65536black/repos", + "events_url": "https://api.github.com/users/kol65536black/events{/privacy}", + "received_events_url": "https://api.github.com/users/kol65536black/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-01T21:29:27Z", + "updated_at": "2021-08-01T21:29:27Z", + "author_association": "NONE", + "body": "Если я правильно понял сказанное в первом абзаце, то предложенная идея (или похожая на предложенную) уже прорабатывалась и пришли к выводу, что она не годится в качестве универсального инструмента на все случаи жизни. Есть случаи, когда идея \"не работает\".\r\n\r\nОтсюда делается вывод, что она так же не годится в роли более специализированного инструмента, дополняющего уже введенные в стандарт концепты. \r\n\r\nОх, ну ок. :(", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890589857/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890594341", + "html_url": "https://github.com/cpp-ru/ideas/issues/459#issuecomment-890594341", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/459", + "id": 890594341, + "node_id": "IC_kwDOFK7cns41FWQl", + "user": { + "login": "unterumarmung", + "id": 39276703, + "node_id": "MDQ6VXNlcjM5Mjc2NzAz", + "avatar_url": "https://avatars.githubusercontent.com/u/39276703?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/unterumarmung", + "html_url": "https://github.com/unterumarmung", + "followers_url": "https://api.github.com/users/unterumarmung/followers", + "following_url": "https://api.github.com/users/unterumarmung/following{/other_user}", + "gists_url": "https://api.github.com/users/unterumarmung/gists{/gist_id}", + "starred_url": "https://api.github.com/users/unterumarmung/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/unterumarmung/subscriptions", + "organizations_url": "https://api.github.com/users/unterumarmung/orgs", + "repos_url": "https://api.github.com/users/unterumarmung/repos", + "events_url": "https://api.github.com/users/unterumarmung/events{/privacy}", + "received_events_url": "https://api.github.com/users/unterumarmung/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-01T22:08:38Z", + "updated_at": "2021-08-01T22:08:54Z", + "author_association": "NONE", + "body": "> Это хорошо но всё же хотелось иметь это в компиляторе, а не таскать внешние библиотеки.\r\n> Надо будет проверить на присваивание к \"забиденным\" полям.\r\n\r\nВаше решение плохо тем, что это языковое изменение, а не библиотечное.\r\nБудем надеяться, что ranges к С++23 доделают и zip туда добавят\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890594341/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890595500", + "html_url": "https://github.com/cpp-ru/ideas/issues/457#issuecomment-890595500", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457", + "id": 890595500, + "node_id": "IC_kwDOFK7cns41FWis", + "user": { + "login": "DymOK93", + "id": 66731516, + "node_id": "MDQ6VXNlcjY2NzMxNTE2", + "avatar_url": "https://avatars.githubusercontent.com/u/66731516?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DymOK93", + "html_url": "https://github.com/DymOK93", + "followers_url": "https://api.github.com/users/DymOK93/followers", + "following_url": "https://api.github.com/users/DymOK93/following{/other_user}", + "gists_url": "https://api.github.com/users/DymOK93/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DymOK93/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DymOK93/subscriptions", + "organizations_url": "https://api.github.com/users/DymOK93/orgs", + "repos_url": "https://api.github.com/users/DymOK93/repos", + "events_url": "https://api.github.com/users/DymOK93/events{/privacy}", + "received_events_url": "https://api.github.com/users/DymOK93/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-01T22:16:04Z", + "updated_at": "2021-08-02T00:16:37Z", + "author_association": "NONE", + "body": "Любопытная идея. \r\nПока хотелось бы обсудить следующие проблемы:\r\n* Q: Как передавать приоритет в объект потока?\r\nA: Первое, что приходит на ум - в конструкторе, т.к. тащить шаблонным параметром, очевидно, нет смысла. Но вдруг пользователь захочет установить приоритет __во время выполнения__?\r\n* Q: Как сообщить, что установить приоритет не удалось?\r\nA: В случае отдельного метода можно выбросить исключение, но такое недопустимо в конструкторе: окажемся в ситуации, когда объект не создан, но реальный поток __уже__ начал выполняться!\r\n\r\nНасчёт `std::async` тоже нужно подумать: хоть она и непопулярна, запуск задачи с background-приоритетом - например, скачивания файла - может быть удобным.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890595500/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890729177", + "html_url": "https://github.com/cpp-ru/ideas/issues/457#issuecomment-890729177", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457", + "id": 890729177, + "node_id": "IC_kwDOFK7cns41F3LZ", + "user": { + "login": "maksimus1210", + "id": 15178782, + "node_id": "MDQ6VXNlcjE1MTc4Nzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/15178782?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/maksimus1210", + "html_url": "https://github.com/maksimus1210", + "followers_url": "https://api.github.com/users/maksimus1210/followers", + "following_url": "https://api.github.com/users/maksimus1210/following{/other_user}", + "gists_url": "https://api.github.com/users/maksimus1210/gists{/gist_id}", + "starred_url": "https://api.github.com/users/maksimus1210/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/maksimus1210/subscriptions", + "organizations_url": "https://api.github.com/users/maksimus1210/orgs", + "repos_url": "https://api.github.com/users/maksimus1210/repos", + "events_url": "https://api.github.com/users/maksimus1210/events{/privacy}", + "received_events_url": "https://api.github.com/users/maksimus1210/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-02T05:32:11Z", + "updated_at": "2021-08-02T05:32:11Z", + "author_association": "NONE", + "body": "Я не сталкивался с задачей изменения приоритета потока во время его выполнения, обычно заранее известен приоритет задачи. На мой взгляд логично передавать приоритет потока при передаче функтора. Тогда всё выглядело бы просто и понятно.\r\n\r\n`std::thread thread([](){ ... }, std::thread::priority::high_priority);\r\n`\r\n\r\nи для std::async\r\n\r\n`\r\nauto ret = std::async(std::launch::async, std::thread::priority::high_priority, [](){ ... });\r\n`\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890729177/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890815768", + "html_url": "https://github.com/cpp-ru/ideas/issues/457#issuecomment-890815768", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457", + "id": 890815768, + "node_id": "IC_kwDOFK7cns41GMUY", + "user": { + "login": "DymOK93", + "id": 66731516, + "node_id": "MDQ6VXNlcjY2NzMxNTE2", + "avatar_url": "https://avatars.githubusercontent.com/u/66731516?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DymOK93", + "html_url": "https://github.com/DymOK93", + "followers_url": "https://api.github.com/users/DymOK93/followers", + "following_url": "https://api.github.com/users/DymOK93/following{/other_user}", + "gists_url": "https://api.github.com/users/DymOK93/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DymOK93/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DymOK93/subscriptions", + "organizations_url": "https://api.github.com/users/DymOK93/orgs", + "repos_url": "https://api.github.com/users/DymOK93/repos", + "events_url": "https://api.github.com/users/DymOK93/events{/privacy}", + "received_events_url": "https://api.github.com/users/DymOK93/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-02T08:08:05Z", + "updated_at": "2021-08-02T08:16:29Z", + "author_association": "NONE", + "body": "Тогда возвращаемся к вопросу сигнализации о неудаче :)\r\nИзменять приоритет потока в ходе работы тоже иногда приходится: например, поток закончил ожидать IO, передает задачу в соседний worker-thread (предположим, что задача небольшая, и пул не требуется), попутно повышая его приоритет", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890815768/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890847243", + "html_url": "https://github.com/cpp-ru/ideas/issues/457#issuecomment-890847243", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457", + "id": 890847243, + "node_id": "IC_kwDOFK7cns41GUAL", + "user": { + "login": "maksimus1210", + "id": 15178782, + "node_id": "MDQ6VXNlcjE1MTc4Nzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/15178782?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/maksimus1210", + "html_url": "https://github.com/maksimus1210", + "followers_url": "https://api.github.com/users/maksimus1210/followers", + "following_url": "https://api.github.com/users/maksimus1210/following{/other_user}", + "gists_url": "https://api.github.com/users/maksimus1210/gists{/gist_id}", + "starred_url": "https://api.github.com/users/maksimus1210/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/maksimus1210/subscriptions", + "organizations_url": "https://api.github.com/users/maksimus1210/orgs", + "repos_url": "https://api.github.com/users/maksimus1210/repos", + "events_url": "https://api.github.com/users/maksimus1210/events{/privacy}", + "received_events_url": "https://api.github.com/users/maksimus1210/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-02T08:48:21Z", + "updated_at": "2021-08-02T08:48:21Z", + "author_association": "NONE", + "body": "Одно из решений, добавить метод, который будет возвращать текущий приоритет:\r\n\r\n```\r\nstd::thread thread([](){ ... }, std::thread::priority::high_priority);\r\n\r\nif (thread.priority() != std::thread::priority::high_priority) {\r\n ...\r\n}\r\n```\r\nНе думаю, что неудача установки приоритета это критическая ошибка, что бы кидать исключения или не запускать поток на выполнение, в Linux такое часто происходит, если у программы нет прав root. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890847243/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890870445", + "html_url": "https://github.com/cpp-ru/ideas/issues/457#issuecomment-890870445", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457", + "id": 890870445, + "node_id": "IC_kwDOFK7cns41GZqt", + "user": { + "login": "DymOK93", + "id": 66731516, + "node_id": "MDQ6VXNlcjY2NzMxNTE2", + "avatar_url": "https://avatars.githubusercontent.com/u/66731516?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DymOK93", + "html_url": "https://github.com/DymOK93", + "followers_url": "https://api.github.com/users/DymOK93/followers", + "following_url": "https://api.github.com/users/DymOK93/following{/other_user}", + "gists_url": "https://api.github.com/users/DymOK93/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DymOK93/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DymOK93/subscriptions", + "organizations_url": "https://api.github.com/users/DymOK93/orgs", + "repos_url": "https://api.github.com/users/DymOK93/repos", + "events_url": "https://api.github.com/users/DymOK93/events{/privacy}", + "received_events_url": "https://api.github.com/users/DymOK93/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-02T09:20:50Z", + "updated_at": "2021-08-02T09:21:55Z", + "author_association": "NONE", + "body": "Как вариант. Заодно можно сразу реализовать метод `bool set_priority(std::thread::priority)`\r\n\r\nА на всех ли платформах можно установить потоку приоритет?\r\nЕсть опасения насчет гибкости итогового решения...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890870445/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890872252", + "html_url": "https://github.com/cpp-ru/ideas/issues/457#issuecomment-890872252", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457", + "id": 890872252, + "node_id": "IC_kwDOFK7cns41GaG8", + "user": { + "login": "maksimus1210", + "id": 15178782, + "node_id": "MDQ6VXNlcjE1MTc4Nzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/15178782?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/maksimus1210", + "html_url": "https://github.com/maksimus1210", + "followers_url": "https://api.github.com/users/maksimus1210/followers", + "following_url": "https://api.github.com/users/maksimus1210/following{/other_user}", + "gists_url": "https://api.github.com/users/maksimus1210/gists{/gist_id}", + "starred_url": "https://api.github.com/users/maksimus1210/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/maksimus1210/subscriptions", + "organizations_url": "https://api.github.com/users/maksimus1210/orgs", + "repos_url": "https://api.github.com/users/maksimus1210/repos", + "events_url": "https://api.github.com/users/maksimus1210/events{/privacy}", + "received_events_url": "https://api.github.com/users/maksimus1210/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-02T09:23:35Z", + "updated_at": "2021-08-02T09:23:35Z", + "author_association": "NONE", + "body": "Установка приоритета есть на всех ОС, но не на всех можно поднимать до высокого без привилегий. В Qt возможность есть устанавливать приоритет. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890872252/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890876119", + "html_url": "https://github.com/cpp-ru/ideas/issues/457#issuecomment-890876119", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457", + "id": 890876119, + "node_id": "IC_kwDOFK7cns41GbDX", + "user": { + "login": "DymOK93", + "id": 66731516, + "node_id": "MDQ6VXNlcjY2NzMxNTE2", + "avatar_url": "https://avatars.githubusercontent.com/u/66731516?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DymOK93", + "html_url": "https://github.com/DymOK93", + "followers_url": "https://api.github.com/users/DymOK93/followers", + "following_url": "https://api.github.com/users/DymOK93/following{/other_user}", + "gists_url": "https://api.github.com/users/DymOK93/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DymOK93/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DymOK93/subscriptions", + "organizations_url": "https://api.github.com/users/DymOK93/orgs", + "repos_url": "https://api.github.com/users/DymOK93/repos", + "events_url": "https://api.github.com/users/DymOK93/events{/privacy}", + "received_events_url": "https://api.github.com/users/DymOK93/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-02T09:29:23Z", + "updated_at": "2021-08-02T09:31:14Z", + "author_association": "NONE", + "body": "Пока я вижу \"полторы\" проблемы:\r\n1. Вопрос привилегий. Но - по крайней мере на Windows - нужные права можно получить при создании потока средствами WinAPI. \r\n2. Нюансы с установкой приоритетов для потоков в ядре (да, речь о имплементации `thread` в несколько нестандартном окружении). Но это уже лично мои тараканы - практика показывает, что Комитет по стандартизации и С++ ядерщики в разных плоскостях находятся :) ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/890876119/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/891081685", + "html_url": "https://github.com/cpp-ru/ideas/issues/468#issuecomment-891081685", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/468", + "id": 891081685, + "node_id": "IC_kwDOFK7cns41HNPV", + "user": { + "login": "denzor200", + "id": 16864786, + "node_id": "MDQ6VXNlcjE2ODY0Nzg2", + "avatar_url": "https://avatars.githubusercontent.com/u/16864786?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/denzor200", + "html_url": "https://github.com/denzor200", + "followers_url": "https://api.github.com/users/denzor200/followers", + "following_url": "https://api.github.com/users/denzor200/following{/other_user}", + "gists_url": "https://api.github.com/users/denzor200/gists{/gist_id}", + "starred_url": "https://api.github.com/users/denzor200/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/denzor200/subscriptions", + "organizations_url": "https://api.github.com/users/denzor200/orgs", + "repos_url": "https://api.github.com/users/denzor200/repos", + "events_url": "https://api.github.com/users/denzor200/events{/privacy}", + "received_events_url": "https://api.github.com/users/denzor200/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-02T14:39:09Z", + "updated_at": "2021-08-02T14:39:24Z", + "author_association": "NONE", + "body": "> Правильно ли я понимаю, что это предложение языкового способа решения [этого вопроса](https://t.me/ProCxx/422701) от @apolukhin, чтобы получить базовую интроспекцию имён агрегатов?\r\n\r\nДа, все верно\r\n\r\n> Идея интересная, но у меня почему-то вызывает сомнения сам синтаксис\r\n\r\nСинтаксис стремный, но по изначальной задумке эта конструкция должна оставаться внутри библиотеки и не мозолить глаза разработчикам приложений.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/891081685/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/891099467", + "html_url": "https://github.com/cpp-ru/ideas/issues/468#issuecomment-891099467", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/468", + "id": 891099467, + "node_id": "IC_kwDOFK7cns41HRlL", + "user": { + "login": "denzor200", + "id": 16864786, + "node_id": "MDQ6VXNlcjE2ODY0Nzg2", + "avatar_url": "https://avatars.githubusercontent.com/u/16864786?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/denzor200", + "html_url": "https://github.com/denzor200", + "followers_url": "https://api.github.com/users/denzor200/followers", + "following_url": "https://api.github.com/users/denzor200/following{/other_user}", + "gists_url": "https://api.github.com/users/denzor200/gists{/gist_id}", + "starred_url": "https://api.github.com/users/denzor200/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/denzor200/subscriptions", + "organizations_url": "https://api.github.com/users/denzor200/orgs", + "repos_url": "https://api.github.com/users/denzor200/repos", + "events_url": "https://api.github.com/users/denzor200/events{/privacy}", + "received_events_url": "https://api.github.com/users/denzor200/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-02T15:03:28Z", + "updated_at": "2021-08-02T15:03:37Z", + "author_association": "NONE", + "body": "> Идея интересная, но у меня почему-то вызывает сомнения сам синтаксис\r\n\r\nХотя я забыл спросить, что у вас конкретно вызывает сомнения в этом синтаксисе. Вы считаете что это не вписывается в концепцию языка, или где либо пересекается с уже существующим синтаксисом?\r\nНа мой взгляд, каких либо пересечений здесь нет. Еще я хотел бы показать рабочую реализацию в своем форке llvm, это когда у меня руки дойдут до этого..", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/891099467/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/894790926", + "html_url": "https://github.com/cpp-ru/ideas/issues/463#issuecomment-894790926", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/463", + "id": 894790926, + "node_id": "IC_kwDOFK7cns41VW0O", + "user": { + "login": "gleb-kov", + "id": 41119563, + "node_id": "MDQ6VXNlcjQxMTE5NTYz", + "avatar_url": "https://avatars.githubusercontent.com/u/41119563?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gleb-kov", + "html_url": "https://github.com/gleb-kov", + "followers_url": "https://api.github.com/users/gleb-kov/followers", + "following_url": "https://api.github.com/users/gleb-kov/following{/other_user}", + "gists_url": "https://api.github.com/users/gleb-kov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gleb-kov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gleb-kov/subscriptions", + "organizations_url": "https://api.github.com/users/gleb-kov/orgs", + "repos_url": "https://api.github.com/users/gleb-kov/repos", + "events_url": "https://api.github.com/users/gleb-kov/events{/privacy}", + "received_events_url": "https://api.github.com/users/gleb-kov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-08T12:33:04Z", + "updated_at": "2021-08-08T12:36:23Z", + "author_association": "NONE", + "body": "Да, это простой случай и здесь всё понятно. Есть кодовая база, где доступен только std::exception_ptr, чтобы заработало с ним, нужно пользоваться лапшой из try-catch-rethrow-try-catch. Например, здесь https://github.com/ClickHouse/ClickHouse/blob/0b67f593e059311966122c5529b3f6434feea946/src/Common/Exception.cpp -- показательный пример с tryLogException, эта конструкция с rethrow очень частая в репозиториях со своим util и тд. Кажется, проще бы было делать свитч по типу известному из std::exception_ptr. Возможно, есть ограничение из std, которые помешают такой реализации.\r\n\r\nЕщё есть случай, когда брошено нечто ненаследуемое от std::exception. Это не идеологично конечно, но такого кода тоже много.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/894790926/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/898679940", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-898679940", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 898679940, + "node_id": "IC_kwDOFK7cns41kMSE", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-13T19:37:38Z", + "updated_at": "2021-08-13T20:18:33Z", + "author_association": "NONE", + "body": "Во-первых, это попросту использование обобщенного синтаксиса:\r\n```cpp\r\nconst auto [var = GetAwesomeValue()] { /* ... */ }\r\n```\r\n\r\nВо-вторых, в таком случае теряется некоторая смысловая нагрузка: при захвате по lvalue-ссылке в лямбду кладется ссылка на имеющийся объект/переменную. При этом исходный объект остается без изменений. Синтаксис в некотором смысле эту связь поддерживает.\r\n\r\nЕсли же производится захват с перемещением, то текущий синтаксис вполне отражает ту идею, что в лямбду кладется перемещенный объект, а исходный объект \"очищается\". Этим самым явно разрывается связь между захваченным объектом и исходным.\r\n\r\nПредлагаемый же синтаксис не вполне явно разрывает эту связь. Вот при чтении (особенно незнакомого) кода по типу:\r\n```cpp\r\nstd::unique_ptr object = ...;\r\n\r\nstd::thread t([&&object] { /* ... */ });\r\n\r\n// ...\r\n\r\nt.join();\r\n```\r\n\r\nвозникает такое ощущение, что указатель до сих пор указывает на нечто валидное. На деле это не так. А вот в коде ниже прямо-таки явно прописано, что наш юник-поинтер мы мувнули и он будет уже чистеньким:\r\n```cpp\r\nstd::unique_ptr object = ...;\r\n\r\nstd::thread t([object = std::move(object)] { /* ... */ });\r\n\r\n// ...\r\n\r\nt.join();\r\n```\r\n\r\nВ-третьих, предлагаемый подход не совсем подходит той семантике перемещения, которая в С++ существует. Перемещение в С++ явное - через вызов `std::move`, а этот кейс - вопиющее исключение. В целом это пересекается частично со сказанным выше.\r\n\r\nВ-четвертых, надо будет дорабатывать еще и статические анализаторы, чтобы они видели такие вот неявные мувы.\r\n\r\nВ-пятых, получается, что можно будет одно и то же сделать по-разному. Зачем еще одно такое место?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/898679940/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899198234", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-899198234", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 899198234, + "node_id": "IC_kwDOFK7cns41mK0a", + "user": { + "login": "Gargony", + "id": 9786086, + "node_id": "MDQ6VXNlcjk3ODYwODY=", + "avatar_url": "https://avatars.githubusercontent.com/u/9786086?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Gargony", + "html_url": "https://github.com/Gargony", + "followers_url": "https://api.github.com/users/Gargony/followers", + "following_url": "https://api.github.com/users/Gargony/following{/other_user}", + "gists_url": "https://api.github.com/users/Gargony/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Gargony/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Gargony/subscriptions", + "organizations_url": "https://api.github.com/users/Gargony/orgs", + "repos_url": "https://api.github.com/users/Gargony/repos", + "events_url": "https://api.github.com/users/Gargony/events{/privacy}", + "received_events_url": "https://api.github.com/users/Gargony/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-16T04:08:04Z", + "updated_at": "2021-08-16T04:08:04Z", + "author_association": "NONE", + "body": "> Предлагаемый же синтаксис не вполне явно разрывает эту связь. Вот при чтении (особенно незнакомого) кода по типу:\r\n> \r\n> ```c++\r\n> std::unique_ptr object = ...;\r\n> \r\n> std::thread t([&&object] { /* ... */ });\r\n> \r\n> // ...\r\n> \r\n> t.join();\r\n> ```\r\n> \r\n> возникает такое ощущение, что указатель до сих пор указывает на нечто валидное.\r\n\r\nКак может возникать такое ощущение если вы явно видите ```&&``` вместо std::move()?\r\n\r\n```[](auto &&) { /* ... */ }``` вы тут явно видите std::move? А он может быть, а может не быть.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899198234/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899285754", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-899285754", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 899285754, + "node_id": "IC_kwDOFK7cns41mgL6", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-16T07:25:07Z", + "updated_at": "2021-08-16T07:25:36Z", + "author_association": "NONE", + "body": "> вы тут явно видите std::move?\r\n\r\n```cpp\r\nstd::vector obj1 = ..., obj2 = ...;\r\n\r\nconst auto foo = [](auto &&) { /* ... */ };\r\n\r\nfoo(std::move(obj1)); // Вот тут прекрасно вижу, перемещение есть\r\nfoo(obj2); // А тут - не вижу. Но и никакого перемещения тут нет\r\n```\r\n\r\nРечь не о том, что внутри лямбды происходит (там в общем-то это значения не имеет). Речь о том, что перемещение всегда видно в окружении этой лямбды. В примере выше `obj1` после вызова лямбды больше не содержит значений, а `obj2` - содержит, и это все явно видно.\r\n\r\nВот эту же самую семантику хочется сохранить и для захвата: если я вижу в списке захвата мув, то значит объект перемещен в лямбду, а если не вижу, то не перемещен.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899285754/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899386953", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-899386953", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 899386953, + "node_id": "IC_kwDOFK7cns41m45J", + "user": { + "login": "Gargony", + "id": 9786086, + "node_id": "MDQ6VXNlcjk3ODYwODY=", + "avatar_url": "https://avatars.githubusercontent.com/u/9786086?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Gargony", + "html_url": "https://github.com/Gargony", + "followers_url": "https://api.github.com/users/Gargony/followers", + "following_url": "https://api.github.com/users/Gargony/following{/other_user}", + "gists_url": "https://api.github.com/users/Gargony/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Gargony/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Gargony/subscriptions", + "organizations_url": "https://api.github.com/users/Gargony/orgs", + "repos_url": "https://api.github.com/users/Gargony/repos", + "events_url": "https://api.github.com/users/Gargony/events{/privacy}", + "received_events_url": "https://api.github.com/users/Gargony/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-16T10:06:03Z", + "updated_at": "2021-08-16T10:06:03Z", + "author_association": "NONE", + "body": "> ```c++\r\n> foo(std::move(obj1)); // Вот тут прекрасно вижу, перемещение есть\r\n> foo(obj2); // А тут - не вижу. Но и никакого перемещения тут нет\r\n> ```\r\n\r\nтак речь идёт об упрощении данного синтаксиса, что бы не писать длинный std:move...\r\n```\r\nfoo(&&obj1); \r\nfoo(obj2);\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899386953/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899412441", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-899412441", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 899412441, + "node_id": "IC_kwDOFK7cns41m_HZ", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-16T10:48:02Z", + "updated_at": "2021-08-16T10:48:02Z", + "author_association": "NONE", + "body": "> так речь идёт об упрощении данного синтаксиса, что бы не писать длинный std:move...\r\n\r\nНу а я привожу аргументы против такого \"упрощения\". Кроме того, это не упрощение синтаксиса, а введение нового (и это большая разница).\r\n\r\nБолее того, как раз вот так `foo(&&obj)` никто писать не предлагает (!!!)\r\n\r\nРечь идёт об отдельном кейсе - списке захвата лямбды. То есть этот кейс теперь будет выделяться и причем не в лучшую сторону. В дополнение, нововведение усложнит и синтаксический анализ языка за счёт того, что вводится ещё один контекст для конструкции `&&`.\r\n\r\nК тому же, разве `std::move` такой уж длинный? Не настолько, как мне кажется, чтобы вводить *отдельный синтаксис*. Да и не понимаю этого странного стремления укорачивать код за счет его читаемости или удобства поддержки. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899412441/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899444394", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-899444394", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 899444394, + "node_id": "IC_kwDOFK7cns41nG6q", + "user": { + "login": "Gargony", + "id": 9786086, + "node_id": "MDQ6VXNlcjk3ODYwODY=", + "avatar_url": "https://avatars.githubusercontent.com/u/9786086?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Gargony", + "html_url": "https://github.com/Gargony", + "followers_url": "https://api.github.com/users/Gargony/followers", + "following_url": "https://api.github.com/users/Gargony/following{/other_user}", + "gists_url": "https://api.github.com/users/Gargony/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Gargony/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Gargony/subscriptions", + "organizations_url": "https://api.github.com/users/Gargony/orgs", + "repos_url": "https://api.github.com/users/Gargony/repos", + "events_url": "https://api.github.com/users/Gargony/events{/privacy}", + "received_events_url": "https://api.github.com/users/Gargony/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-16T11:44:49Z", + "updated_at": "2021-08-16T11:44:49Z", + "author_association": "NONE", + "body": "> Ну а я привожу аргументы против такого \"упрощения\". Кроме того, это не упрощение синтаксиса, а введение нового (и это большая разница).\r\n\r\nА где граница между упрощение синтаксиса и введение нового?\r\n\r\n\r\n> Более того, как раз вот так `foo(&&obj)` никто писать не предлагает (!!!)\r\n\r\nЭто я предложил чтобы было более наглядно что имеется ввиду.\r\n\r\n\r\n> Речь идёт об отдельном кейсе - списке захвата лямбды. То есть этот кейс теперь будет выделяться и причем не в лучшую сторону.\r\n\r\nЭто субективно.\r\n\r\n\r\n> В дополнение, нововведение усложнит и синтаксический анализ языка за счёт того, что вводится ещё один контекст для конструкции `&&`.\r\n\r\nВы случайно не с компании которая разрабатывает анализатор? ;)\r\n\r\n\r\n> К тому же, разве `std::move` такой уж длинный?\r\n\r\nПо мне так очень длинный.\r\n\r\n\r\n> Да и не понимаю этого странного стремления укорачивать код за счет его читаемости или удобства поддержки.\r\n\r\n1+2-3*4/6\r\n1 плюс 2 минус 3 умножить 4 делить 6\r\nЧто удобнее?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899444394/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899569676", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-899569676", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 899569676, + "node_id": "IC_kwDOFK7cns41nlgM", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-16T14:45:06Z", + "updated_at": "2021-08-16T15:39:41Z", + "author_association": "NONE", + "body": "> А где граница между упрощение синтаксиса и введение нового?\r\n\r\nВот CTAD, например, это упрощение:\r\n```cpp\r\nstd::vector v1 = { 1, 2, 3, 4 };\r\nstd::vector v2 = { 1, 2, 3, 4 };\r\n```\r\n\r\nАбстрактный синтаксис не поменялся, это все еще одно и то же: `T object = { arg1, arg2, ... };`\r\n\r\nРассматриваемый же кейс - введение того, чего в принципе ранее не было, введение новых продукций в грамматику.\r\n\r\n> 1+2-3*4/6\r\n1 плюс 2 минус 3 умножить 4 делить 6\r\nЧто удобнее?\r\n\r\nТут операторы очевидны. А вот `[&&obj] { ... }` - нет. Язык не следует превращать в набор тонны разных операторов и конструкций из символов, которые не имеют очевидного толкования. Вот как раз наличие таких причуд только усложняет язык (за примером можно сбегать и поглядеть на Scala или Haskell, которые грешны разного рода символическими конструкциями). Так что сравнение несколько некорректно.\r\n\r\n> Это субективно.\r\n\r\nМожет быть, конечно, и субъективно, но тем не менее у меня созрел такой вот еще пример на тему того, чем плохо такое выделение кейса со списком захвата:\r\n\r\n```cpp\r\nstd::string &&s = \"Hello\"; // Специально приклею && к s\r\n```\r\n\r\nИ вот почти похожий кейс:\r\n```cpp\r\nstd::string s = \"Hello\";\r\nconst auto foo = [&&s] { ... }\r\n```\r\n\r\nВ первой то ситуации никакого перемещения нет, создали rvalue-ссылку просто на временную строку, лайфтайм которой продлен. \r\n\r\nИ второй кейс уж очень сильно похож на первый случай, но тут мы перемещаем уже строчку внутрь лямбды, а не создаем rvalue-ссылку. А синтаксис то прямо как у т.н. [declarator](https://en.cppreference.com/w/cpp/language/declarations#Declarators): `declarator ::= && [attr] declarator`\r\n\r\nЛадно, пусть, допустим, ввели такой новый синтаксис, но почему только для списка захвата лямбд? Как тогда перемещать значения в других случаях?\r\n\r\n```cpp\r\nT&& obj = another_obj; // Сейчас не работает (cannot bind to lvalue)\r\n // Да и смысл тогда этой записи изменится\r\nT obj = &&another_obj; // Выглядит так себе, так как неочевидный синтаксис для перемещения\r\n // std::move как раз повышает читаемость и поддерживаемость такого кода \r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899569676/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899834635", + "html_url": "https://github.com/cpp-ru/ideas/issues/452#issuecomment-899834635", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/452", + "id": 899834635, + "node_id": "IC_kwDOFK7cns41omML", + "user": { + "login": "unterumarmung", + "id": 39276703, + "node_id": "MDQ6VXNlcjM5Mjc2NzAz", + "avatar_url": "https://avatars.githubusercontent.com/u/39276703?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/unterumarmung", + "html_url": "https://github.com/unterumarmung", + "followers_url": "https://api.github.com/users/unterumarmung/followers", + "following_url": "https://api.github.com/users/unterumarmung/following{/other_user}", + "gists_url": "https://api.github.com/users/unterumarmung/gists{/gist_id}", + "starred_url": "https://api.github.com/users/unterumarmung/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/unterumarmung/subscriptions", + "organizations_url": "https://api.github.com/users/unterumarmung/orgs", + "repos_url": "https://api.github.com/users/unterumarmung/repos", + "events_url": "https://api.github.com/users/unterumarmung/events{/privacy}", + "received_events_url": "https://api.github.com/users/unterumarmung/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-16T21:37:30Z", + "updated_at": "2021-08-16T21:37:30Z", + "author_association": "NONE", + "body": "Я бы оставил пользователю возможность передавать свой предикат для этих функций \n\nИли хотя бы массив символов (но для этого придется делать эту мембер функцию шаблонной, что приведет к `str.template trim(chars...)`), как в других языках:\nC#: https://docs.microsoft.com/en-us/dotnet/api/system.string.trim?view=net-5.0#overloads\nPython: https://docs.python.org/3.4/library/stdtypes.html?highlight=strip#str.lstrip\n\nВозможно, стоит сделать по аналогии с `erase` и `erase_if`, что-то типа:\n\n```cpp\ntemplate Predicate>\ntypename std::basic_string::size_type trim_if(std::basic_string& str, Predicate&& predicate);\n\ntemplate \n requires std::convertible_to && ...\ntypename std::basic_string::size_type trim(std::basic_string& str, Chars&&... chars);\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899834635/reactions", + "total_count": 1, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 1, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899968253", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-899968253", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 899968253, + "node_id": "IC_kwDOFK7cns41pGz9", + "user": { + "login": "Gargony", + "id": 9786086, + "node_id": "MDQ6VXNlcjk3ODYwODY=", + "avatar_url": "https://avatars.githubusercontent.com/u/9786086?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Gargony", + "html_url": "https://github.com/Gargony", + "followers_url": "https://api.github.com/users/Gargony/followers", + "following_url": "https://api.github.com/users/Gargony/following{/other_user}", + "gists_url": "https://api.github.com/users/Gargony/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Gargony/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Gargony/subscriptions", + "organizations_url": "https://api.github.com/users/Gargony/orgs", + "repos_url": "https://api.github.com/users/Gargony/repos", + "events_url": "https://api.github.com/users/Gargony/events{/privacy}", + "received_events_url": "https://api.github.com/users/Gargony/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-17T03:37:02Z", + "updated_at": "2021-08-17T03:42:12Z", + "author_association": "NONE", + "body": "> Абстрактный синтаксис не поменялся, это все еще одно и то же: `T object = { arg1, arg2, ... };`\r\n\r\nНо где-то в коде есть ещё и сам CTAD для vector?\r\n \r\n> Язык не следует превращать в набор тонны разных операторов и конструкций из символов, которые не имеют очевидного толкования. \r\n\r\nКак вы считает почему C вместо begin и end имеет {} и так популярен? Как вам Rust?\r\n\r\n> Может быть, конечно, и субъективно, но тем не менее у меня созрел такой вот еще пример на тему того, чем плохо такое выделение кейса со списком захвата:\r\n> \r\n> ```c++\r\n> std::string &&s = \"Hello\"; // Специально приклею && к s\r\n> ```\r\n> \r\n> И вот почти похожий кейс:\r\n> \r\n> ```c++\r\n> std::string s = \"Hello\";\r\n> const auto foo = [&&s] { ... }\r\n> ```\r\n> \r\n> В первой то ситуации никакого перемещения нет, создали rvalue-ссылку просто на временную строку, лайфтайм которой продлен.\r\n> \r\n> И второй кейс уж очень сильно похож на первый случай, но тут мы перемещаем уже строчку внутрь лямбды, а не создаем rvalue-ссылку. А синтаксис то прямо как у т.н. [declarator](https://en.cppreference.com/w/cpp/language/declarations#Declarators): `declarator ::= && [attr] declarator`\r\n\r\nНе совсем понял что вы пытались объяснить, но эти два случая совсем не похоже. Если первый прировнять ко второму, то он выглядел бы:\r\n ```c++\r\nstd::string s = \"Hello\";\r\nstd::string&&s1 = s;\r\n```\r\n\r\nчто бы работало сейчас:\r\n ```c++\r\nstd::string s = \"Hello\";\r\nstd::string&&s1 = std::move(s);\r\n```\r\n\r\nи новый \"сахар\":\r\n ```c++\r\nstd::string s = \"Hello\";\r\nstd::string&&s1 = &&s;\r\n```\r\n\r\n\r\n> Ладно, пусть, допустим, ввели такой новый синтаксис, но почему только для списка захвата лямбд? Как тогда перемещать значения в других случаях?\r\n\r\nДа нет же, не только для лямбд, а для всего. Но в лямбдах это очень часто необходимо. Да и лямбда с N захватом через std::move выглядеть очень страшно.\r\n+ для шаблонов это будет std::forward", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/899968253/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/900210730", + "html_url": "https://github.com/cpp-ru/ideas/issues/452#issuecomment-900210730", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/452", + "id": 900210730, + "node_id": "IC_kwDOFK7cns41qCAq", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-17T11:19:28Z", + "updated_at": "2021-08-17T11:19:28Z", + "author_association": "NONE", + "body": "Немного неясны несколько моментов:\r\n- Почему `trim[_if]` должны возвращать `size_type`? Логичнее возвращать ссылку на себя, как в моем оригинальном предложении.\r\n- Зачем передавать вариадик-пак чаров? Есть уже замечательные функции\r\n```cpp\r\nconstexpr size_type find_first_of( const CharT* s, size_type pos = 0 ) const;\r\nconstexpr size_type find_first_not_of( const CharT* s, size_type pos = 0 ) const;\r\n...\r\n```\r\nСуть параметра `s` ровно такая же. Да и как-то уж больно странно будет вот так использовать функцию:\r\n```cpp\r\nstr.trim(' ', '\\t', '\\n');\r\n```\r\n\r\nВ итоге то никаких темплейтных мемберов и не получается (что хорошо):\r\n```cpp\r\nconstexpr basic_string& trim();\r\nconstexpr basic_string& trim(const char_type* s);\r\n\r\n// trim_left и trim_right аналогично\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/900210730/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/900270696", + "html_url": "https://github.com/cpp-ru/ideas/issues/452#issuecomment-900270696", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/452", + "id": 900270696, + "node_id": "IC_kwDOFK7cns41qQpo", + "user": { + "login": "unterumarmung", + "id": 39276703, + "node_id": "MDQ6VXNlcjM5Mjc2NzAz", + "avatar_url": "https://avatars.githubusercontent.com/u/39276703?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/unterumarmung", + "html_url": "https://github.com/unterumarmung", + "followers_url": "https://api.github.com/users/unterumarmung/followers", + "following_url": "https://api.github.com/users/unterumarmung/following{/other_user}", + "gists_url": "https://api.github.com/users/unterumarmung/gists{/gist_id}", + "starred_url": "https://api.github.com/users/unterumarmung/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/unterumarmung/subscriptions", + "organizations_url": "https://api.github.com/users/unterumarmung/orgs", + "repos_url": "https://api.github.com/users/unterumarmung/repos", + "events_url": "https://api.github.com/users/unterumarmung/events{/privacy}", + "received_events_url": "https://api.github.com/users/unterumarmung/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-17T12:51:43Z", + "updated_at": "2021-08-17T12:51:43Z", + "author_association": "NONE", + "body": " > ### Почему trim[_if] должны возвращать size_type? Логичнее возвращать ссылку на себя, как в моем оригинальном предложении.\r\nДелал по аналогии с `erase[_if]`: функция возвращает количество удаленных элементов\r\n\r\n> ### `constexpr basic_string& trim(const char_type* s);`\r\nТогда уж лучше принимать `std::basic_string_view`: чтобы перенести бремя UB с отсутствием `'\\0'` или вообще `s == nullptr` на пользователя.\r\n\r\n> ### В итоге то никаких темплейтных мемберов и не получается (что хорошо)\r\nСчитаю, что `trim_if` (и по аналогии другие тоже) должны всё-таки существовать, и их придётся делать шаблонами.\r\n\r\nИ ещё предлагаю не забывать про аналогичные функции для `str::basic_string_view", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/900270696/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/900477241", + "html_url": "https://github.com/cpp-ru/ideas/issues/475#issuecomment-900477241", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/475", + "id": 900477241, + "node_id": "IC_kwDOFK7cns41rDE5", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-17T17:06:25Z", + "updated_at": "2021-08-17T17:06:25Z", + "author_association": "NONE", + "body": "Если сделать `noexcept(N != 0)`, то оба свойства будут присутствовать. Или так нельзя?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/900477241/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/900482737", + "html_url": "https://github.com/cpp-ru/ideas/issues/475#issuecomment-900482737", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/475", + "id": 900482737, + "node_id": "IC_kwDOFK7cns41rEax", + "user": { + "login": "unterumarmung", + "id": 39276703, + "node_id": "MDQ6VXNlcjM5Mjc2NzAz", + "avatar_url": "https://avatars.githubusercontent.com/u/39276703?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/unterumarmung", + "html_url": "https://github.com/unterumarmung", + "followers_url": "https://api.github.com/users/unterumarmung/followers", + "following_url": "https://api.github.com/users/unterumarmung/following{/other_user}", + "gists_url": "https://api.github.com/users/unterumarmung/gists{/gist_id}", + "starred_url": "https://api.github.com/users/unterumarmung/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/unterumarmung/subscriptions", + "organizations_url": "https://api.github.com/users/unterumarmung/orgs", + "repos_url": "https://api.github.com/users/unterumarmung/repos", + "events_url": "https://api.github.com/users/unterumarmung/events{/privacy}", + "received_events_url": "https://api.github.com/users/unterumarmung/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-17T17:13:32Z", + "updated_at": "2021-08-17T17:13:32Z", + "author_association": "NONE", + "body": "> Если сделать `noexcept(N != 0)`, то оба свойства будут присутствовать. Или так нельзя?\n\nUB не исчезнет, `noexcept`'ность конечно появится", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/900482737/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/900482911", + "html_url": "https://github.com/cpp-ru/ideas/issues/452#issuecomment-900482911", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/452", + "id": 900482911, + "node_id": "IC_kwDOFK7cns41rEdf", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-17T17:13:47Z", + "updated_at": "2021-08-17T17:13:47Z", + "author_association": "NONE", + "body": "> Делал по аналогии с erase[_if]: функция возвращает количество удаленных элементов\r\n\r\nЕсть нюанс. Тот же `erase` не предполагает использования её результата прямо на месте, а вот `trim` выглядит очень органично в таком контексте:\r\n```cpp\r\nstd::string some_input = ...;\r\nProcessInput(some_input.trim());\r\n```\r\n\r\n`trim` надо скорее сопоставлять с `substr` (чем в сущности он и является).\r\n\r\n> Тогда уж лучше принимать std::basic_string_view\r\n\r\nЛучше для консистентности тут поступить тогда, как в уже упомянутых `find_first_of` и иже с ней:\r\n```cpp\r\nconstexpr size_type find_first_of( const CharT* s, size_type pos = 0 ) const;\r\n\r\ntemplate < class T >\r\nconstexpr size_type find_first_of( const T& t, size_type pos = 0 ) const noexcept(/* see below */);\r\n```\r\n\r\nПри этом последняя имеет следующее описание:\r\n> Implicitly converts t to a string view sv as if by `std::basic_string_view sv = t;`, then finds the first character equal to one of the characters in sv. This overload participates in overload resolution only if `std::is_convertible_v>` is `true` and `std::is_convertible_v` is `false`.\r\n\r\nЭто что касается `basic_string_view`, далее имеет смысл добавить перегрузки для `char_type` и `basic_string`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/900482911/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/901862807", + "html_url": "https://github.com/cpp-ru/ideas/issues/475#issuecomment-901862807", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/475", + "id": 901862807, + "node_id": "IC_kwDOFK7cns41wVWX", + "user": { + "login": "maksimus1210", + "id": 15178782, + "node_id": "MDQ6VXNlcjE1MTc4Nzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/15178782?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/maksimus1210", + "html_url": "https://github.com/maksimus1210", + "followers_url": "https://api.github.com/users/maksimus1210/followers", + "following_url": "https://api.github.com/users/maksimus1210/following{/other_user}", + "gists_url": "https://api.github.com/users/maksimus1210/gists{/gist_id}", + "starred_url": "https://api.github.com/users/maksimus1210/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/maksimus1210/subscriptions", + "organizations_url": "https://api.github.com/users/maksimus1210/orgs", + "repos_url": "https://api.github.com/users/maksimus1210/repos", + "events_url": "https://api.github.com/users/maksimus1210/events{/privacy}", + "received_events_url": "https://api.github.com/users/maksimus1210/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-19T12:11:19Z", + "updated_at": "2021-08-19T12:11:19Z", + "author_association": "NONE", + "body": "А для каких целей используется std::array с нулевой длинной? ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/901862807/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/903147374", + "html_url": "https://github.com/cpp-ru/ideas/issues/475#issuecomment-903147374", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/475", + "id": 903147374, + "node_id": "IC_kwDOFK7cns411O9u", + "user": { + "login": "gleb-kov", + "id": 41119563, + "node_id": "MDQ6VXNlcjQxMTE5NTYz", + "avatar_url": "https://avatars.githubusercontent.com/u/41119563?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gleb-kov", + "html_url": "https://github.com/gleb-kov", + "followers_url": "https://api.github.com/users/gleb-kov/followers", + "following_url": "https://api.github.com/users/gleb-kov/following{/other_user}", + "gists_url": "https://api.github.com/users/gleb-kov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gleb-kov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gleb-kov/subscriptions", + "organizations_url": "https://api.github.com/users/gleb-kov/orgs", + "repos_url": "https://api.github.com/users/gleb-kov/repos", + "events_url": "https://api.github.com/users/gleb-kov/events{/privacy}", + "received_events_url": "https://api.github.com/users/gleb-kov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-21T17:17:11Z", + "updated_at": "2021-08-21T17:17:43Z", + "author_association": "NONE", + "body": "```\r\ntemplate\r\nconstexpr std::optional first_worker_weight(const std::array& arr) {\r\n if constexpr(N == 0) {\r\n return std::nullopt;\r\n }\r\n return arr[0]; // or arr.front()\r\n}\r\n\r\ntemplate\r\nconstexpr int sum_workers_weight(const std::array& arr) {\r\n int result = 0;\r\n for (size_t i = 0; i < N; ++i) {\r\n result += arr[i];\r\n }\r\n return result;\r\n}\r\n```\r\n\r\nКод такого вида корректен, но его компиляция будет сломана при N = 0. Чтобы чинить компиляцию такого кода, придется использовать: 1) at() с доп. проверкой внутри 2) итератор, который убьет читаемость в некоторых случаях.\r\nК тому же не ясно сколько кода придется починить .\r\n\r\nЕсли с front и back понятно, что легко ошибиться и можно оградиться от ошибок, то не понятно зачем ломать интерфейс с operator[] ? Сейчас std::array::operator[] имеет УБ, если обращаться к несуществующему элементу. Для этого случая логика такая же. Кто пользуется индексами сам проверяет их корректность.\r\n\r\np.s. ```If size() is 0, data() may or may not return a null pointer.``` может и тут починить?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/903147374/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/903150595", + "html_url": "https://github.com/cpp-ru/ideas/issues/475#issuecomment-903150595", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/475", + "id": 903150595, + "node_id": "IC_kwDOFK7cns411PwD", + "user": { + "login": "unterumarmung", + "id": 39276703, + "node_id": "MDQ6VXNlcjM5Mjc2NzAz", + "avatar_url": "https://avatars.githubusercontent.com/u/39276703?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/unterumarmung", + "html_url": "https://github.com/unterumarmung", + "followers_url": "https://api.github.com/users/unterumarmung/followers", + "following_url": "https://api.github.com/users/unterumarmung/following{/other_user}", + "gists_url": "https://api.github.com/users/unterumarmung/gists{/gist_id}", + "starred_url": "https://api.github.com/users/unterumarmung/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/unterumarmung/subscriptions", + "organizations_url": "https://api.github.com/users/unterumarmung/orgs", + "repos_url": "https://api.github.com/users/unterumarmung/repos", + "events_url": "https://api.github.com/users/unterumarmung/events{/privacy}", + "received_events_url": "https://api.github.com/users/unterumarmung/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-21T17:39:46Z", + "updated_at": "2021-08-21T17:39:46Z", + "author_association": "NONE", + "body": "> Чтобы чинить компиляцию такого кода, придется использовать: 1) at() с доп. проверкой внутри 2) итератор, который убьет читаемость в некоторых случаях.\r\n\r\nИли поставить `else` :)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/903150595/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/903637351", + "html_url": "https://github.com/cpp-ru/ideas/issues/475#issuecomment-903637351", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/475", + "id": 903637351, + "node_id": "IC_kwDOFK7cns413Gln", + "user": { + "login": "gleb-kov", + "id": 41119563, + "node_id": "MDQ6VXNlcjQxMTE5NTYz", + "avatar_url": "https://avatars.githubusercontent.com/u/41119563?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gleb-kov", + "html_url": "https://github.com/gleb-kov", + "followers_url": "https://api.github.com/users/gleb-kov/followers", + "following_url": "https://api.github.com/users/gleb-kov/following{/other_user}", + "gists_url": "https://api.github.com/users/gleb-kov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gleb-kov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gleb-kov/subscriptions", + "organizations_url": "https://api.github.com/users/gleb-kov/orgs", + "repos_url": "https://api.github.com/users/gleb-kov/repos", + "events_url": "https://api.github.com/users/gleb-kov/events{/privacy}", + "received_events_url": "https://api.github.com/users/gleb-kov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-23T10:19:56Z", + "updated_at": "2021-08-23T10:19:56Z", + "author_association": "NONE", + "body": "> Или поставить `else` :)\r\n\r\nНа мой взгляд, это органично только для первого примера, использовать такое везде не очень удобно.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/903637351/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/905158709", + "html_url": "https://github.com/cpp-ru/ideas/issues/476#issuecomment-905158709", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/476", + "id": 905158709, + "node_id": "IC_kwDOFK7cns4186A1", + "user": { + "login": "Gargony", + "id": 9786086, + "node_id": "MDQ6VXNlcjk3ODYwODY=", + "avatar_url": "https://avatars.githubusercontent.com/u/9786086?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Gargony", + "html_url": "https://github.com/Gargony", + "followers_url": "https://api.github.com/users/Gargony/followers", + "following_url": "https://api.github.com/users/Gargony/following{/other_user}", + "gists_url": "https://api.github.com/users/Gargony/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Gargony/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Gargony/subscriptions", + "organizations_url": "https://api.github.com/users/Gargony/orgs", + "repos_url": "https://api.github.com/users/Gargony/repos", + "events_url": "https://api.github.com/users/Gargony/events{/privacy}", + "received_events_url": "https://api.github.com/users/Gargony/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-25T03:45:52Z", + "updated_at": "2021-08-25T03:45:52Z", + "author_association": "NONE", + "body": "Можете добавить в полезные ссылки \r\nhttps://stackoverflow.com/questions/4325154/delete-objects-of-incomplete-type", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/905158709/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/907619673", + "html_url": "https://github.com/cpp-ru/ideas/issues/476#issuecomment-907619673", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/476", + "id": 907619673, + "node_id": "IC_kwDOFK7cns42GS1Z", + "user": { + "login": "xaizek", + "id": 459736, + "node_id": "MDQ6VXNlcjQ1OTczNg==", + "avatar_url": "https://avatars.githubusercontent.com/u/459736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/xaizek", + "html_url": "https://github.com/xaizek", + "followers_url": "https://api.github.com/users/xaizek/followers", + "following_url": "https://api.github.com/users/xaizek/following{/other_user}", + "gists_url": "https://api.github.com/users/xaizek/gists{/gist_id}", + "starred_url": "https://api.github.com/users/xaizek/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/xaizek/subscriptions", + "organizations_url": "https://api.github.com/users/xaizek/orgs", + "repos_url": "https://api.github.com/users/xaizek/repos", + "events_url": "https://api.github.com/users/xaizek/events{/privacy}", + "received_events_url": "https://api.github.com/users/xaizek/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-28T12:26:00Z", + "updated_at": "2021-08-28T12:26:00Z", + "author_association": "NONE", + "body": "Совместимость же поломает. В виду этого не хватает анализа того, как часто удаление incomplete классов используется на практике и есть ли от него хоть какая-то польза. Я не могу придумать случая такой необходимости, но возможно это удобно в каких-нибудь кодогенераторах. С другой стороны, кому наплевать на деструктор, всегда может сделать `::operator delete(ptr);`. Или, возможно, кому-то важна опциональная возможность вызова деструктора (хотя и для этого можно сделать SFINAE проверку). Думаю proposal должен учитывать эти моменты и описывать, что с ними делать существующему коду.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/907619673/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/907649302", + "html_url": "https://github.com/cpp-ru/ideas/issues/466#issuecomment-907649302", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/466", + "id": 907649302, + "node_id": "IC_kwDOFK7cns42GaEW", + "user": { + "login": "bakwc", + "id": 1684011, + "node_id": "MDQ6VXNlcjE2ODQwMTE=", + "avatar_url": "https://avatars.githubusercontent.com/u/1684011?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/bakwc", + "html_url": "https://github.com/bakwc", + "followers_url": "https://api.github.com/users/bakwc/followers", + "following_url": "https://api.github.com/users/bakwc/following{/other_user}", + "gists_url": "https://api.github.com/users/bakwc/gists{/gist_id}", + "starred_url": "https://api.github.com/users/bakwc/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/bakwc/subscriptions", + "organizations_url": "https://api.github.com/users/bakwc/orgs", + "repos_url": "https://api.github.com/users/bakwc/repos", + "events_url": "https://api.github.com/users/bakwc/events{/privacy}", + "received_events_url": "https://api.github.com/users/bakwc/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-28T16:22:16Z", + "updated_at": "2021-08-28T16:22:16Z", + "author_association": "NONE", + "body": "> Кто-то хочет split по одному символу, кто-то по строке, кто-то по любому символу в строке\r\n\r\nСплит по одному символу и сплит по строке решается перегрузкой. Сплит по любому символу выглядит странно.\r\n\r\n> В таких условиях написать split, способный удовлетворить полностью хотя бы небольшую часть разработчиков крайне сложно\r\n\r\nДля любителей string_view уже предложили split_view выше. Кажется что процентов 80 разработчиков устроит split который предложил автор выше.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/907649302/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/907651869", + "html_url": "https://github.com/cpp-ru/ideas/issues/310#issuecomment-907651869", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/310", + "id": 907651869, + "node_id": "IC_kwDOFK7cns42Gasd", + "user": { + "login": "bakwc", + "id": 1684011, + "node_id": "MDQ6VXNlcjE2ODQwMTE=", + "avatar_url": "https://avatars.githubusercontent.com/u/1684011?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/bakwc", + "html_url": "https://github.com/bakwc", + "followers_url": "https://api.github.com/users/bakwc/followers", + "following_url": "https://api.github.com/users/bakwc/following{/other_user}", + "gists_url": "https://api.github.com/users/bakwc/gists{/gist_id}", + "starred_url": "https://api.github.com/users/bakwc/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/bakwc/subscriptions", + "organizations_url": "https://api.github.com/users/bakwc/orgs", + "repos_url": "https://api.github.com/users/bakwc/repos", + "events_url": "https://api.github.com/users/bakwc/events{/privacy}", + "received_events_url": "https://api.github.com/users/bakwc/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-08-28T16:41:56Z", + "updated_at": "2021-08-28T16:41:56Z", + "author_association": "NONE", + "body": "Ещё предложение на эту же тему - добавить в стандарт требование на последовательное хранение в виде набора бит (оно и так уже так реализовано в том же gcc), и вывести наружу методы доступа к сырым запакованным данным. Это будет эффективней (с точки зрения производительности) чем перепаковывать уже запакованные данные отдельными методами.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/907651869/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/913162568", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-913162568", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 913162568, + "node_id": "IC_kwDOFK7cns42bcFI", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-05T14:14:03Z", + "updated_at": "2021-09-05T14:14:03Z", + "author_association": "NONE", + "body": "Если оба варианта в чём-то не очень\r\n```\r\nauto a = [variable = std::move(variable)]() {} // многословный и предлагается упростить\r\nauto a = [&&variable]() {} // не удовлетворяет духу C++ и может запутать\r\n```\r\nТо почему бы не рассмотреть третий, компромиссный?\r\n```\r\nauto a = [std::move(variable)]() {}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/913162568/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/913173378", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-913173378", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 913173378, + "node_id": "IC_kwDOFK7cns42beuC", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-05T15:15:50Z", + "updated_at": "2021-09-05T15:15:50Z", + "author_association": "NONE", + "body": "> Если оба варианта в чём-то не очень\r\n> То почему бы не рассмотреть третий, компромиссный?\r\n\r\nчто делать в случае `auto a = [std::move(getMyVariable())] {}`?\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/913173378/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/913177129", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-913177129", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 913177129, + "node_id": "IC_kwDOFK7cns42bfop", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-05T15:37:10Z", + "updated_at": "2021-09-05T15:39:50Z", + "author_association": "NONE", + "body": "> > Если оба варианта в чём-то не очень\r\n> > То почему бы не рассмотреть третий, компромиссный?\r\n> \r\n> что делать в случае `auto a = [std::move(getMyVariable())] {}`?\r\n\r\nПо постановке идеи похоже, что `[&&x]`/`[std::move(x)]` должны позволяться только для `x` из очень ограниченного множества; а именно для таких, что запись `[x = std::move(x)]` была бы легальной (именно внутри capture list).\r\n\r\nЕсли не ошибаюсь, это значит, что сюда могут попасть только непосредственные названия переменных, т.е. не планируется, что можно будет сделать в том числе так:\r\n```\r\nstruct { std::string s } dummy;\r\nauto a = [std::move(dummy.s)]() { ... };\r\n```\r\n\r\n(Но у автора идеи могут быть другие мнения про множество упростимых выражений)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/913177129/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/913217940", + "html_url": "https://github.com/cpp-ru/ideas/issues/475#issuecomment-913217940", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/475", + "id": 913217940, + "node_id": "IC_kwDOFK7cns42bpmU", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-05T19:54:48Z", + "updated_at": "2021-09-05T19:54:48Z", + "author_association": "NONE", + "body": "> Код такого вида корректен, но его компиляция будет сломана при N = 0.\r\n\r\nДа, есть проблема с тем, что в C++ везде есть код по типу:\r\n```\r\nif (xxx) {\r\n // обычный код...\r\n} else {\r\n // тоже обычный код, но который при (xxx == true) генерировал бы ЖОСКИЙ UB\r\n}\r\n```\r\nкогда рантаймовые ошибки переводятся в ошибки компиляции (как в этом issue), за это придется заплатить:\r\n```\r\nif constexpr (xxx) {\r\n // ...\r\n} else {\r\n // ...\r\n}\r\n```\r\nНо во многих местах мы не можем просто добавить `constexpr`, потому что `xxx` может не быть вычислимым на этапе компиляции.\r\n\r\nЯ бы предложил сделать некую статическую проверку для компилятора, который будет выдавать warning, если рантайм в теории может привести к UB. Но таких проверок и так несколько сотен, и ни одна не предложит переделать такое:\r\n```\r\n#include \r\n#include \r\nint main() {\r\n std::array arr;\r\n\r\n int v;\r\n std::cin >> v; // вводится 100500\r\n std::cout << arr[v] << std::endl;\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/913217940/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/913516420", + "html_url": "https://github.com/cpp-ru/ideas/issues/462#issuecomment-913516420", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/462", + "id": 913516420, + "node_id": "IC_kwDOFK7cns42cyeE", + "user": { + "login": "naf2000", + "id": 76535757, + "node_id": "MDQ6VXNlcjc2NTM1NzU3", + "avatar_url": "https://avatars.githubusercontent.com/u/76535757?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/naf2000", + "html_url": "https://github.com/naf2000", + "followers_url": "https://api.github.com/users/naf2000/followers", + "following_url": "https://api.github.com/users/naf2000/following{/other_user}", + "gists_url": "https://api.github.com/users/naf2000/gists{/gist_id}", + "starred_url": "https://api.github.com/users/naf2000/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/naf2000/subscriptions", + "organizations_url": "https://api.github.com/users/naf2000/orgs", + "repos_url": "https://api.github.com/users/naf2000/repos", + "events_url": "https://api.github.com/users/naf2000/events{/privacy}", + "received_events_url": "https://api.github.com/users/naf2000/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-06T09:59:12Z", + "updated_at": "2021-09-06T09:59:12Z", + "author_association": "NONE", + "body": "Смысл && и || в том, что, зная левое значение, **возможно** не стоит вычислять правое, а сразу получить результат.\r\nВ операции XOR это математически невозможно.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/913516420/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/914169082", + "html_url": "https://github.com/cpp-ru/ideas/issues/477#issuecomment-914169082", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/477", + "id": 914169082, + "node_id": "IC_kwDOFK7cns42fRz6", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-07T09:59:50Z", + "updated_at": "2021-09-07T09:59:50Z", + "author_association": "NONE", + "body": "https://github.com/cplusplus/papers/issues/28", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/914169082/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/914478569", + "html_url": "https://github.com/cpp-ru/ideas/issues/477#issuecomment-914478569", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/477", + "id": 914478569, + "node_id": "IC_kwDOFK7cns42gdXp", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-07T17:10:17Z", + "updated_at": "2021-09-07T17:10:17Z", + "author_association": "NONE", + "body": "> [cplusplus/papers#28](https://github.com/cplusplus/papers/issues/28)\r\n\r\nСпасибо. Бывает)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/914478569/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/917451022", + "html_url": "https://github.com/cpp-ru/ideas/issues/462#issuecomment-917451022", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/462", + "id": 917451022, + "node_id": "IC_kwDOFK7cns42rzEO", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-11T18:21:22Z", + "updated_at": "2021-09-11T18:21:22Z", + "author_association": "NONE", + "body": "Неплохо бы еще иметь [диграф](https://en.cppreference.com/w/cpp/language/operator_alternative) для `^^`\r\n\r\nПравда, он не попадет под общий стиль:\r\n```\r\n& - bitand\r\n&& - and\r\n| - bitor\r\n|| - or\r\n^ - xor\r\n^^ - ?????????\r\n```\r\n\r\nВарианты: `bool_xor`, `xor_bool`, `xorxor`, `bxor`;\r\nлибо несвязанное с xor название: `ex_or` (exclusive or).\r\n\r\n```c++\r\nint i = 42;\r\nvoid *ptr = nullptr;\r\nconst auto uwu = i bool_xor ptr;\r\n```\r\nМне нравится `ex_or` или `bool_xor`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/917451022/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/917614510", + "html_url": "https://github.com/cpp-ru/ideas/issues/462#issuecomment-917614510", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/462", + "id": 917614510, + "node_id": "IC_kwDOFK7cns42sa-u", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-12T11:10:46Z", + "updated_at": "2021-09-12T11:10:46Z", + "author_association": "NONE", + "body": "`&&`, `||` - это не \"диграфы\". Это основное написание операторов и оно не имеет альтернативного в виде диграфов.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/917614510/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/922483243", + "html_url": "https://github.com/cpp-ru/ideas/issues/479#issuecomment-922483243", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/479", + "id": 922483243, + "node_id": "IC_kwDOFK7cns42-_or", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-19T14:32:14Z", + "updated_at": "2021-09-19T14:32:14Z", + "author_association": "NONE", + "body": "Так же было бы удобно, что бы все методы класса по умолчанию были const.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/922483243/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/922544012", + "html_url": "https://github.com/cpp-ru/ideas/issues/479#issuecomment-922544012", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/479", + "id": 922544012, + "node_id": "IC_kwDOFK7cns42_OeM", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-19T22:05:02Z", + "updated_at": "2021-09-19T22:05:02Z", + "author_association": "NONE", + "body": "Предложено в апреле этого года:\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2350r0.pdf", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/922544012/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/927031273", + "html_url": "https://github.com/cpp-ru/ideas/issues/1#issuecomment-927031273", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/1", + "id": 927031273, + "node_id": "IC_kwDOFK7cns43QV_p", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-25T07:26:21Z", + "updated_at": "2021-09-25T07:26:21Z", + "author_association": "MEMBER", + "body": "Аналогичное предложение было сделано в https://wg21.link/p1283r0 , но автор сказал что не будет над ним больше работать.\r\n\r\nМожно будет воскресить идею", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/927031273/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/927709422", + "html_url": "https://github.com/cpp-ru/ideas/issues/480#issuecomment-927709422", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/480", + "id": 927709422, + "node_id": "IC_kwDOFK7cns43S7ju", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-27T09:55:35Z", + "updated_at": "2021-09-27T09:55:35Z", + "author_association": "MEMBER", + "body": "Сейчас комитет планирует сделать несколько иначе http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2412r0.pdf\r\n\r\nИдея в том, чтобы объединять с помощью модулей сразу множество хедеров. Например, сделать модуль `std`, который содержит все сущности стандартной библиотеки.\r\n\r\nЗамеры показывают, что `import std;` работает раз в 10 быстрее чем один только `#include iostream`.\r\n\r\nИтого, вместо разбивания на отдельные хедера или мучительного поиска нужного хедера, просто пишем `import std;`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/927709422/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/927918315", + "html_url": "https://github.com/cpp-ru/ideas/issues/480#issuecomment-927918315", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/480", + "id": 927918315, + "node_id": "IC_kwDOFK7cns43Tujr", + "user": { + "login": "maksimus1210", + "id": 15178782, + "node_id": "MDQ6VXNlcjE1MTc4Nzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/15178782?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/maksimus1210", + "html_url": "https://github.com/maksimus1210", + "followers_url": "https://api.github.com/users/maksimus1210/followers", + "following_url": "https://api.github.com/users/maksimus1210/following{/other_user}", + "gists_url": "https://api.github.com/users/maksimus1210/gists{/gist_id}", + "starred_url": "https://api.github.com/users/maksimus1210/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/maksimus1210/subscriptions", + "organizations_url": "https://api.github.com/users/maksimus1210/orgs", + "repos_url": "https://api.github.com/users/maksimus1210/repos", + "events_url": "https://api.github.com/users/maksimus1210/events{/privacy}", + "received_events_url": "https://api.github.com/users/maksimus1210/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-27T14:16:06Z", + "updated_at": "2021-09-27T14:16:06Z", + "author_association": "NONE", + "body": "На это лет 10 потребуется. А страдаем сейчас.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/927918315/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/931482879", + "html_url": "https://github.com/cpp-ru/ideas/issues/435#issuecomment-931482879", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/435", + "id": 931482879, + "node_id": "IC_kwDOFK7cns43hUz_", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-09-30T16:34:54Z", + "updated_at": "2021-09-30T16:34:54Z", + "author_association": "MEMBER", + "body": "Предожение прошло первый этап ревью, замечания бали поправлены в http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2370r1.html", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/931482879/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/933042743", + "html_url": "https://github.com/cpp-ru/ideas/issues/474#issuecomment-933042743", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "id": 933042743, + "node_id": "IC_kwDOFK7cns43nRo3", + "user": { + "login": "AI-Decay", + "id": 55590011, + "node_id": "MDQ6VXNlcjU1NTkwMDEx", + "avatar_url": "https://avatars.githubusercontent.com/u/55590011?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AI-Decay", + "html_url": "https://github.com/AI-Decay", + "followers_url": "https://api.github.com/users/AI-Decay/followers", + "following_url": "https://api.github.com/users/AI-Decay/following{/other_user}", + "gists_url": "https://api.github.com/users/AI-Decay/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AI-Decay/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AI-Decay/subscriptions", + "organizations_url": "https://api.github.com/users/AI-Decay/orgs", + "repos_url": "https://api.github.com/users/AI-Decay/repos", + "events_url": "https://api.github.com/users/AI-Decay/events{/privacy}", + "received_events_url": "https://api.github.com/users/AI-Decay/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-03T23:14:49Z", + "updated_at": "2021-10-03T23:14:49Z", + "author_association": "NONE", + "body": "> Во-первых, это попросту использование обобщенного синтаксиса:\r\n> \r\n> ```c++\r\n> const auto [var = GetAwesomeValue()] { /* ... */ }\r\n\r\nЭтот синтаксис очень многословен, к тому же со стороны с++ выглядит контринтуитивно. \r\nК примеру эта запись уб, но нечто подобное в списке захвата считается корректным\r\n`int a = a;`\r\n\r\n> В-третьих, предлагаемый подход не совсем подходит той семантике перемещения, которая в С++ существует. Перемещение в С++ явное - через вызов `std::move`, а этот кейс - вопиющее исключение. В целом это пересекается частично со сказанным выше.\r\n\r\nА это проблема? Если ввести новвое правило, что && в лямбде это move, то всё становится довольно явно\r\n> В-четвертых, надо будет дорабатывать еще и статические анализаторы, чтобы они видели такие вот неявные мувы.\r\n\r\nНе занимаюсь разработкой статических анализаторов, но задача выглядит тривиальной\r\n> В-пятых, получается, что можно будет одно и то же сделать по-разному. Зачем еще одно такое место?\r\n\r\nВ С++ куча способов сделать одно и то же по разному, в даном случае это сахар, потому что нынешние ляибды выглядят громоздко\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/933042743/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/933409516", + "html_url": "https://github.com/cpp-ru/ideas/issues/422#issuecomment-933409516", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/422", + "id": 933409516, + "node_id": "IC_kwDOFK7cns43orLs", + "user": { + "login": "humanzer0", + "id": 73357248, + "node_id": "MDQ6VXNlcjczMzU3MjQ4", + "avatar_url": "https://avatars.githubusercontent.com/u/73357248?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/humanzer0", + "html_url": "https://github.com/humanzer0", + "followers_url": "https://api.github.com/users/humanzer0/followers", + "following_url": "https://api.github.com/users/humanzer0/following{/other_user}", + "gists_url": "https://api.github.com/users/humanzer0/gists{/gist_id}", + "starred_url": "https://api.github.com/users/humanzer0/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/humanzer0/subscriptions", + "organizations_url": "https://api.github.com/users/humanzer0/orgs", + "repos_url": "https://api.github.com/users/humanzer0/repos", + "events_url": "https://api.github.com/users/humanzer0/events{/privacy}", + "received_events_url": "https://api.github.com/users/humanzer0/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-04T11:54:56Z", + "updated_at": "2021-10-04T11:54:56Z", + "author_association": "NONE", + "body": "Хотелось бы, чтобы просто завезли в плюсы нормальное сопоставление с образцом из функциональных языков.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/933409516/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/934269605", + "html_url": "https://github.com/cpp-ru/ideas/issues/481#issuecomment-934269605", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/481", + "id": 934269605, + "node_id": "IC_kwDOFK7cns43r9Kl", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-05T10:15:33Z", + "updated_at": "2021-10-05T10:15:33Z", + "author_association": "NONE", + "body": "Интересное предложение. Оно может сработаться в группе с `propconst` [[P1974](http://open-std.org/JTC1/SC22/WG21/docs/papers/2020/p1974r0.pdf)]\r\n\r\nОн предлагался еще в 2015-2016, и возродился в 2020, у него юзкейс таков, что без него не заработает non-transient память из constexpr.\r\n\r\n`propconst` это квалификатор для указательных/ссылочных типов:\r\n```cpp\r\nT propconst*\r\nT propconst&\r\n```\r\nЕсли `T` константный, то он конвертируется в `const`, иначе просто пропадает\r\n```cpp\r\nint propconst * ---> int *\r\nint propconst * const ---> int const * const\r\n```\r\nЕсли это предложение примут, то будет дублирование и два `get` вместо одного\r\n```cpp\r\ntemplate \r\nstruct unique_ptr\r\n{\r\n T* get(); // Resolves to U* if T is propconst U\r\n T* const get() const; // Resolves to const U* if T is propconst U\r\n};\r\n```\r\nНадо сделать так, чтобы был один, с `declqual`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/934269605/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/940387458", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-940387458", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 940387458, + "node_id": "IC_kwDOFK7cns44DSyC", + "user": { + "login": "target-san", + "id": 4011726, + "node_id": "MDQ6VXNlcjQwMTE3MjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/4011726?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/target-san", + "html_url": "https://github.com/target-san", + "followers_url": "https://api.github.com/users/target-san/followers", + "following_url": "https://api.github.com/users/target-san/following{/other_user}", + "gists_url": "https://api.github.com/users/target-san/gists{/gist_id}", + "starred_url": "https://api.github.com/users/target-san/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/target-san/subscriptions", + "organizations_url": "https://api.github.com/users/target-san/orgs", + "repos_url": "https://api.github.com/users/target-san/repos", + "events_url": "https://api.github.com/users/target-san/events{/privacy}", + "received_events_url": "https://api.github.com/users/target-san/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-11T19:34:08Z", + "updated_at": "2021-10-11T19:34:08Z", + "author_association": "NONE", + "body": "Решил воскресить эту идею. Постарался расписать основные моменты, в т.ч. кратко сравнить с P0814:\r\n[Separate type hashing method from hash algorithm](https://gist.github.com/target-san/83989f8b221cb5d85aea8dd42ccb8ff9)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/940387458/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/940724511", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-940724511", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 940724511, + "node_id": "IC_kwDOFK7cns44ElEf", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-12T07:04:11Z", + "updated_at": "2021-10-12T07:04:11Z", + "author_association": "MEMBER", + "body": "Отличное начало!\r\n\r\nПосмотрите ещё на https://wg21.link/p0029r0, там схожие идеи но сильно устеревшее предложение.\r\n\r\nЕщё стоит продумать следующие моменты:\r\n* как использовать с контейнерами\r\n* нужна функция для получения результата из хешера, результат не надо считать на каждый hash_combine (есть хеширующие функции, с дорогим финальным шагом, не надо этот шаг повторять на кажый hash_combine)\r\n* добавить хеширование изкоробки для pair и tuple\r\n* `Hasher` в текущем описании приведёт к бесконечной рекурсии\r\n* `HashFunc` должен быть объектом, при этом у него может быть огромный стейт", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/940724511/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/940756809", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-940756809", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 940756809, + "node_id": "IC_kwDOFK7cns44Es9J", + "user": { + "login": "target-san", + "id": 4011726, + "node_id": "MDQ6VXNlcjQwMTE3MjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/4011726?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/target-san", + "html_url": "https://github.com/target-san", + "followers_url": "https://api.github.com/users/target-san/followers", + "following_url": "https://api.github.com/users/target-san/following{/other_user}", + "gists_url": "https://api.github.com/users/target-san/gists{/gist_id}", + "starred_url": "https://api.github.com/users/target-san/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/target-san/subscriptions", + "organizations_url": "https://api.github.com/users/target-san/orgs", + "repos_url": "https://api.github.com/users/target-san/repos", + "events_url": "https://api.github.com/users/target-san/events{/privacy}", + "received_events_url": "https://api.github.com/users/target-san/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-12T07:52:20Z", + "updated_at": "2021-10-12T07:53:28Z", + "author_association": "NONE", + "body": "> Посмотрите ещё на https://wg21.link/p0029r0, там схожие идеи но сильно устеревшее предложение.\r\n\r\nСпасибо, посмотрю. Пока первое, что бросается в глаза - сборка хеша методом композиции. Я так понимаю, для некоторых хеш-функций это не лучшая идея т.к. первичная инициализация и подсчёт финального резуьтата могут быть относительно дорогими.\r\n\r\n> как использовать с контейнерами\r\n\r\nКонтейнер будет просто вызывать `compute_hash_value(hash_func, value)`. Забыл добавить примеров, как раз опишу этот момент.\r\n\r\n> нужна функция для получения результата из хешера, результат не надо считать на каждый hash_combine (есть хеширующие функции, с дорогим финальным шагом, не надо этот шаг повторять на кажый hash_combine)\r\n\r\nДля этого я и расписал `Alternative HashFunc`, представляющую собой короткоживущий stateful объект. У него есть метод `result`, возвращающий значение хеш-функции.\r\n\r\n> добавить хеширование изкоробки для pair и tuple\r\n\r\nДа, безусловно. Просто я решил, что их имеет смысл делать в рамках reference implementation, чуть позже.\r\n\r\n> Hasher в текущем описании приведёт к бесконечной рекурсии\r\n\r\nСпасибо за замечание, проверю. Я писал этот код как скетч, из головы. По хорошему, нужно делать реализацию в виде форка stdlib CLang'а, и уже её основательно гонять.\r\n\r\n> HashFunc должен быть объектом, при этом у него может быть огромный стейт\r\n\r\nВ общем, вы склоняетесь к альтернативному варианту.\r\n\r\nПара вопросов:\r\n\r\n* Стоит ли требовать от HashFunc copy-constructible или default constructible? В первом случае можно будет инициализировать контейнер объектом-функцией с неким первичным состоянием, а внутри контейнера делать копии для вычисления хешей. Во втором новые объекты-функции будут просто спавниться, по одному на каждое вычислене хеша. Первый подод выглядит более гибким, второй более простым.\r\n* Что думаете по поводу endian-ness? Может, стоит просто опционально реализовывать у объекта-функции перегрузки для всех числовых типов?\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/940756809/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/940966063", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-940966063", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 940966063, + "node_id": "IC_kwDOFK7cns44FgCv", + "user": { + "login": "target-san", + "id": 4011726, + "node_id": "MDQ6VXNlcjQwMTE3MjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/4011726?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/target-san", + "html_url": "https://github.com/target-san", + "followers_url": "https://api.github.com/users/target-san/followers", + "following_url": "https://api.github.com/users/target-san/following{/other_user}", + "gists_url": "https://api.github.com/users/target-san/gists{/gist_id}", + "starred_url": "https://api.github.com/users/target-san/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/target-san/subscriptions", + "organizations_url": "https://api.github.com/users/target-san/orgs", + "repos_url": "https://api.github.com/users/target-san/repos", + "events_url": "https://api.github.com/users/target-san/events{/privacy}", + "received_events_url": "https://api.github.com/users/target-san/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-12T12:28:20Z", + "updated_at": "2021-10-12T13:25:06Z", + "author_association": "NONE", + "body": "По ссылкам обнаруживается масса пропозалов на эту тему. Общий список примерно следующий:\r\n* [P0814R2](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0814r2.pdf) - текущий, простенький хелпер `hash_combine`\r\n* [P0029R0](https://wg21.link/p0029r0) - предыдущий, наиболее близок к этому документу, отличается разделением `HashFunc` на `std::hash_code` и `std::hash_combine`.\r\n* [N3333](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3333.html) - `hash_value` с поиском через ADL, `hash_combine` для комбинирования значений; один алгоритм хеширования.\r\n* [N3980](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3980.html) - похоже, отличается от P0029 только в мелких деталях\r\n* [N3876](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3876.pdf) - почти чистый `hash_combine`\r\n\r\nСамый интересный вопрос - почему ни один из них так и не приняли.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/940966063/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/943788651", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-943788651", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 943788651, + "node_id": "IC_kwDOFK7cns44QRJr", + "user": { + "login": "target-san", + "id": 4011726, + "node_id": "MDQ6VXNlcjQwMTE3MjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/4011726?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/target-san", + "html_url": "https://github.com/target-san", + "followers_url": "https://api.github.com/users/target-san/followers", + "following_url": "https://api.github.com/users/target-san/following{/other_user}", + "gists_url": "https://api.github.com/users/target-san/gists{/gist_id}", + "starred_url": "https://api.github.com/users/target-san/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/target-san/subscriptions", + "organizations_url": "https://api.github.com/users/target-san/orgs", + "repos_url": "https://api.github.com/users/target-san/repos", + "events_url": "https://api.github.com/users/target-san/events{/privacy}", + "received_events_url": "https://api.github.com/users/target-san/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-14T22:31:59Z", + "updated_at": "2021-10-14T22:31:59Z", + "author_association": "NONE", + "body": "@apolukhin Обновил [proposal](https://gist.github.com/target-san/83989f8b221cb5d85aea8dd42ccb8ff9). Пока не осветил сравнение с предыдущими предложениями.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/943788651/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945053417", + "html_url": "https://github.com/cpp-ru/ideas/issues/481#issuecomment-945053417", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/481", + "id": 945053417, + "node_id": "IC_kwDOFK7cns44VF7p", + "user": { + "login": "dkatkevich-ms", + "id": 79838614, + "node_id": "MDQ6VXNlcjc5ODM4NjE0", + "avatar_url": "https://avatars.githubusercontent.com/u/79838614?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/dkatkevich-ms", + "html_url": "https://github.com/dkatkevich-ms", + "followers_url": "https://api.github.com/users/dkatkevich-ms/followers", + "following_url": "https://api.github.com/users/dkatkevich-ms/following{/other_user}", + "gists_url": "https://api.github.com/users/dkatkevich-ms/gists{/gist_id}", + "starred_url": "https://api.github.com/users/dkatkevich-ms/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/dkatkevich-ms/subscriptions", + "organizations_url": "https://api.github.com/users/dkatkevich-ms/orgs", + "repos_url": "https://api.github.com/users/dkatkevich-ms/repos", + "events_url": "https://api.github.com/users/dkatkevich-ms/events{/privacy}", + "received_events_url": "https://api.github.com/users/dkatkevich-ms/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-17T05:39:31Z", + "updated_at": "2021-10-17T05:39:31Z", + "author_association": "NONE", + "body": "В грядущем стандарте уже приняли `deducing this` - новый синтаксис определения метода, который покрывает ваш юзкейс", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945053417/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945176272", + "html_url": "https://github.com/cpp-ru/ideas/issues/481#issuecomment-945176272", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/481", + "id": 945176272, + "node_id": "IC_kwDOFK7cns44Vj7Q", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-17T18:56:26Z", + "updated_at": "2021-10-17T18:56:26Z", + "author_association": "MEMBER", + "body": "Приняли в стандарт C++23 https://wg21.link/P0847", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945176272/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945176473", + "html_url": "https://github.com/cpp-ru/ideas/issues/464#issuecomment-945176473", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/464", + "id": 945176473, + "node_id": "IC_kwDOFK7cns44Vj-Z", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-17T18:57:50Z", + "updated_at": "2021-10-17T18:57:50Z", + "author_association": "MEMBER", + "body": "Приняли в C++23 https://wg21.link/p0847", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945176473/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945176986", + "html_url": "https://github.com/cpp-ru/ideas/issues/459#issuecomment-945176986", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/459", + "id": 945176986, + "node_id": "IC_kwDOFK7cns44VkGa", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-17T19:01:45Z", + "updated_at": "2021-10-17T19:01:45Z", + "author_association": "MEMBER", + "body": "В C++23 приняли std::views::zip \r\n\r\nТеперь можно делать так\r\n```\r\nstd::vector v1 = {1, 2};\r\nstd::vector v2 = {'a', 'b', 'c'};\r\n\r\nfor (auto [first, second] : std::views::zip(v1, v2)) // ...\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945176986/reactions", + "total_count": 2, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 1, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945177197", + "html_url": "https://github.com/cpp-ru/ideas/issues/454#issuecomment-945177197", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/454", + "id": 945177197, + "node_id": "IC_kwDOFK7cns44VkJt", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-17T19:03:21Z", + "updated_at": "2021-10-17T19:03:21Z", + "author_association": "MEMBER", + "body": "В C++23 приняли https://wg21.link/p0288", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945177197/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945177630", + "html_url": "https://github.com/cpp-ru/ideas/issues/410#issuecomment-945177630", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/410", + "id": 945177630, + "node_id": "IC_kwDOFK7cns44VkQe", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-17T19:06:07Z", + "updated_at": "2021-10-17T19:06:07Z", + "author_association": "MEMBER", + "body": "В C++23 приняли https://wg21.link/p0847 , теперь можно писать и self", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/945177630/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/949468201", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-949468201", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 949468201, + "node_id": "IC_kwDOFK7cns44l7wp", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-22T09:52:44Z", + "updated_at": "2021-10-22T09:52:44Z", + "author_association": "MEMBER", + "body": "Proposal состоит как бы из двух частей:\r\n1. объект для хеширования\r\n2. visit по всем значимым полям класса\r\n\r\nС частью 1. всё неплохо. Надо ли сделать чтобы хешеры могли возвращать разные типы результата (например std::unit32_t, чтобы хеш можно было сохранять и передавать по сети/диску между разноразрядными платформами). Продумать интеграцию со стандартными контейнерами - как сразу начать использовать новые хеши? Расставить noexcept (или расписать, почему не расставили) для `concept HashFunc`\r\n\r\nЧасть 2. меня пугает. Кажется что это более общий механизм, который можно применять не только для хеширования, но и для сериализации/десериализации и т.п. Нужно либо расписать, почему это плохая идея, использовать этот механизм для других вещей, либо расписать его использование для других сценариев.\r\n\r\nВ любом случае, кажется часть 2 надо вынессти отдельно - по ней будет очень много вопросов и споров в комитете, в частности, как это соотносится с предложенной рефлексией.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/949468201/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/949485306", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-949485306", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 949485306, + "node_id": "IC_kwDOFK7cns44l_76", + "user": { + "login": "target-san", + "id": 4011726, + "node_id": "MDQ6VXNlcjQwMTE3MjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/4011726?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/target-san", + "html_url": "https://github.com/target-san", + "followers_url": "https://api.github.com/users/target-san/followers", + "following_url": "https://api.github.com/users/target-san/following{/other_user}", + "gists_url": "https://api.github.com/users/target-san/gists{/gist_id}", + "starred_url": "https://api.github.com/users/target-san/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/target-san/subscriptions", + "organizations_url": "https://api.github.com/users/target-san/orgs", + "repos_url": "https://api.github.com/users/target-san/repos", + "events_url": "https://api.github.com/users/target-san/events{/privacy}", + "received_events_url": "https://api.github.com/users/target-san/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-22T10:15:06Z", + "updated_at": "2021-10-22T10:17:37Z", + "author_association": "NONE", + "body": "> С частью 1. всё неплохо.\r\n\r\nСпасибо, стараюсь по мере возможности.\r\n\r\n> Надо ли сделать чтобы хешеры могли возвращать разные типы результата (например std::unit32_t, чтобы хеш можно было сохранять и передавать по сети/диску между разноразрядными платформами).\r\n\r\nПо сути, пропозал это и предлагает. `HashFunc::result()` может возвращать произвольный тип. Он фиксирован как `std::size_t` только для стандартных хешеров.\r\n\r\n> Продумать интеграцию со стандартными контейнерами - как сразу начать использовать новые хеши? \r\n\r\nЭтот момент описан в [отдельном разделе](https://gist.github.com/target-san/83989f8b221cb5d85aea8dd42ccb8ff9#integration-with-existing-codebase). Я так понимаю, недостаточно внятно. Чего может не хватать:\r\n\r\n1. Примера реализации blanket `std::hash` с enabledness по наличию новых функций хеширования\r\n2. Примера выбора между старым и новым хешером внутри контейнера\r\n\r\nЧто-то ещё?\r\n\r\n> Расставить noexcept (или расписать, почему не расставили) для concept HashFunc\r\n\r\nБесспорно, это надо сделать. Но, как мне кажется, уже после \"устаканивания\" первичной идеи.\r\n\r\n> Часть 2. меня пугает. Кажется что это более общий механизм, который можно применять не только для хеширования, но и для сериализации/десериализации и т.п. Нужно либо расписать, почему это плохая идея, использовать этот механизм для других вещей, либо расписать его использование для других сценариев.\r\n>\r\n> В любом случае, кажется часть 2 надо вынессти отдельно - по ней будет очень много вопросов и споров в комитете, в частности, как это соотносится с предложенной рефлексией.\r\n\r\nВот здесь не совсем понимаю. В тексте нигде не упоминаются какие-либо варианты автогенерации `hash_value`. Пропозал, по сути, нейтрален относительно подобной рефлексии. Всё, что предлагается - сделать максимально эргономичную композицию для реализации пользовательского кода. Хешер ничего не генерирует, он просто выбирает из пачки доступных реализаций, используя ADL. Если же вы говорите о коде вида `hasher(value.first)`, то это просто более эргономичный вариант через перегрузку оператора (). Похожий подход применяется в [cereal](https://uscilab.github.io/cereal/). К примеру, в пропозале P0029 для этого требуется явно использовать `hash_combine`.\r\n\r\nИли я вас неправильно понял. Тогда укажите пожалуйста на \"2ю часть\", о которой вы говорите.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/949485306/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/949596905", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-949596905", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 949596905, + "node_id": "IC_kwDOFK7cns44mbLp", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-22T12:43:47Z", + "updated_at": "2021-10-22T12:43:47Z", + "author_association": "MEMBER", + "body": "Вы фактически предлагаете концепт HashFunc, который отвечает за то **как** хешировать, и `hash_value` говорящий **что** хешировать:\r\n```\r\nstruct foo {\r\n void hash_value(auto& hasher) {\r\n hasher(a);\r\n hasher(b);\r\n }\r\n\r\n int a; \r\n int b;\r\n};\r\n\r\nauto kHash = sha512hasher(foo{4, 2});\r\n```\r\n\r\nЛюди в комитете зададут вопросы:\r\n* `hash_value` - это ведь функция, применяющая функтор к каждому из полей класса. Можно ли обобщить `hash_value` для других целей? Например для сериализации/дессериализации? \r\n* не хочется писать hash_value руками для агрегатов, почему бы компилятору не генерировать эту функцию за нас?\r\n* в предложении делается интроспекция типа, как предложение соотносится с разрабатываемой рефлексией?\r\n\r\nИменно поэтому, вторая часть меня и беспокоит - непонятно куда заведёт обсуждение, и если обсуждение зайдёт в страшные дебри, то всё предложение будет под вопросом/затянется.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/949596905/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/949729134", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-949729134", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 949729134, + "node_id": "IC_kwDOFK7cns44m7du", + "user": { + "login": "target-san", + "id": 4011726, + "node_id": "MDQ6VXNlcjQwMTE3MjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/4011726?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/target-san", + "html_url": "https://github.com/target-san", + "followers_url": "https://api.github.com/users/target-san/followers", + "following_url": "https://api.github.com/users/target-san/following{/other_user}", + "gists_url": "https://api.github.com/users/target-san/gists{/gist_id}", + "starred_url": "https://api.github.com/users/target-san/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/target-san/subscriptions", + "organizations_url": "https://api.github.com/users/target-san/orgs", + "repos_url": "https://api.github.com/users/target-san/repos", + "events_url": "https://api.github.com/users/target-san/events{/privacy}", + "received_events_url": "https://api.github.com/users/target-san/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-22T15:21:22Z", + "updated_at": "2021-10-22T15:21:22Z", + "author_association": "NONE", + "body": "Спасибо, теперь вопрос понятен.\r\n\r\nКороткий ответ:\r\n\r\nКод местами похож на интроспекцию, но не требует её никоим образом. Задача - улучшить хеширование, не сделать его супер-универсальным. Однако сам подход вполне совместим с будущей рефлексией и может быть дополнен ею позднее.\r\n\r\nОтвет по пунктам:\r\n\r\n> `hash_value` - это ведь функция, применяющая функтор к каждому из полей класса. Можно ли обобщить `hash_value` для других целей? Например для сериализации/дессериализации?\r\n\r\nВ двух словах - нет. Сериализуемые данные в общем случае не равны хешируемым данным. Сам подход можно применить аналогичным образом. Сейчас в качестве примера можно смотреть ту же библиотеку cereal, упомянутую мной ранее. Но в любом случае это будет отдельный \"микро-фреймворк\".\r\n\r\n> не хочется писать hash_value руками для агрегатов, почему бы компилятору не генерировать эту функцию за нас?\r\n\r\nМожно и генерировать, но этот пропозал намеренно не затрагивает вопрос автоматической генерации и полностью ортогонален ему. Ничто не мешает реализовать генерацию потом, или отдельным пропозалом, или через рефлексию (когда и если она будет).\r\n\r\n> в предложении делается интроспекция типа, как предложение соотносится с разрабатываемой рефлексией?\r\n\r\nВынужден не согласиться. То, что код похож на интроспекцию типа, не означает, что там эта интроспекция есть. В этом плане любая реализация `hash_value` использует не больше интроспекции, чем существующие сейчас специализации `std::hash`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/949729134/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/951665958", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-951665958", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 951665958, + "node_id": "IC_kwDOFK7cns44uUUm", + "user": { + "login": "target-san", + "id": 4011726, + "node_id": "MDQ6VXNlcjQwMTE3MjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/4011726?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/target-san", + "html_url": "https://github.com/target-san", + "followers_url": "https://api.github.com/users/target-san/followers", + "following_url": "https://api.github.com/users/target-san/following{/other_user}", + "gists_url": "https://api.github.com/users/target-san/gists{/gist_id}", + "starred_url": "https://api.github.com/users/target-san/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/target-san/subscriptions", + "organizations_url": "https://api.github.com/users/target-san/orgs", + "repos_url": "https://api.github.com/users/target-san/repos", + "events_url": "https://api.github.com/users/target-san/events{/privacy}", + "received_events_url": "https://api.github.com/users/target-san/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-26T08:05:28Z", + "updated_at": "2021-10-26T08:05:28Z", + "author_association": "NONE", + "body": "[Обновил пропозал](https://gist.github.com/target-san/83989f8b221cb5d85aea8dd42ccb8ff9).\r\n\r\nПо замечаниям:\r\n1. Возможность возвращать типы, отличные от `std::size_t`, явно указана в [этом разделе](https://gist.github.com/target-san/83989f8b221cb5d85aea8dd42ccb8ff9#hashfunc) - второй абзац и первый элемент в списке \"Properties of proposed design\".\r\n2. Интеграция с существующими хеш-контейнерами. Необходимые изменения вынесены в [отдельный подраздел](https://gist.github.com/target-san/83989f8b221cb5d85aea8dd42ccb8ff9#changes-needed-for-integration). Остальная часть раздела - объяснение, почему именно так.\r\n3. Добавлен отдельный раздел [Out of scope](https://gist.github.com/target-san/83989f8b221cb5d85aea8dd42ccb8ff9#out-of-scope), в котором явно указано, что интроспекция и рефлексия в пропозале не рассматриваются.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/951665958/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/951923559", + "html_url": "https://github.com/cpp-ru/ideas/issues/462#issuecomment-951923559", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/462", + "id": 951923559, + "node_id": "IC_kwDOFK7cns44vTNn", + "user": { + "login": "kirillgrachoff", + "id": 35011824, + "node_id": "MDQ6VXNlcjM1MDExODI0", + "avatar_url": "https://avatars.githubusercontent.com/u/35011824?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kirillgrachoff", + "html_url": "https://github.com/kirillgrachoff", + "followers_url": "https://api.github.com/users/kirillgrachoff/followers", + "following_url": "https://api.github.com/users/kirillgrachoff/following{/other_user}", + "gists_url": "https://api.github.com/users/kirillgrachoff/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kirillgrachoff/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kirillgrachoff/subscriptions", + "organizations_url": "https://api.github.com/users/kirillgrachoff/orgs", + "repos_url": "https://api.github.com/users/kirillgrachoff/repos", + "events_url": "https://api.github.com/users/kirillgrachoff/events{/privacy}", + "received_events_url": "https://api.github.com/users/kirillgrachoff/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-10-26T13:10:40Z", + "updated_at": "2021-10-26T13:10:40Z", + "author_association": "NONE", + "body": "Есть же `!=`. Чем не `^^`?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/951923559/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/961703005", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-961703005", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 961703005, + "node_id": "IC_kwDOFK7cns45Umxd", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-11-05T08:17:17Z", + "updated_at": "2021-11-05T08:17:17Z", + "author_association": "MEMBER", + "body": "@target-san ещё немного комментов:\r\n\r\n* HashFunc\r\n * нужно подумать над названием, это больше не функция, а объект/алгоритм\r\n * нужно описать требования на возвращаемый из hashFunc.result() тип данных. Нужно чтобы результаты были сравнимы... а для использования в unordered контейнерах необходимо чтобы к результату можно было применять операции %, /, &, ~. Возможно, что нужно требовать чтобы возвращался целочисленный тип, но тогда возникнут проблемы со всякими sha512\r\n * концепты в C++23 описываются в нижнем регистре, в snake_case\r\n* Hasher\r\n * привести к единому виду, где-то с заглавной буквы, где-то с малой \r\n * непонятно, как туда передаётся объект удовлетворяющий HashFunc\r\n * в `using std::hash_value;` вы намекаете на стандартные хешеры, но больше в proposal их нет. Надо сделать целостно\r\n * `static_assert(false` - надо сделать `false` зависимым от `T`, иначе assert всегда будет срабатывать\r\n * HashableUsingFreeFunc не сработает если hash_value находится в std и тип является фундаментальным (например double), надо поправить operator(). Сейчас он никогда не будет использовать std::hash_value \r\n * наверное вы подразумеваете наследование std::hasher от алгоритма хеширования. Если этого не делать, то compute_hash_value не нужен, можно просто звать std::hasher(hash_algo, data).result(). Наследоваться нельзя, алгоритм может быть помечен пользователем как final\r\n* Добавьте секцию Wording и перечислите там все сигнатуры функций и классов, которые предлагаете добавить в стандарт", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/961703005/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/961705265", + "html_url": "https://github.com/cpp-ru/ideas/issues/399#issuecomment-961705265", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/399", + "id": 961705265, + "node_id": "IC_kwDOFK7cns45UnUx", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-11-05T08:21:17Z", + "updated_at": "2021-11-05T08:21:17Z", + "author_association": "MEMBER", + "body": "Чуть не забыл:\r\n* Раз алгоритм хеширования теперь отделён от данных, то ничего не мешает методам std::hasher быть constexpr. Если передадут constexpr HashFunc, то можно будет подсчитать на этапе компиляции. Нет - подсчитается в рантайме.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/961705265/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/962222225", + "html_url": "https://github.com/cpp-ru/ideas/issues/484#issuecomment-962222225", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/484", + "id": 962222225, + "node_id": "IC_kwDOFK7cns45WliR", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-11-05T21:10:37Z", + "updated_at": "2021-11-05T21:10:37Z", + "author_association": "NONE", + "body": "Похоже, есть в [Reflection TS](https://cplusplus.github.io/reflection-ts/draft.pdf):\r\n\r\n> `template struct is_implicitly_declared;`\r\n> `template struct is_defaulted;`\r\n> All specializations of these templates shall meet the `UnaryTypeTrait` requirements (20.10.1).\r\n> If their template parameter reflects a special member function that is implicitly declared\r\n> (for `is_implicitly_declared`) or that is defaulted in its first declaration (for `is_defaulted`),\r\n> the base characteristic of the respective template specialization is `true_type`, otherwise it\r\n> is `false_type`.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/962222225/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/962227403", + "html_url": "https://github.com/cpp-ru/ideas/issues/482#issuecomment-962227403", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/482", + "id": 962227403, + "node_id": "IC_kwDOFK7cns45WmzL", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-11-05T21:19:27Z", + "updated_at": "2021-11-06T09:30:56Z", + "author_association": "NONE", + "body": "[Reflection TS](https://cplusplus.github.io/reflection-ts/draft.pdf), если я его верно понял, имеет `numer_of_members`:\r\n\r\n> `template struct get_size;`\r\n> All specializations of `get_size` shall meet the `UnaryTypeTrait` requirements (20.10.1)\r\nwith a base characteristic of `integral_constant`, where `N` is the number of elements in the object sequence.\r\n\r\nи `type_of_member`: \r\n\r\n> `template struct get_element;`\r\n> All specializations of `get_element` shall meet the `TransformationTrait` requirements\r\n(20.10.1). The nested type named `type` corresponds to the `I`th element `Object` in T, where\r\nthe indexing is zero-based.\r\n\r\nОднако, вещей, похожих на `pointer_to_member` и `index_of_member` я не нашёл.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/962227403/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/968056926", + "html_url": "https://github.com/cpp-ru/ideas/issues/485#issuecomment-968056926", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/485", + "id": 968056926, + "node_id": "IC_kwDOFK7cns45s2Be", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-11-13T11:58:26Z", + "updated_at": "2021-11-13T13:30:18Z", + "author_association": "NONE", + "body": "> если библиотека поддерживает итераторы, написание итератора-конвертера.\r\n\r\nХотел ответить, что можно написать только `operator=(const T&)` и `operator T()`.\r\nC одной стороны, будет явное и безопасное соответствие между полями; с другой -- итераторы и алгоритмы должны сгенерироваться и оптимизироваться.\r\n\r\n```c++\r\nstruct Coords {\r\n int column;\r\n int row;\r\n\r\n void operator=(const XY& rhs) noexcept { column = rhs.x; row = rhs.y; }\r\n operator XY() const noexcept { return XY{column, row}; }\r\n};\r\n```\r\n\r\nНо компилятор в таком копировании не хочет разглядеть memcopy/memmove, и пишет код самостоятельно. https://godbolt.org/z/TaWsxdc6o\r\n\r\nТак что решения не вполне эквивалентны, но выглядит больше как недоработка компилятора.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/968056926/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/968289490", + "html_url": "https://github.com/cpp-ru/ideas/issues/485#issuecomment-968289490", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/485", + "id": 968289490, + "node_id": "IC_kwDOFK7cns45tuzS", + "user": { + "login": "topin89", + "id": 25770107, + "node_id": "MDQ6VXNlcjI1NzcwMTA3", + "avatar_url": "https://avatars.githubusercontent.com/u/25770107?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/topin89", + "html_url": "https://github.com/topin89", + "followers_url": "https://api.github.com/users/topin89/followers", + "following_url": "https://api.github.com/users/topin89/following{/other_user}", + "gists_url": "https://api.github.com/users/topin89/gists{/gist_id}", + "starred_url": "https://api.github.com/users/topin89/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/topin89/subscriptions", + "organizations_url": "https://api.github.com/users/topin89/orgs", + "repos_url": "https://api.github.com/users/topin89/repos", + "events_url": "https://api.github.com/users/topin89/events{/privacy}", + "received_events_url": "https://api.github.com/users/topin89/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-11-14T13:18:39Z", + "updated_at": "2021-11-14T13:18:39Z", + "author_association": "NONE", + "body": "> C одной стороны, будет явное и безопасное соответствие между полями; с другой -- итераторы и алгоритмы должны сгенерироваться и оптимизироваться.\r\n\r\nСобственно, идея этого и [ещё этого](https://github.com/cpp-ru/ideas/issues/486) предложений в том, чтобы можно было обходиться без копирования массива, всего или поэлементно. И да, memcpy _может_ оптимизироваться, а может и нет, и компилятор нам _никогда не скажет_, в чём проблема и заключена.\r\n\r\nЭто определённо оправдано, если тип, размер или выравнивание элементов структуры не совпадают. Но если это эффективно одно и то же, можно же дать как механизм как проверки, что `struct{uint8_t r, g, b; };` ничем не отличается от `std::array`, так и возможность избирательно алиасить такие типы и, желательно, все производные.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/968289490/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/968347042", + "html_url": "https://github.com/cpp-ru/ideas/issues/485#issuecomment-968347042", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/485", + "id": 968347042, + "node_id": "IC_kwDOFK7cns45t82i", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-11-14T19:10:19Z", + "updated_at": "2021-11-14T19:22:47Z", + "author_association": "NONE", + "body": "Есть три способа передать массив: итераторы/ranges, С-указатель, ссылка/указатель на C++ класс. Если что-то упустил, поправьте пожалуйста.\r\n\r\nПоследний способ отбрасываем за общей немасштабируемостью (нельзя передать вектор вместо массива).\r\n\r\nС-указателю нужно ваше приведение. Шаблонный итератор-конвертер без него тоже не строится (нельзя взять указатель/ссылку на временный объект), согласен.\r\n\r\nЕсли предположить, что у нас есть рефлексия вроде #482 или #468, то мы должны перестать считать такой код UB:\r\n\r\n```c++\r\ntemplate\r\nTo* dealiasing_cast(From* ptr)\r\n{\r\n static_assert(sizeof(To) == sizeof(From));\r\n static_assert(alignof(To) == alignof(From));\r\n static_assert(number_of_members = number_of_members);\r\n for ... (auto i = 0; i < number_of_members; ++i)\r\n static_assert(std::is_same_v(type_of_member, type_of_member>);\r\n\r\n return reinterpret_cast(ptr);\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/968347042/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/969024677", + "html_url": "https://github.com/cpp-ru/ideas/issues/485#issuecomment-969024677", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/485", + "id": 969024677, + "node_id": "IC_kwDOFK7cns45wiSl", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-11-15T15:28:51Z", + "updated_at": "2021-11-15T15:28:51Z", + "author_association": "NONE", + "body": "[P1912](https://wg21.link/p1912): Types with array-like object representations", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/969024677/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/970799014", + "html_url": "https://github.com/cpp-ru/ideas/issues/485#issuecomment-970799014", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/485", + "id": 970799014, + "node_id": "IC_kwDOFK7cns453Tem", + "user": { + "login": "topin89", + "id": 25770107, + "node_id": "MDQ6VXNlcjI1NzcwMTA3", + "avatar_url": "https://avatars.githubusercontent.com/u/25770107?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/topin89", + "html_url": "https://github.com/topin89", + "followers_url": "https://api.github.com/users/topin89/followers", + "following_url": "https://api.github.com/users/topin89/following{/other_user}", + "gists_url": "https://api.github.com/users/topin89/gists{/gist_id}", + "starred_url": "https://api.github.com/users/topin89/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/topin89/subscriptions", + "organizations_url": "https://api.github.com/users/topin89/orgs", + "repos_url": "https://api.github.com/users/topin89/repos", + "events_url": "https://api.github.com/users/topin89/events{/privacy}", + "received_events_url": "https://api.github.com/users/topin89/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-11-16T23:13:49Z", + "updated_at": "2021-11-16T23:13:49Z", + "author_association": "NONE", + "body": "> \r\n> \r\n> [P1912](https://wg21.link/p1912): Types with array-like object representations\r\n\r\nКруто! И думаю, можно слегка расширить, чтобы работала и на структурах типа таких:\r\n\r\n```c++\r\nstruct PixOriented{\r\n int x;\r\n int y;\r\n double theta;\r\n};\r\n\r\nstruct oriented_point{\r\n int x_offset;\r\n int y_offset;\r\n double theta;\r\n};\r\n```\r\n\r\nХотя шансов встретить такую структур существенно меньше, чем условные цвета и координаты, они есть. Уверен предложение можно расширить до условных: \r\n\r\n```c++\r\nunion{\r\n struct T layoutas(int[2], float[1]){\r\n int x;\r\n int y;\r\n float z;\r\n };\r\n \r\n struct{\r\n int array_int[2];\r\n float array_float[1];\r\n };\r\n}\r\n```\r\n\r\nА внутри считать всё массивом из таких вот анонимных структур", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/970799014/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/973792664", + "html_url": "https://github.com/cpp-ru/ideas/issues/468#issuecomment-973792664", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/468", + "id": 973792664, + "node_id": "IC_kwDOFK7cns46CuWY", + "user": { + "login": "oficsu", + "id": 35731382, + "node_id": "MDQ6VXNlcjM1NzMxMzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/35731382?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/oficsu", + "html_url": "https://github.com/oficsu", + "followers_url": "https://api.github.com/users/oficsu/followers", + "following_url": "https://api.github.com/users/oficsu/following{/other_user}", + "gists_url": "https://api.github.com/users/oficsu/gists{/gist_id}", + "starred_url": "https://api.github.com/users/oficsu/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/oficsu/subscriptions", + "organizations_url": "https://api.github.com/users/oficsu/orgs", + "repos_url": "https://api.github.com/users/oficsu/repos", + "events_url": "https://api.github.com/users/oficsu/events{/privacy}", + "received_events_url": "https://api.github.com/users/oficsu/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-11-19T06:34:25Z", + "updated_at": "2021-11-19T06:35:10Z", + "author_association": "NONE", + "body": "> Хотя я забыл спросить, что у вас конкретно вызывает сомнения в этом синтаксисе. Вы считаете что это не вписывается в концепцию языка, или где либо пересекается с уже существующим синтаксисом?\r\n\r\nМне показалось, что такая конструкция заметно нарушает принцип наименьшего удивления — синтаксис, словно мы берём адрес от class scope. У меня точно нет решения лучше, но я бы начал пробовать что-то в таком направлении:\r\n```cpp\r\nauto* [first_memptr, second_memptr, third_memptr] = &Aggregate;\r\nauto [first_memptr, second_memptr, third_memptr] = &Aggregate::*;\r\nauto [first_memptr, second_memptr, third_memptr] = Aggregate::*;\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/973792664/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/983629644", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-983629644", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 983629644, + "node_id": "IC_kwDOFK7cns46oP9M", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-01T13:14:43Z", + "updated_at": "2021-12-01T13:16:19Z", + "author_association": "NONE", + "body": "А как таковой имплементировать в `forward_list` без итерации по всем элементам, если у него указатели направлены в одну сторону?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/983629644/reactions", + "total_count": 4, + "+1": 4, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/986894254", + "html_url": "https://github.com/cpp-ru/ideas/issues/488#issuecomment-986894254", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/488", + "id": 986894254, + "node_id": "IC_kwDOFK7cns460s-u", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T15:40:18Z", + "updated_at": "2021-12-06T15:40:18Z", + "author_association": "NONE", + "body": "`using args… = Class*, Args...;`\r\nПолучается, что бесплатно получаем конкатенацию ?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/986894254/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/986894867", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-986894867", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 986894867, + "node_id": "IC_kwDOFK7cns460tIT", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T15:40:57Z", + "updated_at": "2021-12-06T15:40:57Z", + "author_association": "NONE", + "body": "`rbegin` же есть для подобного. Да и сделать из него обычный итератор, поколдовав с методом `base`, проблем не составит", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/986894867/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/986967480", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-986967480", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 986967480, + "node_id": "IC_kwDOFK7cns460-24", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T17:01:20Z", + "updated_at": "2021-12-06T17:01:34Z", + "author_association": "NONE", + "body": "> А как таковой имплементировать в `forward_list` без итерации по всем элементам, если у него указатели направлены в одну сторону?\r\n\r\nНемногим сложнее чем `auto before_end = my_list.insert_after(old_iterator,5);`. Только сейчас это приходится делать самому, делая обертку, а можно внедрить на уровне метода\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/986967480/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/986971083", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-986971083", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 986971083, + "node_id": "IC_kwDOFK7cns460_vL", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T17:05:07Z", + "updated_at": "2021-12-06T17:05:07Z", + "author_association": "NONE", + "body": "> А как таковой имплементировать в `forward_list` без итерации по всем элементам, если у него указатели направлены в одну сторону?\r\n\r\nЯ проглядел часть про `forward_list` :)\r\n\r\nНу тут как бы для такого контейнера это возможно реализовать только поддержанием актуального итератора/указателя на последнюю ноду внутри контейнера, но есть ли от этого большой смысл? Не то чтобы `forward_list` - часто используемый контейнер. Кроме того, если так часто в нем требуется доступ к последнему элементу, то может это неподходящий контейнер?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/986971083/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/986975356", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-986975356", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 986975356, + "node_id": "IC_kwDOFK7cns461Ax8", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T17:09:15Z", + "updated_at": "2021-12-06T17:09:15Z", + "author_association": "NONE", + "body": "@GeorgyFirsov имеет смысл, когда не хочется мириться с оверхедом на хранение лишнего указателя. Допустим, когда создается буфер на листе достаточного размера, чтобы сумма всех лишних указателей превышала сотни мегабайт", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/986975356/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987063496", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987063496", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987063496, + "node_id": "IC_kwDOFK7cns461WTI", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T18:50:05Z", + "updated_at": "2021-12-06T18:50:05Z", + "author_association": "NONE", + "body": "> только поддержанием актуального итератора/указателя на последнюю ноду внутри контейнера\r\n\r\nГлубоко не думал, но боюсь, что где-то вылезет O(N): либо в `std::forward_list::splice_after`, либо в удалении элемента по итератору...\r\n\r\n> имеет смысл, когда не хочется мириться с оверхедом на хранение лишнего указателя.\r\n\r\nНакладные расходы на разрежение памяти и последовательный доступ в `std::list`/ `std::forward_list` будут куда больше.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987063496/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987070408", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987070408", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987070408, + "node_id": "IC_kwDOFK7cns461X_I", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T18:55:54Z", + "updated_at": "2021-12-06T18:57:04Z", + "author_association": "NONE", + "body": "> поддержанием актуального итератора/указателя на последнюю ноду внутри контейнера\r\n\r\nЭто, кстати. увеличит размер самого контейнера (`sizeof(std::forward_list)`), а одно из его основных применений -- экономия места для разреженных матриц, т. е. чего-то такого\r\n\r\n```c++\r\nstd::array, 100500> matrix; // большинство пустые\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987070408/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987080580", + "html_url": "https://github.com/cpp-ru/ideas/issues/488#issuecomment-987080580", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/488", + "id": 987080580, + "node_id": "IC_kwDOFK7cns461aeE", + "user": { + "login": "kin4stat", + "id": 26118089, + "node_id": "MDQ6VXNlcjI2MTE4MDg5", + "avatar_url": "https://avatars.githubusercontent.com/u/26118089?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kin4stat", + "html_url": "https://github.com/kin4stat", + "followers_url": "https://api.github.com/users/kin4stat/followers", + "following_url": "https://api.github.com/users/kin4stat/following{/other_user}", + "gists_url": "https://api.github.com/users/kin4stat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kin4stat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kin4stat/subscriptions", + "organizations_url": "https://api.github.com/users/kin4stat/orgs", + "repos_url": "https://api.github.com/users/kin4stat/repos", + "events_url": "https://api.github.com/users/kin4stat/events{/privacy}", + "received_events_url": "https://api.github.com/users/kin4stat/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T19:03:53Z", + "updated_at": "2021-12-06T19:03:53Z", + "author_association": "NONE", + "body": "> `using args… = Class*, Args...;` Получается, что бесплатно получаем конкатенацию ?\r\n\r\nНу можно и так. Даже если бы сделать что-то типа:\r\n```cpp\r\nusing args… = std::concatenate::type...;\r\n```\r\nбудет все равно круто", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987080580/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987087871", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987087871", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987087871, + "node_id": "IC_kwDOFK7cns461cP_", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T19:08:46Z", + "updated_at": "2021-12-06T19:08:46Z", + "author_association": "NONE", + "body": "> Немногим сложнее чем `auto before_end = my_list.insert_after(old_iterator,5);`\r\n\r\nЭто O(N), в данном случае N == 5.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987087871/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987097481", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987097481", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987097481, + "node_id": "IC_kwDOFK7cns461emJ", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T19:14:14Z", + "updated_at": "2021-12-06T19:14:14Z", + "author_association": "NONE", + "body": "> > Немногим сложнее чем `auto before_end = my_list.insert_after(old_iterator,5);`\r\n> \r\n> Это O(N), в данном случае N == 5.\r\n\r\n[Разве?](https://ru.stackoverflow.com/questions/334085/%D0%A1%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8-%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0-%D0%B2-%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987097481/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987133515", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987133515", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987133515, + "node_id": "IC_kwDOFK7cns461nZL", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T19:54:37Z", + "updated_at": "2021-12-06T19:54:37Z", + "author_association": "NONE", + "body": "Да, см. https://en.cppreference.com/w/cpp/container/forward_list/insert_after:\r\n\r\n`iterator insert_after( const_iterator pos, size_type count, const T& value );` | (3) | (since C++11)\r\n-- | -- | --\r\n\r\n### Complexity\r\n1-2) Constant.\r\n**3) Linear in count**\r\n\r\nНужно будет 5 раз продвинуть итератор, чтобы получить итоговую позицию.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987133515/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987145187", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987145187", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987145187, + "node_id": "IC_kwDOFK7cns461qPj", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T20:04:42Z", + "updated_at": "2021-12-06T20:04:42Z", + "author_association": "NONE", + "body": "> Да, см. https://en.cppreference.com/w/cpp/container/forward_list/insert_after:\r\n> \r\n> `iterator insert_after( const_iterator pos, size_type count, const T& value );`\t(3)\t(since C++11)\r\n> ### Complexity\r\n> 1-2) Constant. **3) Linear in count**\r\n> \r\n> Нужно будет 5 раз продвинуть итератор, чтобы получить итоговую позицию.\r\n\r\n0_о\r\n...\r\nЯ же привел пример со вставкой одного элемента.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987145187/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987149404", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987149404", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987149404, + "node_id": "IC_kwDOFK7cns461rRc", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T20:07:35Z", + "updated_at": "2021-12-06T20:07:35Z", + "author_association": "NONE", + "body": "А, пятёрка смутила, думал вы размер так обозначили. Виноват.\r\nНо тогда вопрос остаётся:\r\n\r\n> Только сейчас это приходится делать самому, делая обертку, а можно внедрить на уровне метода\r\n\r\nкак выглядит обёртка над `insert_after`, которая даёт итератор на последний элемент?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987149404/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987162415", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987162415", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987162415, + "node_id": "IC_kwDOFK7cns461ucv", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T20:16:53Z", + "updated_at": "2021-12-06T20:16:53Z", + "author_association": "NONE", + "body": "> А, пятёрка смутила, думал вы размер так обозначили. Виноват. Но тогда вопрос остаётся:\r\n> \r\n> > Только сейчас это приходится делать самому, делая обертку, а можно внедрить на уровне метода\r\n> \r\n> как выглядит обёртка над `insert_after`, которая даёт итератор на последний элемент?\r\n\r\nВы неправильно поняли. Обертка над всем контейнером, которая бы дополнительно хранила указатель(итератор) на последний элемент и который бы обновлялся после вставки/удаления элементов.\r\nУказатель на последний элемент решает 2 проблемы:\r\n1. Дает доступ к последнему элементу сразу (О(1)) для модификации\r\n2. Позволяет вставлять в конец списка через insert_after за О(1)\r\n\r\nПросто мне кажется имеется какой-то архитектурный просчет в том, что итератор на первый элемент есть, а на последний -нет. Есть указатель на \"после последнего\" однако от него нельзя получить доступ к последнему элементу, т.к. не определен `operator-(int distance)` для итератора в forward_list", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987162415/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987180261", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987180261", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987180261, + "node_id": "IC_kwDOFK7cns461yzl", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T20:27:19Z", + "updated_at": "2021-12-06T22:54:06Z", + "author_association": "NONE", + "body": "> Просто мне кажется имеется какой-то архитектурный просчет в том, что итератор на первый элемент есть, а на последний -нет.\r\n\r\nСм. мой предыдущий ответ про разреженные матрицы:\r\nhttps://github.com/cpp-ru/ideas/issues/487#issuecomment-987070408\r\n\r\n> который бы обновлялся после вставки/удаления элементов\r\n\r\nДопустим, вы делаете `splice_after` с некоторой позиции списка A в список B:\r\n\r\n```c++\r\nstd::forward_list a;\r\nstd::forward_list b;\r\nauto it = a.begin();\r\n// ... что-то делаем с it\r\nb.splice_after(b.end(), a, it);\r\n```\r\n\r\nСейчас эта операция O(1).\r\nЕсли нам нужно хранить итератор на последний элемент, то:\r\n- у списка B это будет последний элемент списка A, который можно достать только итерированием от `it` до последнего валидного элемента (линейная сложность)\r\n- у списка A это либо\r\n - `std::prev(it)`, которого в `std::forward_list` нет.\r\n - последний валидный элемент от `a.begin()` (линейная сложность + вы уже потеряли информацию о `a.begin()`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987180261/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987192093", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987192093", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987192093, + "node_id": "IC_kwDOFK7cns4611sd", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T20:43:33Z", + "updated_at": "2021-12-06T20:43:33Z", + "author_association": "NONE", + "body": "> > Просто мне кажется имеется какой-то архитектурный просчет в том, что итератор на первый элемент есть, а на последний -нет.\r\n> \r\n> См. мой предыдущий ответ про разреженные матрицы: [#487 (comment)](https://github.com/cpp-ru/ideas/issues/487#issuecomment-987070408)\r\n> \r\n> > который бы обновлялся после вставки/удаления элементов\r\n> \r\n> Допустим, вы делаете `splice_after` с некоторой позиции списка A в список B:\r\n> \r\n> ```c++\r\n> std::forward_list a;\r\n> std::forward_list b;\r\n> auto it = a.begin();\r\n> // ... что-то делаем с it\r\n> b.splice_after(b.end(), it);\r\n> ```\r\n> \r\n> Сейчас эта операция O(1). Если нам нужно хранить итератор на последний элемент, то:\r\n> \r\n> * у списка B это будет последний элемент списка A, который можно достать только итерированием от `it` до последнего валидного элемента (линейная сложность)\r\n> * у списка A это либо\r\n> \r\n> * `std::prev(it)`, которого в `std::forward_list` нет.\r\n> * последний валидный элемент от `a.begin()` (линейная сложность + вы уже потеряли информацию о `a.begin()`\r\n\r\n1. b.before_end = a.before.end\r\n2. a.before_end = it (Где it это параметр из `b.splice_after(b.end(), it);`)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987192093/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987201718", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987201718", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987201718, + "node_id": "IC_kwDOFK7cns4614C2", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T20:57:12Z", + "updated_at": "2021-12-06T22:44:17Z", + "author_association": "NONE", + "body": "> a.before_end = it (Где it это параметр из b.splice_after(b.end(), it);)\r\n\r\nДа, согласен -- \"первый\" итератор остаётся в исходном контейнере.\r\n\r\n> b.before_end = a.before.end\r\n\r\nНо `a` не является аргументом в `std::forward_list::splice_after`\r\n\r\nПока соглашусь, что действительно выглядит, как отдельный контейнер/обёртка:\r\n- больший размер самого объекта, равный размеру `std::list`.\r\n- наличие `std::before_end()`\r\n- `splice_after` с дополнительным параметром", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987201718/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987300360", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987300360", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987300360, + "node_id": "IC_kwDOFK7cns462QII", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T22:27:11Z", + "updated_at": "2021-12-06T22:27:11Z", + "author_association": "NONE", + "body": "> > a.before_end = it (Где it это параметр из b.splice_after(b.end(), it);)\r\n> \r\n> Да, согласен -- \"первый\" итератор остаётся в исходном контейнере.\r\n> \r\n> > b.before_end = a.before.end\r\n> \r\n> Но `a` не является аргументом в `std::forward_list::splice_after`\r\n> \r\n> Пока соглашусь, что действительно выглядит, как отдельный контейнер/обёртка:\r\n> \r\n> * больший размер самого объекта, равный размеру `std::list`.\r\n> * наличие `std::before_end()`\r\n> * `splice_after` с дополнительным параметром\r\n\r\nВ splice_after есть параметр other - это и есть а", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987300360/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987320136", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-987320136", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 987320136, + "node_id": "IC_kwDOFK7cns462U9I", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-06T22:42:54Z", + "updated_at": "2021-12-06T22:42:54Z", + "author_association": "NONE", + "body": "Да, не выгрузил из головы `insert_after`; ну, тем лучше.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987320136/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987672551", + "html_url": "https://github.com/cpp-ru/ideas/issues/488#issuecomment-987672551", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/488", + "id": 987672551, + "node_id": "IC_kwDOFK7cns463q_n", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-07T08:13:20Z", + "updated_at": "2021-12-07T08:13:20Z", + "author_association": "NONE", + "body": "> Ну можно и так. Даже если бы сделать что-то типа:\r\n> \r\n> ```c++\r\n> using args… = std::concatenate::type...;\r\n> ```\r\n> \r\n> будет все равно круто\r\n\r\nДа, очень часто нужно или склеить паки, или отклеить (pop_back,pop_front). \r\n\r\nА ещё чаще бывает нужно легкочитаемый людьми zip для 2х паков один из которых index_sequence.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/987672551/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988256051", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-988256051", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 988256051, + "node_id": "IC_kwDOFK7cns4655cz", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-07T20:53:24Z", + "updated_at": "2021-12-07T20:53:24Z", + "author_association": "NONE", + "body": "> > a.before_end = it (Где it это параметр из b.splice_after(b.end(), it);)\r\n> \r\n> Да, согласен -- \"первый\" итератор остаётся в исходном контейнере.\r\n> \r\n> > b.before_end = a.before.end\r\n> \r\n> Но `a` не является аргументом в `std::forward_list::splice_after`\r\n> \r\n> Пока соглашусь, что действительно выглядит, как отдельный контейнер/обёртка:\r\n> \r\n> * больший размер самого объекта, равный размеру `std::list`.\r\n> * наличие `std::before_end()`\r\n> * `splice_after` с дополнительным параметром\r\n\r\n@pavelkryukov почему размер равен std::list?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988256051/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988305956", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-988305956", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 988305956, + "node_id": "IC_kwDOFK7cns466Fok", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-07T22:26:13Z", + "updated_at": "2021-12-07T22:26:13Z", + "author_association": "NONE", + "body": "https://godbolt.org/z/W3fMTG7aP\r\n\r\n- `std::forward_list` – одно слово – самый компактный пустой контейнер.\r\n- У `std::list` с некоторых пор появился `__Size`, так что он занимает 3 машинных слова.\r\n- Ваш контейнер будет размером в 2 слова (итератор на начало и на конец), как `std::list` был в C++98. Можно и размер добавить.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988305956/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988327269", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-988327269", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 988327269, + "node_id": "IC_kwDOFK7cns466K1l", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-07T23:07:43Z", + "updated_at": "2021-12-07T23:07:43Z", + "author_association": "NONE", + "body": "> https://godbolt.org/z/W3fMTG7aP\r\n> \r\n> * `std::forward_list` – одно слово – самый компактный пустой контейнер.\r\n> * У `std::list` с некоторых пор появился `__Size`, так что он занимает 3 машинных слова.\r\n> * Ваш контейнер будет размером в 2 слова (итератор на начало и на конец), как `std::list` был в C++98. Можно и размер добавить.\r\n\r\nДа, базовый класс у forward_list имеет лишь поле next(реализация gcc). Я не предлагаю ввести указатель на конечный элемент для каждой ноды(базового класса). Я предлагаю ввести указатель на уровне уже наследника от базового класса - он будет один на весь контейнер", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988327269/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988333662", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-988333662", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 988333662, + "node_id": "IC_kwDOFK7cns466MZe", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-07T23:19:22Z", + "updated_at": "2021-12-07T23:19:58Z", + "author_association": "NONE", + "body": "Я тоже не про ноды говорю, я про корневой элемент. Одно из преимуществ `std::forward_list` состоит в том, что пустые контейнеры получаются самыми маленькими (см. https://github.com/cpp-ru/ideas/issues/487#issuecomment-987070408).\r\n\r\nГде выигрыш в уменьшении размера ноды можно получить, представляю слабо. Если элемент большой, то добавление 1 или 2 указателей несущественно. Если элемент небольшой, куда эффективнее использовать `vector`/`deque`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988333662/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988345407", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-988345407", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 988345407, + "node_id": "IC_kwDOFK7cns466PQ_", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-07T23:41:55Z", + "updated_at": "2021-12-07T23:41:55Z", + "author_association": "NONE", + "body": "> Я тоже не про ноды говорю, я про корневой элемент. Одно из преимуществ `std::forward_list` состоит в том, что пустые контейнеры получаются самыми маленькими (см. [#487 (comment)](https://github.com/cpp-ru/ideas/issues/487#issuecomment-987070408)).\r\n> \r\n> Где выигрыш в уменьшении размера ноды можно получить, представляю слабо. Если элемент большой, то добавление 1 или 2 указателей несущественно. Если элемент небольшой, куда эффективнее использовать `vector`/`deque`.\r\n\r\nЕсли хранится 1000000 элементов с размером 40 байт до будет отжираться 5 Гб + 1 Гб на поля, которые мне не нужны. Использование вектора влечет за собой еще больший объем памяти(1.5 - 2 x size для capacity) для push_back", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988345407/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988362484", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-988362484", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 988362484, + "node_id": "IC_kwDOFK7cns466Tb0", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-08T00:09:51Z", + "updated_at": "2021-12-08T00:09:51Z", + "author_association": "NONE", + "body": "1. Можно привести источник оценки 1.5x-2x для вектора, в особенности учитывая то, что расти он будет посредством `push_back`?\r\n2. Миллион элементов – это всё же мегабайты. Я ожидаю, что выигрыш от экономии будет меньше потерь от нелокального размещения данных в связных списках.\r\n3. Присоединяясь к предыдущим ораторам: было бы неплохо понять, какую задачу вы пытаетесь оптимизировать, зачем вам нужен связный список, а не `std::deque`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988362484/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988374910", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-988374910", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 988374910, + "node_id": "IC_kwDOFK7cns466Wd-", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-08T00:29:18Z", + "updated_at": "2021-12-08T00:29:18Z", + "author_association": "NONE", + "body": "> 1. Можно привести источник оценки 1.5x-2x для вектора, в особенности учитывая то, что расти он будет посредством `push_back`?\r\n> 2. Миллион элементов – это всё же мегабайты. Я ожидаю, что выигрыш от экономии будет меньше потерь от нелокального размещения данных в связных списках.\r\n> 3. Присоединяясь к предыдущим ораторам: было бы неплохо понять, какую задачу вы пытаетесь оптимизировать, зачем вам нужен связный список, а не `std::deque`.\r\n\r\n1. https://github.com/facebook/folly/blob/main/folly/docs/FBVector.md . Вообще зависит от реализации компилятора, но мне кажется это адекватной эмпирической оценкой\r\n2. Да, я ошибся на пару порядков =)\r\n3. Задача - создание эффективного буфера при записи высокочастотных данных. Запись в конец, чтение с начала. deque,vector не эффективны - чтение может быть медленне чем запись(при чтении мы записываем данные на диск) и весь профит от линейного расположения исчезает. Зато не исчезает реалокация элементов в таких контейнерах", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988374910/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988384716", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-988384716", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 988384716, + "node_id": "IC_kwDOFK7cns466Y3M", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-08T00:44:58Z", + "updated_at": "2021-12-08T00:44:58Z", + "author_association": "NONE", + "body": "@pavelkryukov да даже в примере с матрицами - как у них реализована операция конкатенации(A(n x m)+B(n x k)=C(n x (m+k))) тогда? ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/988384716/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/989076279", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-989076279", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 989076279, + "node_id": "IC_kwDOFK7cns469Bs3", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-08T18:31:25Z", + "updated_at": "2021-12-08T18:31:25Z", + "author_association": "NONE", + "body": "> как у них реализована операция конкатенации(A(n x m)+B(n x k)=C(n x (m+k))) тогда?\r\n\r\nЯ эту идею [отсюда](https://stackoverflow.com/a/25473149) почерпнул, пока единственный содержательный ответ на вопрос \"зачем нужен `std::forward_list`?\r\nЕсли большинство списков пустые, то небольших затрат будет пройти каждый от начала к концу. Хотя я думаю, что автору эта операция могла и не требоваться.\r\n\r\n> Использование вектора влечет за собой еще больший объем памяти(1.5 - 2 x size для capacity) для push_back\r\n\r\nЭто не значит. что в любой момент времени `v.capacity() == v.size() * 2`. Удвоение будет происходить только по превышению текущей ёмкости.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/989076279/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/989077995", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-989077995", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 989077995, + "node_id": "IC_kwDOFK7cns469CHr", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-08T18:33:27Z", + "updated_at": "2021-12-08T18:33:27Z", + "author_association": "NONE", + "body": "> чтение может быть медленне чем запись\r\n\r\nВыходит, много звёзд должно сойтись, чтобы этот контейнер оказался предпочтительнее других. Так ли он тогда нужен в стандарте?\r\nВ `std-proposals` обычно советуют в таких случаях этот контейнер имплементировать на должном уровне и попытаться встроить в Boost.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/989077995/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/991315235", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-991315235", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 991315235, + "node_id": "IC_kwDOFK7cns47FkUj", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-10T21:42:19Z", + "updated_at": "2021-12-10T21:42:19Z", + "author_association": "NONE", + "body": "Вот, [что-то](https://github.com/pavelkryukov/forward_list2) получается.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/991315235/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/991651220", + "html_url": "https://github.com/cpp-ru/ideas/issues/487#issuecomment-991651220", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "id": 991651220, + "node_id": "IC_kwDOFK7cns47G2WU", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-11T13:51:32Z", + "updated_at": "2021-12-11T13:51:32Z", + "author_association": "NONE", + "body": "Похоже, `before_end()` сможет вернуть только `const_iterator`.\r\n\r\nДан список: `std::forward_list list{1, 2, 3, 4, 5, 8};`.\r\n`before_end` указывает на последний элемент (8).\r\n\r\nЗадача: удалить последний элемент через *[iterator erase_after(const_iterator pos)](https://en.cppreference.com/w/cpp/container/forward_list/erase_after)*.\r\nДля этого сделаем `pos`, указывающий на предпоследний элемент (5).\r\n\r\nУбедимся, что удаляем последний элемент, сравнив результат `erase_after` с `end()`.\r\nВ этом случае нужно присвоить `before_end = pos`, но последний по сигнатуре STL константый.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/991651220/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1000871682", + "html_url": "https://github.com/cpp-ru/ideas/issues/492#issuecomment-1000871682", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/492", + "id": 1000871682, + "node_id": "IC_kwDOFK7cns47qBcC", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-24T15:17:06Z", + "updated_at": "2021-12-24T15:17:06Z", + "author_association": "NONE", + "body": "Да, ошибка весьма распространенная. Подобное улучшение языка было бы весьма полезным.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1000871682/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001071153", + "html_url": "https://github.com/cpp-ru/ideas/issues/492#issuecomment-1001071153", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/492", + "id": 1001071153, + "node_id": "IC_kwDOFK7cns47qyIx", + "user": { + "login": "b2soft", + "id": 6034932, + "node_id": "MDQ6VXNlcjYwMzQ5MzI=", + "avatar_url": "https://avatars.githubusercontent.com/u/6034932?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/b2soft", + "html_url": "https://github.com/b2soft", + "followers_url": "https://api.github.com/users/b2soft/followers", + "following_url": "https://api.github.com/users/b2soft/following{/other_user}", + "gists_url": "https://api.github.com/users/b2soft/gists{/gist_id}", + "starred_url": "https://api.github.com/users/b2soft/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/b2soft/subscriptions", + "organizations_url": "https://api.github.com/users/b2soft/orgs", + "repos_url": "https://api.github.com/users/b2soft/repos", + "events_url": "https://api.github.com/users/b2soft/events{/privacy}", + "received_events_url": "https://api.github.com/users/b2soft/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-25T20:45:38Z", + "updated_at": "2021-12-25T20:45:38Z", + "author_association": "NONE", + "body": "> Да, ошибка весьма распространенная. Подобное улучшение языка было бы весьма полезным.\r\n\r\nРанее в одном из Телеграм чатов по С++ с Антоном обсуждали такое предложение (поверхностно), но не смогли придумать хорошую формулировку. Возможно, сейчас получится :)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001071153/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001136090", + "html_url": "https://github.com/cpp-ru/ideas/issues/492#issuecomment-1001136090", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/492", + "id": 1001136090, + "node_id": "IC_kwDOFK7cns47rB_a", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-26T09:16:16Z", + "updated_at": "2021-12-26T09:16:16Z", + "author_association": "NONE", + "body": "Есть много спорных моментов в языке, без которых C++ был бы проще в разработке и поддержке менее квалифицированными разработчиками.\r\n\r\nУ меня похожее предложение #476, суть которого даже объяснить не каждому получается. В тоже время этот UB я встречал на каждом из проектов.\r\n\r\nВозможно, эти части стандарта упрощали разработку компилятора или потребление его ресурсов, но в современных реалиях они слишком удорожают разработку, усложняют кривую обучения и формируют некачественную репутацию языку.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001136090/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001137000", + "html_url": "https://github.com/cpp-ru/ideas/issues/476#issuecomment-1001137000", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/476", + "id": 1001137000, + "node_id": "IC_kwDOFK7cns47rCNo", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-26T09:24:31Z", + "updated_at": "2021-12-26T09:24:45Z", + "author_association": "NONE", + "body": "> Совместимость же поломает\r\n\r\nЕсли оставить текущее поведение для trivially_destructible классов то будет лишь избавление от UB для всех остальных случаев.\r\n\r\nВ тоже время, тогда останется поведение, которое дискредитирует RAII паттерн тем, что всегда есть путь для невызова деструктора класса.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001137000/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001162998", + "html_url": "https://github.com/cpp-ru/ideas/issues/486#issuecomment-1001162998", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/486", + "id": 1001162998, + "node_id": "IC_kwDOFK7cns47rIj2", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-26T11:45:34Z", + "updated_at": "2021-12-26T11:46:56Z", + "author_association": "NONE", + "body": "Как я понимаю, проблема такая - есть два разных типа данных (в смысле что один тип не является алиасом другого), и надо сделать две вещи:\r\n\r\n1) Удостовериться, что у них одинаковый layout в памяти\r\n2) Делать \"быстро\" вещи, которые сейчас делаются \"медленно\" (например, создание нового вектора и ручное заполнение вместо `std::move(x)`)\r\n\r\nПервый пункт в C++XX можно будет выполнить через рефлексию - сравнить количество членов структуры и их типы. Даже не обязательно для POD-типов, можно рекурсивно проверять состав \"сложных\" типов.\r\n\r\nВторой пункт можно выполнить полу-нелегальным образом - как я подозреваю, `std::vector` и `std::vector` имеют идентичное представление на стеке и в куче. Поэтому можно будет сделать псевдо-move, скопировав значение стека, как-то так:\r\n```\r\nstd::vector v1 = ...; // как-то заполняем...\r\n\r\nstd::vector v2;\r\nstd::memcpy(&v2, &v1, sizeof(decltype(v1));\r\n// теперь надо как-то сделать амнезию у v1, чтобы он в деструкторе ничего не трогал\r\n// возможно std::memset(&v1, 0, sizeof(decltype(v1));\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001162998/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001175648", + "html_url": "https://github.com/cpp-ru/ideas/issues/476#issuecomment-1001175648", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/476", + "id": 1001175648, + "node_id": "IC_kwDOFK7cns47rLpg", + "user": { + "login": "xaizek", + "id": 459736, + "node_id": "MDQ6VXNlcjQ1OTczNg==", + "avatar_url": "https://avatars.githubusercontent.com/u/459736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/xaizek", + "html_url": "https://github.com/xaizek", + "followers_url": "https://api.github.com/users/xaizek/followers", + "following_url": "https://api.github.com/users/xaizek/following{/other_user}", + "gists_url": "https://api.github.com/users/xaizek/gists{/gist_id}", + "starred_url": "https://api.github.com/users/xaizek/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/xaizek/subscriptions", + "organizations_url": "https://api.github.com/users/xaizek/orgs", + "repos_url": "https://api.github.com/users/xaizek/repos", + "events_url": "https://api.github.com/users/xaizek/events{/privacy}", + "received_events_url": "https://api.github.com/users/xaizek/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-26T12:48:42Z", + "updated_at": "2021-12-26T12:48:42Z", + "author_association": "NONE", + "body": "> Если оставить текущее поведение для trivially_destructible классов то будет лишь избавление от UB для всех остальных случаев.\r\n\r\nТак для определения того, что класс является trivially_destructible, нужно видеть его объявление. Ну и я не про то, что совместимость не надо ломать, а про то, что стоит узнать сколько кода это сломает. К предложению отнесутся более серьёзно, если сказать \"успешно собрал кучу кода с -Werror=delete-incomplete\" (может есть какой-то простой способ сделать это в nix, например).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001175648/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001180284", + "html_url": "https://github.com/cpp-ru/ideas/issues/493#issuecomment-1001180284", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/493", + "id": 1001180284, + "node_id": "IC_kwDOFK7cns47rMx8", + "user": { + "login": "xaizek", + "id": 459736, + "node_id": "MDQ6VXNlcjQ1OTczNg==", + "avatar_url": "https://avatars.githubusercontent.com/u/459736?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/xaizek", + "html_url": "https://github.com/xaizek", + "followers_url": "https://api.github.com/users/xaizek/followers", + "following_url": "https://api.github.com/users/xaizek/following{/other_user}", + "gists_url": "https://api.github.com/users/xaizek/gists{/gist_id}", + "starred_url": "https://api.github.com/users/xaizek/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/xaizek/subscriptions", + "organizations_url": "https://api.github.com/users/xaizek/orgs", + "repos_url": "https://api.github.com/users/xaizek/repos", + "events_url": "https://api.github.com/users/xaizek/events{/privacy}", + "received_events_url": "https://api.github.com/users/xaizek/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-26T13:27:24Z", + "updated_at": "2021-12-26T13:27:24Z", + "author_association": "NONE", + "body": "Помню на подкасте Гор Нишанов прямо гордился тем, что в отличии от C они запретили инициализировать поля в неправильном порядке или не в полном объёме. Но он не объяснял, что в этом хорошего. Возможно то, что это позволяет после проверки на фронте просто выкинуть `.name = ` и компилировать код как до C++20 (если нет никаких изменений с порядком инициализации).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001180284/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001191846", + "html_url": "https://github.com/cpp-ru/ideas/issues/493#issuecomment-1001191846", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/493", + "id": 1001191846, + "node_id": "IC_kwDOFK7cns47rPmm", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-26T14:32:44Z", + "updated_at": "2021-12-26T14:32:44Z", + "author_association": "NONE", + "body": "По стандарту можно опускать инициализацию промежуточных элементов.\r\nПоэтому просто отбросить на фронте- не выйдет, потому что будет неопределенность. С другой стороны, всё идёт к тому, что фронт у майкрософта будет только на клэнге и всё равно сможет переварить нестандартный синтаксис.\r\n\r\nИнтересно послушать аргументацию почему Гор считает что как в С - плохо. С моей стороны, ценность этой фичи при строгом порядке - сильно девальвирует именно из за цены поддержки и невозможности декларативно описывать классы.\r\n\r\nТот же список инициализации конструктора не требует строгого порядка, но в тоже время инициализирует объекты согласно порядка обьявления.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001191846/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001587232", + "html_url": "https://github.com/cpp-ru/ideas/issues/489#issuecomment-1001587232", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/489", + "id": 1001587232, + "node_id": "IC_kwDOFK7cns47swIg", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-27T14:11:10Z", + "updated_at": "2021-12-27T14:11:36Z", + "author_association": "NONE", + "body": "У этой задачи слишком много возможных решений с разными трейдоффами, чтобы дать Единственно Правильное. Если длина строки `n`, длина паттерна `m`, например:\r\n\r\n- простой перебор, память `O(1)`, время `O(n*m)`\r\n- [алгоритм Рабина-Карпа](http://e-maxx.ru/algo/rabin_karp), память вроде бы `O(m)`, время `O(n+m)`\r\n- [z-функция](http://e-maxx.ru/algo/z_function), память `O(n+m)`, время `O(n+m)`\r\n- [префикс-функция](http://e-maxx.ru/algo/prefix_function), память `O(n+m)`, время `O(n+m)`\r\n\r\nЕсли сделать простой перебор, то это мало кому понравится. А в \"быстрых\" алгоритмах надо откуда-то взять память.\r\n\r\n\\+ непонятно, считать ли за \"вхождение\" перекрывающиеся строки, т.е.\r\n```\r\n\"ababa\".count(\"aba\"); // вернет 1 или 2?\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1001587232/reactions", + "total_count": 4, + "+1": 4, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1003366260", + "html_url": "https://github.com/cpp-ru/ideas/issues/494#issuecomment-1003366260", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/494", + "id": 1003366260, + "node_id": "IC_kwDOFK7cns47zid0", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-31T12:35:13Z", + "updated_at": "2021-12-31T12:35:13Z", + "author_association": "NONE", + "body": "Можно разжаловать `requires` из группы `keywords` в группу `identifiers with special meaning`, судя по описанию это то что нужно\r\n\r\nhttps://en.cppreference.com/w/cpp/keyword", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1003366260/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1003421677", + "html_url": "https://github.com/cpp-ru/ideas/issues/494#issuecomment-1003421677", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/494", + "id": 1003421677, + "node_id": "IC_kwDOFK7cns47zv_t", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2021-12-31T17:18:43Z", + "updated_at": "2021-12-31T17:18:43Z", + "author_association": "NONE", + "body": "В отличие от override/final/module/import `requires` используется в тех местах, где может встречаться обычный идентификатор, поэтому его нельзя сделать контекстно-зависимым.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1003421677/reactions", + "total_count": 2, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 2, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1003490589", + "html_url": "https://github.com/cpp-ru/ideas/issues/421#issuecomment-1003490589", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/421", + "id": 1003490589, + "node_id": "IC_kwDOFK7cns470A0d", + "user": { + "login": "marakew", + "id": 3596295, + "node_id": "MDQ6VXNlcjM1OTYyOTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/3596295?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/marakew", + "html_url": "https://github.com/marakew", + "followers_url": "https://api.github.com/users/marakew/followers", + "following_url": "https://api.github.com/users/marakew/following{/other_user}", + "gists_url": "https://api.github.com/users/marakew/gists{/gist_id}", + "starred_url": "https://api.github.com/users/marakew/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/marakew/subscriptions", + "organizations_url": "https://api.github.com/users/marakew/orgs", + "repos_url": "https://api.github.com/users/marakew/repos", + "events_url": "https://api.github.com/users/marakew/events{/privacy}", + "received_events_url": "https://api.github.com/users/marakew/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-01T02:54:40Z", + "updated_at": "2022-01-01T02:54:40Z", + "author_association": "NONE", + "body": "только хотел спросит а есть ли какой пропозл в комитете для этого...\r\nтоже надоело писать эти using алиясы\r\n\r\nтак что по итогу, двигается идея или заглохла ?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1003490589/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1003582234", + "html_url": "https://github.com/cpp-ru/ideas/issues/268#issuecomment-1003582234", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/268", + "id": 1003582234, + "node_id": "IC_kwDOFK7cns470XMa", + "user": { + "login": "marakew", + "id": 3596295, + "node_id": "MDQ6VXNlcjM1OTYyOTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/3596295?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/marakew", + "html_url": "https://github.com/marakew", + "followers_url": "https://api.github.com/users/marakew/followers", + "following_url": "https://api.github.com/users/marakew/following{/other_user}", + "gists_url": "https://api.github.com/users/marakew/gists{/gist_id}", + "starred_url": "https://api.github.com/users/marakew/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/marakew/subscriptions", + "organizations_url": "https://api.github.com/users/marakew/orgs", + "repos_url": "https://api.github.com/users/marakew/repos", + "events_url": "https://api.github.com/users/marakew/events{/privacy}", + "received_events_url": "https://api.github.com/users/marakew/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-01T16:38:21Z", + "updated_at": "2022-01-01T16:38:21Z", + "author_association": "NONE", + "body": "опять заглохло\r\n\r\nзначит принять корутины без имплементации в библиотеке можно было\r\n\r\nа принять нетворкинг без экзекуторов, которые на секундочку интерфейсом не привязан к интерфейсу экзекуторов - значит нельзя ?\r\n\r\nмне кажется в комитете кто то занимается саботажем\r\n\r\nможно где то увидеть расшифровку того с чем именно не согласны в интерфейсе экзекуторов ?\r\nна публику просачиваются только сухие результаты голосования, за против воздержавшиеся", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1003582234/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1003637304", + "html_url": "https://github.com/cpp-ru/ideas/issues/369#issuecomment-1003637304", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/369", + "id": 1003637304, + "node_id": "IC_kwDOFK7cns470ko4", + "user": { + "login": "marakew", + "id": 3596295, + "node_id": "MDQ6VXNlcjM1OTYyOTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/3596295?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/marakew", + "html_url": "https://github.com/marakew", + "followers_url": "https://api.github.com/users/marakew/followers", + "following_url": "https://api.github.com/users/marakew/following{/other_user}", + "gists_url": "https://api.github.com/users/marakew/gists{/gist_id}", + "starred_url": "https://api.github.com/users/marakew/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/marakew/subscriptions", + "organizations_url": "https://api.github.com/users/marakew/orgs", + "repos_url": "https://api.github.com/users/marakew/repos", + "events_url": "https://api.github.com/users/marakew/events{/privacy}", + "received_events_url": "https://api.github.com/users/marakew/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-01T23:48:14Z", + "updated_at": "2022-01-01T23:48:14Z", + "author_association": "NONE", + "body": "это идея slice из питона\r\nhttps://github.com/cpp-ru/ideas/issues/91", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1003637304/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1004246199", + "html_url": "https://github.com/cpp-ru/ideas/issues/91#issuecomment-1004246199", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/91", + "id": 1004246199, + "node_id": "IC_kwDOFK7cns4725S3", + "user": { + "login": "marakew", + "id": 3596295, + "node_id": "MDQ6VXNlcjM1OTYyOTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/3596295?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/marakew", + "html_url": "https://github.com/marakew", + "followers_url": "https://api.github.com/users/marakew/followers", + "following_url": "https://api.github.com/users/marakew/following{/other_user}", + "gists_url": "https://api.github.com/users/marakew/gists{/gist_id}", + "starred_url": "https://api.github.com/users/marakew/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/marakew/subscriptions", + "organizations_url": "https://api.github.com/users/marakew/orgs", + "repos_url": "https://api.github.com/users/marakew/repos", + "events_url": "https://api.github.com/users/marakew/events{/privacy}", + "received_events_url": "https://api.github.com/users/marakew/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-03T17:33:53Z", + "updated_at": "2022-01-03T17:33:53Z", + "author_association": "NONE", + "body": "вообщем то не понятно\r\nпочему \r\nhttps://wg21.link/p2128/github\r\nMultidimensional subscript operator. This allows the [] operator to take multiple arguments (e.g. matrix[i, j])\r\n\r\nэто хорошо\r\n\r\nа добавить доп перегрузку по двоеточию [::] это плохо\r\nпотому что даже ranges сейчас для слайсов не очень красиво и элегантно выглядят\r\n\r\nможет кто то попробует рядом с тем же пропозлом и этот пропозл протащить ?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1004246199/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1004299309", + "html_url": "https://github.com/cpp-ru/ideas/issues/268#issuecomment-1004299309", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/268", + "id": 1004299309, + "node_id": "IC_kwDOFK7cns473GQt", + "user": { + "login": "marakew", + "id": 3596295, + "node_id": "MDQ6VXNlcjM1OTYyOTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/3596295?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/marakew", + "html_url": "https://github.com/marakew", + "followers_url": "https://api.github.com/users/marakew/followers", + "following_url": "https://api.github.com/users/marakew/following{/other_user}", + "gists_url": "https://api.github.com/users/marakew/gists{/gist_id}", + "starred_url": "https://api.github.com/users/marakew/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/marakew/subscriptions", + "organizations_url": "https://api.github.com/users/marakew/orgs", + "repos_url": "https://api.github.com/users/marakew/repos", + "events_url": "https://api.github.com/users/marakew/events{/privacy}", + "received_events_url": "https://api.github.com/users/marakew/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-03T19:13:41Z", + "updated_at": "2022-01-03T19:13:41Z", + "author_association": "NONE", + "body": "вкратце удалось нагуглить такое\r\n\r\n>https://isocpp.org/files/papers/P2464R0.html\r\n>A P0443 executor is not an executor. It's a work-submitter.\r\n>https://wg21.link/p0443r9\r\n\r\nя считаю это просто чудесно\r\nчуваки убили 2 года на экзекуторы\r\nи вдруг выходит на сцену какой то чел \r\nвникает наконец то в то что же это такое экзекуторы\r\nи заявляет что прорабатываемые экзекуторы это не экзекуторы, это воркеры\r\nа в стандарте нужны экзекуторы для того что бы утвердить нетворкинг\r\n\r\nэто пять\r\n\r\nтеперь чуваки вкалывают над https://wg21.link/p2300r3\r\nно кого то все равно что то не устраивает\r\nи вот что конкретно не устраивает, пока не нахожу\r\nесть инсайд инфа ?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1004299309/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1004311342", + "html_url": "https://github.com/cpp-ru/ideas/issues/268#issuecomment-1004311342", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/268", + "id": 1004311342, + "node_id": "IC_kwDOFK7cns473JMu", + "user": { + "login": "marakew", + "id": 3596295, + "node_id": "MDQ6VXNlcjM1OTYyOTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/3596295?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/marakew", + "html_url": "https://github.com/marakew", + "followers_url": "https://api.github.com/users/marakew/followers", + "following_url": "https://api.github.com/users/marakew/following{/other_user}", + "gists_url": "https://api.github.com/users/marakew/gists{/gist_id}", + "starred_url": "https://api.github.com/users/marakew/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/marakew/subscriptions", + "organizations_url": "https://api.github.com/users/marakew/orgs", + "repos_url": "https://api.github.com/users/marakew/repos", + "events_url": "https://api.github.com/users/marakew/events{/privacy}", + "received_events_url": "https://api.github.com/users/marakew/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-03T19:36:41Z", + "updated_at": "2022-01-04T21:31:41Z", + "author_association": "NONE", + "body": "полистав P2300, это очередной опус facepalm\r\nчуваки пытаются скрестить threadpool+future+promise, накрутить сверху пейплайн как это любит ерик ниeблер и назвать это правильными экзекуторами\r\nа по факту кто то хочет пролоббировать libunifex в стандарт", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1004311342/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1005321550", + "html_url": "https://github.com/cpp-ru/ideas/issues/482#issuecomment-1005321550", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/482", + "id": 1005321550, + "node_id": "IC_kwDOFK7cns476_1O", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-05T02:11:20Z", + "updated_at": "2022-01-05T02:11:34Z", + "author_association": "NONE", + "body": "На самом деле эту тему переиграли и вроде как рефлексию собираются делать через constexpr-объекты, а не шаблоны. Я написал что и где, возможно надо будет пересмотреть идею (?)\r\nhttps://habr.com/ru/post/598981/\r\n\r\nА так - можно сделать вагон крутых идей, но неясно, дойдёт ли это до SG7. У меня такое ощущение, что эту лямку Andrew Sutton тянет чуть ли не в соло.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1005321550/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1005571637", + "html_url": "https://github.com/cpp-ru/ideas/issues/491#issuecomment-1005571637", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/491", + "id": 1005571637, + "node_id": "IC_kwDOFK7cns477841", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-05T10:39:22Z", + "updated_at": "2022-01-05T10:39:22Z", + "author_association": "NONE", + "body": "https://cplusplus.github.io/LWG/issue3088", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1005571637/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1006817526", + "html_url": "https://github.com/cpp-ru/ideas/issues/491#issuecomment-1006817526", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/491", + "id": 1006817526, + "node_id": "IC_kwDOFK7cns48AtD2", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-06T18:27:56Z", + "updated_at": "2022-01-06T18:27:56Z", + "author_association": "NONE", + "body": "В GCC отправил патч: https://github.com/gcc-mirror/gcc/commit/52ebc2be0990d6d3a46bb716164f9cef6f661021", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1006817526/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1008304117", + "html_url": "https://github.com/cpp-ru/ideas/issues/492#issuecomment-1008304117", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/492", + "id": 1008304117, + "node_id": "IC_kwDOFK7cns48GX_1", + "user": { + "login": "DymOK93", + "id": 66731516, + "node_id": "MDQ6VXNlcjY2NzMxNTE2", + "avatar_url": "https://avatars.githubusercontent.com/u/66731516?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DymOK93", + "html_url": "https://github.com/DymOK93", + "followers_url": "https://api.github.com/users/DymOK93/followers", + "following_url": "https://api.github.com/users/DymOK93/following{/other_user}", + "gists_url": "https://api.github.com/users/DymOK93/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DymOK93/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DymOK93/subscriptions", + "organizations_url": "https://api.github.com/users/DymOK93/orgs", + "repos_url": "https://api.github.com/users/DymOK93/repos", + "events_url": "https://api.github.com/users/DymOK93/events{/privacy}", + "received_events_url": "https://api.github.com/users/DymOK93/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-09T14:03:58Z", + "updated_at": "2022-01-09T14:03:58Z", + "author_association": "NONE", + "body": "В голову пришёл интересный случай: локальный объект имеет неявный каст к `Ty&` и возвращает ссылку на некоторое содержимого, хранящееся не в самом объекте. С учётом невозможности полноценного анализа lifetime в современном C++ получим множество false-positive.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1008304117/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1008323334", + "html_url": "https://github.com/cpp-ru/ideas/issues/492#issuecomment-1008323334", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/492", + "id": 1008323334, + "node_id": "IC_kwDOFK7cns48GcsG", + "user": { + "login": "b2soft", + "id": 6034932, + "node_id": "MDQ6VXNlcjYwMzQ5MzI=", + "avatar_url": "https://avatars.githubusercontent.com/u/6034932?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/b2soft", + "html_url": "https://github.com/b2soft", + "followers_url": "https://api.github.com/users/b2soft/followers", + "following_url": "https://api.github.com/users/b2soft/following{/other_user}", + "gists_url": "https://api.github.com/users/b2soft/gists{/gist_id}", + "starred_url": "https://api.github.com/users/b2soft/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/b2soft/subscriptions", + "organizations_url": "https://api.github.com/users/b2soft/orgs", + "repos_url": "https://api.github.com/users/b2soft/repos", + "events_url": "https://api.github.com/users/b2soft/events{/privacy}", + "received_events_url": "https://api.github.com/users/b2soft/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-09T15:52:56Z", + "updated_at": "2022-01-09T15:52:56Z", + "author_association": "NONE", + "body": "> В голову пришёл интересный случай: локальный объект имеет неявный каст к `Ty&` и возвращает ссылку на некоторое содержимого, хранящееся не в самом объекте. С учётом невозможности полноценного анализа lifetime в современном C++ получим множество false-positive.\r\n\r\nА можно пример какой-то минимальный-реалистичный?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1008323334/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1008325794", + "html_url": "https://github.com/cpp-ru/ideas/issues/492#issuecomment-1008325794", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/492", + "id": 1008325794, + "node_id": "IC_kwDOFK7cns48GdSi", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-09T16:03:59Z", + "updated_at": "2022-01-09T16:03:59Z", + "author_association": "NONE", + "body": "я так понял что предложение только про локальные переменные? а мемберы - это уже вне скоупа ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1008325794/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1008329569", + "html_url": "https://github.com/cpp-ru/ideas/issues/492#issuecomment-1008329569", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/492", + "id": 1008329569, + "node_id": "IC_kwDOFK7cns48GeNh", + "user": { + "login": "b2soft", + "id": 6034932, + "node_id": "MDQ6VXNlcjYwMzQ5MzI=", + "avatar_url": "https://avatars.githubusercontent.com/u/6034932?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/b2soft", + "html_url": "https://github.com/b2soft", + "followers_url": "https://api.github.com/users/b2soft/followers", + "following_url": "https://api.github.com/users/b2soft/following{/other_user}", + "gists_url": "https://api.github.com/users/b2soft/gists{/gist_id}", + "starred_url": "https://api.github.com/users/b2soft/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/b2soft/subscriptions", + "organizations_url": "https://api.github.com/users/b2soft/orgs", + "repos_url": "https://api.github.com/users/b2soft/repos", + "events_url": "https://api.github.com/users/b2soft/events{/privacy}", + "received_events_url": "https://api.github.com/users/b2soft/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-09T16:21:00Z", + "updated_at": "2022-01-09T16:21:00Z", + "author_association": "NONE", + "body": "Да, речь про локальные переменные. Отслеживать мемберов проблематично, конечно, без лайфтайм системы.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1008329569/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1009266461", + "html_url": "https://github.com/cpp-ru/ideas/issues/498#issuecomment-1009266461", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/498", + "id": 1009266461, + "node_id": "IC_kwDOFK7cns48KC8d", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-10T19:23:04Z", + "updated_at": "2022-01-10T19:23:04Z", + "author_association": "MEMBER", + "body": "Есть библиотека, которую начинали стандартизировать https://github.com/lewissbaker/cppcoro\r\n\r\nЕсть несколько альтернативных библиотек, например https://github.com/David-Haim/concurrencpp\r\n\r\nЕсли действительно готовы взяться за идею и довести её до конца, то стоит начать с изучения предложений от Lewiss Baker и описания того, как улучшить его наработки.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1009266461/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1009846784", + "html_url": "https://github.com/cpp-ru/ideas/issues/498#issuecomment-1009846784", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/498", + "id": 1009846784, + "node_id": "IC_kwDOFK7cns48MQoA", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-11T10:57:35Z", + "updated_at": "2022-01-11T10:57:35Z", + "author_association": "NONE", + "body": "> Есть библиотека, которую начинали стандартизировать https://github.com/lewissbaker/cppcoro\r\n\r\nК сожалению она не выглядит как поддерживаемая на данный момент. Там очень много смелых идей, скажем fmap внутри генератора, но сейчас по сути std::views::transform, аналогично наработки cancellation token/ source, которые теперь std::stop_source/ std::stop_token, то есть многие вещи устарели\r\nИли скажем \"концепт\" awaiter из cppcoro\r\n```cpp\r\ntemplate\r\nstruct is_awaiter().await_ready()),\r\n\tdecltype(std::declval().await_suspend(std::declval>())),\r\n\tdecltype(std::declval().await_resume())>> :\r\n\t\tstd::conjunction<\r\n\t\tstd::is_constructible().await_ready())>,\r\n\t\tdetail::is_valid_await_suspend_return_value<\r\n\t\t\tdecltype(std::declval().await_suspend(std::declval>()))>>\r\n{};\r\n```\r\nПросто нерабочий, т.к. фактически запрещает awaiter принимать в await_suspend любой тип кроме std::coroutine_handle\\ (неявная конвертация есть только в одну сторону, плюс возможны ситуации где используются методы, которых нет в std::coroutine_handle\\ или стоит requires, отсекающий \\ специализацию и т.д.(эта же проблема есть в пропозале task от Гора Нишанова, не знаю исправлена ли она сейчас) )\r\ncppcoro также практически не предоставляет никаких инструментов для написания своих корутин, даже внутри библиотеки каждый из типов корутин описан индивидуально с нуля, не поддержаны аллокаторы / memory resources. В целом cppcoro выглядит как набор смелых идей, но не проглядывается общей концепции и системного подхода, скажем async_generator\\, (пример из cppcoro):\r\n```cpp\r\n\r\ncppcoro::async_generator ticker(int count, threadpool& tp)\r\n{\r\n for (int i = 0; i < count; ++i)\r\n {\r\n co_await tp.delay(std::chrono::seconds(1));\r\n co_yield i;\r\n }\r\n}\r\n\r\ncppcoro::task<> consumer(threadpool& tp)\r\n{\r\n auto sequence = ticker(10, tp);\r\n for co_await(std::uint32_t i : sequence)\r\n {\r\n std::cout << \"Tick \" << i << std::endl;\r\n }\r\n}\r\n```\r\n\r\nЛично я не вижу причин делать это вообще асинхронной операцией, если оба потока вынуждены друг друга ждать в итоге, а как использовать этот генератор иначе - непонятно.\r\nС другой стороны можно было бы представить библиотеку, которая даёт базу для создания прикладных корутин и я наследуясь от базовой корутины лишь доопределяю один await_transform для того чтобы действительно безопасно и удобно делать yield в нужный мне контейнер.\r\nИ нет, с async_generator так не получится, т.к. тип корутины состоит из двух типов - промиса и типа-владельца, промолчу уж про возможную поломку внутренней логики при шадоувинге методов промиса. Придётся переписывать всё с нуля.\r\n\r\nТакже я смотрел предложения по std::generator, главные претензии к нему - неявные для пользователя крайне костыльные шаблонные аргументы, тайп ерейз для поддержки аллокаторов, требование именно аллокатора, хотя в данной ситуации требования явно должны быть меньше, проблемы с ссылками.\r\nГлавное, что все эти проблемы выдуманные. Они все решаемы.\r\nДекларация моего генератора:\r\n```cpp\r\ntemplate >\r\nstruct generator;\r\n```\r\nясные для пользователя шаблонные аргументы, никакого тайп ерайза, 0 оверхеда на аллокации, если аллокатор stateless(то есть мы не платим за то, чего не используем), никаких проблем с ссылками, потому что значения не \"выбрасываются\" из генератора, а \"показываются\", то есть при co_yield Lvalue; потребителю будет показываться именно этот объект lvalue, а при co_yield Rvalue; создаваться объект и хранится до следующего пробуждения генератора, при этом on consumer side это всегда выглядит как взаимодействие с lvalue, у этого есть множество интересных применений, это снижает оверхед и вероятность вылетания исключения(для lvalue очевидно всегда noexcept), а также позволяет создавать генераторы ссылок без каких либо странных вещей и проблем с лайфтаймами. Можно сделать из генератора хранилище, почему нет?\r\n```cpp\r\ngenerator ViewGenerator() {\r\n\tint x = 1;\r\n\tint y = 2;\r\n\twhile (x < 100) {\r\n\t\tco_yield ++x;\r\n\t\tco_yield y;\r\n\t}\r\n}\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1009846784/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1010690141", + "html_url": "https://github.com/cpp-ru/ideas/issues/499#issuecomment-1010690141", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/499", + "id": 1010690141, + "node_id": "IC_kwDOFK7cns48Pehd", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-12T06:41:44Z", + "updated_at": "2022-01-12T06:41:44Z", + "author_association": "MEMBER", + "body": "Идея очень интересная и заманчивая. Вот только template/typename нужны чтобы парсер/лексер правильно понимали C++. А парсеры как правило достаточно простые и работают с выражением до `;`, зачастую не понимая семантику. На этом уровне зачастую нет приемлемого для парсинга стейта в котором хранятся данные по концептам.\r\n\r\nНужен прототип, который покажет что затраты на оперативную память не возрастают, что компиляция не замедляется, и что реализовать подобное не очень трудозатратно.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1010690141/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1010807609", + "html_url": "https://github.com/cpp-ru/ideas/issues/499#issuecomment-1010807609", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/499", + "id": 1010807609, + "node_id": "IC_kwDOFK7cns48P7M5", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-12T09:02:19Z", + "updated_at": "2022-01-12T10:10:31Z", + "author_association": "NONE", + "body": "> Вот только template/typename нужны чтобы парсер/лексер правильно понимали C++\r\n\r\nДа, разумеется, но всё же они знают о декларации некого типа/концепта, по сути компилятору для каждого концепта нужно изобрести тип а также все связанные с этим типом(созданные внутри концепта) специализации и т.д. с _ожидаемыми_ операциями(для них будет известно что это, typename/template и т.д.) и _запрещёнными_ операциями(похоже на = delete)\r\nНапример\r\n```cpp\r\ntemplate\r\nconcept have_no_foo = !requires(std::vector foo) {\r\n\tfoo.break_compilation(5);\r\n};\r\ntemplate\r\nint foo(std::vector vec) {\r\n\tvec.break_compilation(5);\r\n}\r\n```\r\nКомпилятор в точке определения have_no_foo должен изобрести have_no_fooT и специализацию std::vector, в которой _запрещен_ вызов функции break_compilation(int) и выдать ошибку компиляции, после увиденного вызова _запрещённой_ функции\r\nС помощью этого механизма по сути можно ещё и находить ошибки в концептах, когда в них находятся противоречивые условия.\r\n\r\nДля этого правда нужно ещё правила объединения требований из контрентов, то есть при || или && между констрентами требования всегда объединяются, при этом может получится, что один констрент требует чтобы идентификатор обозначал X, а другой контрент требует что идентификатор обозначал Y, тогда при || имя становится просто снова неоднозначным(а не _ожидаемым_), а при && возникает конфликт, приводящий к ошибке компиляции.\r\n\r\nЕсли задуматься, то это эквивалентно наследованию итогового изобретённого типа от двух изобретённых типов констрента А и констрента Б\r\nТо есть для constraintA && / || contraintB\r\n`struct invented_typeAB : invented_typeA, invented_typeB {};` ( с некоторыми небольшими махинациями )\r\n\r\n\r\nСогласен, выглядит не супер легко, но и профиты немаленькие\r\nНапример msvc(интел сенс скорее) уже делает что то похожее(изобретает тип)\r\n![image](https://user-images.githubusercontent.com/58717435/149096723-fda0a134-7c8e-4a1c-8650-2982cc0c964b.png)\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1010807609/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1012791710", + "html_url": "https://github.com/cpp-ru/ideas/issues/500#issuecomment-1012791710", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500", + "id": 1012791710, + "node_id": "IC_kwDOFK7cns48Xfme", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T05:39:07Z", + "updated_at": "2022-01-14T05:39:07Z", + "author_association": "NONE", + "body": "сделать ошибкой то, что не является ошибкой и сломать код, который не является ошибочным? Зачем, можно просто варнинг ввести, да и то не факт что он нужен(раз до сих пор нет)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1012791710/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1012907962", + "html_url": "https://github.com/cpp-ru/ideas/issues/500#issuecomment-1012907962", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500", + "id": 1012907962, + "node_id": "IC_kwDOFK7cns48X7-6", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T08:24:39Z", + "updated_at": "2022-01-14T08:26:22Z", + "author_association": "NONE", + "body": "> clang и gcc не выводят warning на это, всем пофигу \r\n\r\nВ Clang-Tidy есть заброшенная имплементация: https://reviews.llvm.org/D18914", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1012907962/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1012948527", + "html_url": "https://github.com/cpp-ru/ideas/issues/500#issuecomment-1012948527", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500", + "id": 1012948527, + "node_id": "IC_kwDOFK7cns48YF4v", + "user": { + "login": "Gargony", + "id": 9786086, + "node_id": "MDQ6VXNlcjk3ODYwODY=", + "avatar_url": "https://avatars.githubusercontent.com/u/9786086?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Gargony", + "html_url": "https://github.com/Gargony", + "followers_url": "https://api.github.com/users/Gargony/followers", + "following_url": "https://api.github.com/users/Gargony/following{/other_user}", + "gists_url": "https://api.github.com/users/Gargony/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Gargony/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Gargony/subscriptions", + "organizations_url": "https://api.github.com/users/Gargony/orgs", + "repos_url": "https://api.github.com/users/Gargony/repos", + "events_url": "https://api.github.com/users/Gargony/events{/privacy}", + "received_events_url": "https://api.github.com/users/Gargony/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T09:25:20Z", + "updated_at": "2022-01-14T09:25:30Z", + "author_association": "NONE", + "body": "> сделать ошибкой то, что не является ошибкой и сломать код, который не является ошибочным? Зачем, можно просто варнинг ввести, да и то не факт что он нужен(раз до сих пор нет)\r\n\r\nно const на статическом методе даёт ошибку, хотя мы точно не модифицируем объект", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1012948527/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1012951842", + "html_url": "https://github.com/cpp-ru/ideas/issues/500#issuecomment-1012951842", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500", + "id": 1012951842, + "node_id": "IC_kwDOFK7cns48YGsi", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T09:29:46Z", + "updated_at": "2022-01-14T09:29:46Z", + "author_association": "NONE", + "body": "> > сделать ошибкой то, что не является ошибкой и сломать код, который не является ошибочным? Зачем, можно просто варнинг ввести, да и то не факт что он нужен(раз до сих пор нет)\r\n> \r\n> но const на статическом методе даёт ошибку, хотя мы точно не модифицируем объект\r\n\r\nконечно это ошибка, ведь это эквивалентно const на неявном первом аргументе - указателе this, а его у статического метода нет", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1012951842/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1012953305", + "html_url": "https://github.com/cpp-ru/ideas/issues/500#issuecomment-1012953305", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500", + "id": 1012953305, + "node_id": "IC_kwDOFK7cns48YHDZ", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T09:31:41Z", + "updated_at": "2022-01-14T09:31:41Z", + "author_association": "NONE", + "body": "> но const на статическом методе даёт ошибку, хотя мы точно не модифицируем объект\r\n\r\nТам ошибка в том, что свойство константности применяется к несуществующему в этом контексте `this`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1012953305/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013019790", + "html_url": "https://github.com/cpp-ru/ideas/issues/500#issuecomment-1013019790", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500", + "id": 1013019790, + "node_id": "IC_kwDOFK7cns48YXSO", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T11:01:09Z", + "updated_at": "2022-01-14T11:07:05Z", + "author_association": "NONE", + "body": "fun fact - стандарт не запрещает писать подобное (правда, warning **будет**):\r\n```cpp\r\ninline inline inline inline inline inline inline constexpr int sum(int n) {\r\n int res = 0;\r\n for (int i = 1; i <= n; ++i)\r\n res += i;\r\n return res;\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013019790/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013145586", + "html_url": "https://github.com/cpp-ru/ideas/issues/500#issuecomment-1013145586", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500", + "id": 1013145586, + "node_id": "IC_kwDOFK7cns48Y1_y", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T14:05:23Z", + "updated_at": "2022-01-14T14:06:07Z", + "author_association": "NONE", + "body": "Кстати, в результатах поиска, на которые вы сослались, довольно много конструкций условной компиляции вроде `CONSTEXPR_IF_2011 inline foo()`. Если запретить `inline constexpr`, придётся реализовывать условную компиляцию куда сложнее.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013145586/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013316407", + "html_url": "https://github.com/cpp-ru/ideas/issues/493#issuecomment-1013316407", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/493", + "id": 1013316407, + "node_id": "IC_kwDOFK7cns48Zfs3", + "user": { + "login": "oficsu", + "id": 35731382, + "node_id": "MDQ6VXNlcjM1NzMxMzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/35731382?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/oficsu", + "html_url": "https://github.com/oficsu", + "followers_url": "https://api.github.com/users/oficsu/followers", + "following_url": "https://api.github.com/users/oficsu/following{/other_user}", + "gists_url": "https://api.github.com/users/oficsu/gists{/gist_id}", + "starred_url": "https://api.github.com/users/oficsu/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/oficsu/subscriptions", + "organizations_url": "https://api.github.com/users/oficsu/orgs", + "repos_url": "https://api.github.com/users/oficsu/repos", + "events_url": "https://api.github.com/users/oficsu/events{/privacy}", + "received_events_url": "https://api.github.com/users/oficsu/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T17:27:26Z", + "updated_at": "2022-01-14T17:27:26Z", + "author_association": "NONE", + "body": "> Интересно послушать аргументацию почему Гор считает что как в С - плохо\r\n\r\nДумаю, по той же причине, по которой существуют `-Wreorder`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013316407/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013330137", + "html_url": "https://github.com/cpp-ru/ideas/issues/493#issuecomment-1013330137", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/493", + "id": 1013330137, + "node_id": "IC_kwDOFK7cns48ZjDZ", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T17:47:13Z", + "updated_at": "2022-01-14T17:47:25Z", + "author_association": "NONE", + "body": "> Думаю, по той же причине, по которой существуют -Wreorder\r\n\r\nдля филдов такой же баг как со списком инициализации в конструкторе не проходит, они by design не видят друг друга.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013330137/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013332396", + "html_url": "https://github.com/cpp-ru/ideas/issues/501#issuecomment-1013332396", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/501", + "id": 1013332396, + "node_id": "IC_kwDOFK7cns48Zjms", + "user": { + "login": "oficsu", + "id": 35731382, + "node_id": "MDQ6VXNlcjM1NzMxMzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/35731382?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/oficsu", + "html_url": "https://github.com/oficsu", + "followers_url": "https://api.github.com/users/oficsu/followers", + "following_url": "https://api.github.com/users/oficsu/following{/other_user}", + "gists_url": "https://api.github.com/users/oficsu/gists{/gist_id}", + "starred_url": "https://api.github.com/users/oficsu/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/oficsu/subscriptions", + "organizations_url": "https://api.github.com/users/oficsu/orgs", + "repos_url": "https://api.github.com/users/oficsu/repos", + "events_url": "https://api.github.com/users/oficsu/events{/privacy}", + "received_events_url": "https://api.github.com/users/oficsu/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T17:50:41Z", + "updated_at": "2022-01-14T17:50:41Z", + "author_association": "NONE", + "body": "> Сейчас этот механизм реализуется через макрофункции (что не удобно)\r\n\r\nЭто, конечно же, [не обязательно так](https://en.cppreference.com/w/cpp/utility/source_location)\r\n\r\n\r\n> Можно запрещать или разрешать вызов API из определенных неймспейсов или классов\r\n\r\nИз классов давно возможно разрешать или запрещать, [реализуется через Passkey Idiom](https://godbolt.org/z/j7TeMva46)\r\n\r\n\r\n> будет с удивительными возможностями многие из которых еще предстоит открыть\r\n\r\nС учётом текущей сложности языка, боюсь, большинство открытий будут досадными. Именно по этой причине так плохо идут предложения, связанные со всяческими Parametric Expressions и аналогами", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013332396/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013335909", + "html_url": "https://github.com/cpp-ru/ideas/issues/493#issuecomment-1013335909", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/493", + "id": 1013335909, + "node_id": "IC_kwDOFK7cns48Zkdl", + "user": { + "login": "oficsu", + "id": 35731382, + "node_id": "MDQ6VXNlcjM1NzMxMzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/35731382?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/oficsu", + "html_url": "https://github.com/oficsu", + "followers_url": "https://api.github.com/users/oficsu/followers", + "following_url": "https://api.github.com/users/oficsu/following{/other_user}", + "gists_url": "https://api.github.com/users/oficsu/gists{/gist_id}", + "starred_url": "https://api.github.com/users/oficsu/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/oficsu/subscriptions", + "organizations_url": "https://api.github.com/users/oficsu/orgs", + "repos_url": "https://api.github.com/users/oficsu/repos", + "events_url": "https://api.github.com/users/oficsu/events{/privacy}", + "received_events_url": "https://api.github.com/users/oficsu/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T17:55:48Z", + "updated_at": "2022-01-14T17:55:48Z", + "author_association": "NONE", + "body": "О каком именно баге речь?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013335909/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013386435", + "html_url": "https://github.com/cpp-ru/ideas/issues/501#issuecomment-1013386435", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/501", + "id": 1013386435, + "node_id": "IC_kwDOFK7cns48ZwzD", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T19:11:52Z", + "updated_at": "2022-01-14T19:11:52Z", + "author_association": "NONE", + "body": "> Это, конечно же, не обязательно так\r\n\r\nВот именно эта идея позволила бы реализовать функционал аналогичный source_location в качестве default параметра, не через особый путь для компилятора, а используя максимально язык C++.\r\n\r\n> Из классов давно возможно разрешать или запрещать, реализуется через Passkey Idiom\r\n\r\nИдея в другом, что бы иметь простой инструмент, что бы во внутрь функции можно было протащить информацию из контекста в котором она была вызвана без макрофункции и без необходимости в написании параметра который всегда один и тот же.\r\nВедь достаточно часто приходится писать код аналогичный:\r\n\r\n```\r\ndo( /* something */, context );\r\ndraw( /* something */, handle );\r\nallocate( /* something */, allocator );\r\nlog( /* something */, classname );\r\ndispatch( /* something */, tag );\r\ninvoke( /* somethign */, singletonAddr );\r\n```\r\n\r\nГде последний параметр - всегда одно и тоже имя, но ищется оно иерархически от локальных переменных, через агрументы функции, члены класса, вложенные неймспейсы, до глобального неймспейса. \r\n\r\nДефолтные параметры уже сами по себе активно используются для уменьшения шума в коде.\r\nА вычисляемые дефолтные параметры, могут быть еще более полезными. Их архитектура хорошо ложится на сущности с которыми приходится работать мозгу. Функции `принеси_это()`, `заработай_денег()`, `пошли_спать()`, это всё у нас в мозгу имеют дефолтный и иерархический контекст который зависит от места\\времени\\страны\\воспитания итд. У нас появится много новых паттернов для выражения статического полиморфизма, параметризированного не типом, а местом (контекстом) вызова функции.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013386435/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013390427", + "html_url": "https://github.com/cpp-ru/ideas/issues/493#issuecomment-1013390427", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/493", + "id": 1013390427, + "node_id": "IC_kwDOFK7cns48Zxxb", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T19:18:07Z", + "updated_at": "2022-01-14T19:18:07Z", + "author_association": "NONE", + "body": "Распространенная проблема связана с тем, что при инициализации одного поля (в списке инициализации конструктора), берется ссылка на другое, которое еще не инициализировано.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013390427/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013437323", + "html_url": "https://github.com/cpp-ru/ideas/issues/501#issuecomment-1013437323", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/501", + "id": 1013437323, + "node_id": "IC_kwDOFK7cns48Z9OL", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T20:02:45Z", + "updated_at": "2022-01-14T20:18:32Z", + "author_association": "NONE", + "body": "> Сейчас дефолтные аргументы для функций вычисляются в месте объявления.\r\n\r\nНет, они вычисляются в месте вызова, а резолвятся в месте объявления. Вы же предлагаете их резолвить в месте вызова. При этом почти во всех ваших примерах значение по умолчанию это просто _qualified-reference_. А ведь это может быть выражение произвольной сложности. Отложено резолвить eго звучит довольно безумно.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013437323/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013445895", + "html_url": "https://github.com/cpp-ru/ideas/issues/493#issuecomment-1013445895", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/493", + "id": 1013445895, + "node_id": "IC_kwDOFK7cns48Z_UH", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-14T20:17:38Z", + "updated_at": "2022-01-14T20:17:38Z", + "author_association": "NONE", + "body": "> для филдов такой же баг как со списком инициализации в конструкторе не проходит, они by design не видят друг друга.\r\n\r\nВообще-то могут видеть. \r\n```\r\nstruct Point {\r\n int x, y;\r\n} p {\r\n .y = 1,\r\n .x = p.y\r\n};\r\n```\r\nИ это в сочетании с переупорядочиванием инициализаторов может приводить к весьма [интересным результатам](https://gcc.godbolt.org/z/f1Yrzz65E).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013445895/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013754823", + "html_url": "https://github.com/cpp-ru/ideas/issues/482#issuecomment-1013754823", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/482", + "id": 1013754823, + "node_id": "IC_kwDOFK7cns48bKvH", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-15T21:11:26Z", + "updated_at": "2022-01-15T21:11:26Z", + "author_association": "NONE", + "body": "За годы немало предложений свёрнуто с формулировкой «дождитесь интроспекции/рефлексии». Нужна какая-то проактивная позиция на этот счёт; я ничего не могу предложить лучше чем принести на стол больше мотивационных примеров.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013754823/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013929681", + "html_url": "https://github.com/cpp-ru/ideas/issues/500#issuecomment-1013929681", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500", + "id": 1013929681, + "node_id": "IC_kwDOFK7cns48b1bR", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-16T18:41:49Z", + "updated_at": "2022-01-16T18:41:49Z", + "author_association": "NONE", + "body": "Я поисследовал другие спецификаторы, и понял, что максимум, на что можно рассчитывать это Warning компилятора, потому что, например дублирующиеся спецификаторы не являются ошибкой компиляции\r\n\r\nВозможно, примут этот патч - https://reviews.llvm.org/D117435\r\n\r\n> В Clang-Tidy есть заброшенная имплементация: https://reviews.llvm.org/D18914\r\n\r\nСпасибо! Если интересно знать - аргумент против этого патча (атрибут `inlinehint` в LLVM IR у inline метода) уже не работает, потому что этот атрибут перестали ставить начиная с Clang 3.3 (обнаружил через godbolt).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013929681/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013944620", + "html_url": "https://github.com/cpp-ru/ideas/issues/500#issuecomment-1013944620", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500", + "id": 1013944620, + "node_id": "IC_kwDOFK7cns48b5Es", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-16T20:15:45Z", + "updated_at": "2022-01-16T23:00:50Z", + "author_association": "NONE", + "body": "> аргумент против этого патча (атрибут inlinehint в LLVM IR у inline метода) уже не работает\r\n\r\nа аргумент и тогда не работал, разумно было бы хинт и для `constexpr` генерировать", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1013944620/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1016783985", + "html_url": "https://github.com/cpp-ru/ideas/issues/503#issuecomment-1016783985", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/503", + "id": 1016783985, + "node_id": "IC_kwDOFK7cns48muRx", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-19T19:12:24Z", + "updated_at": "2022-01-19T19:12:24Z", + "author_association": "MEMBER", + "body": "Выглядит прикольно... А зачем такое на практике?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1016783985/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1016786611", + "html_url": "https://github.com/cpp-ru/ideas/issues/502#issuecomment-1016786611", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/502", + "id": 1016786611, + "node_id": "IC_kwDOFK7cns48mu6z", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-19T19:15:31Z", + "updated_at": "2022-01-19T19:15:31Z", + "author_association": "MEMBER", + "body": "not a C++ standard related idea", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1016786611/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1016806893", + "html_url": "https://github.com/cpp-ru/ideas/issues/497#issuecomment-1016806893", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/497", + "id": 1016806893, + "node_id": "IC_kwDOFK7cns48mz3t", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-19T19:41:42Z", + "updated_at": "2022-01-19T19:41:42Z", + "author_association": "MEMBER", + "body": "Если нужно чтобы диапазон завладел контейнером можно воспользоваться std::ranges::owning_view:\r\n```\r\nfor (auto v : views::owning_view{make_generator()})\r\n std::cout << v;\r\n```\r\nИ работает без специализации enable_borrowed_range. Или вам нужно что-то другое?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1016806893/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1017130213", + "html_url": "https://github.com/cpp-ru/ideas/issues/497#issuecomment-1017130213", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/497", + "id": 1017130213, + "node_id": "IC_kwDOFK7cns48oCzl", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-20T05:20:13Z", + "updated_at": "2022-01-20T05:20:49Z", + "author_association": "NONE", + "body": "> > Если нужно чтобы диапазон завладел контейнером можно воспользоваться std::ranges::owning_view:\r\n> > ```\r\n> > for (auto v : views::owning_view{make_generator()})\r\n> > std::cout << v;\r\n> > ```\r\n> > \r\n> > \r\n> > \r\n> > \r\n> > \r\n> > \r\n> > \r\n> > \r\n> > \r\n> > \r\n> > \r\n> > И работает без специализации enable_borrowed_range. Или вам нужно что-то другое?\r\n> \r\n1. тот кто использует генератор вполне может об этом не знать или забыть.\r\n2. This specialization of std::ranges::enable_borrowed_range makes owning_view satisfy borrowed_range when the underlying range satisfies it. Что означает, что будет ошибка компиляции в выражении из примера(в вашем примере всё будет хорошо в любом случае, даже без ренжей). Потому что сейчас генератор нельзя сделать borrowed_range по вот такой вот причине с begin&&\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1017130213/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1017195007", + "html_url": "https://github.com/cpp-ru/ideas/issues/503#issuecomment-1017195007", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/503", + "id": 1017195007, + "node_id": "IC_kwDOFK7cns48oSn_", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-20T07:36:20Z", + "updated_at": "2022-01-20T07:36:20Z", + "author_association": "NONE", + "body": "Хех, думал про такое в контексте name(string literal), но семантически мы конструируем один объект, а по факту конструируем как бы весь класс(статическое поле), что как то неправильно, плюс я не нашёл каких то годных применений кроме сокращения записи чуть чуть", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1017195007/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1018368172", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1018368172", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1018368172, + "node_id": "IC_kwDOFK7cns48sxCs", + "user": { + "login": "vtopunov", + "id": 8456542, + "node_id": "MDQ6VXNlcjg0NTY1NDI=", + "avatar_url": "https://avatars.githubusercontent.com/u/8456542?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/vtopunov", + "html_url": "https://github.com/vtopunov", + "followers_url": "https://api.github.com/users/vtopunov/followers", + "following_url": "https://api.github.com/users/vtopunov/following{/other_user}", + "gists_url": "https://api.github.com/users/vtopunov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/vtopunov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/vtopunov/subscriptions", + "organizations_url": "https://api.github.com/users/vtopunov/orgs", + "repos_url": "https://api.github.com/users/vtopunov/repos", + "events_url": "https://api.github.com/users/vtopunov/events{/privacy}", + "received_events_url": "https://api.github.com/users/vtopunov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-21T10:15:17Z", + "updated_at": "2022-01-21T10:15:17Z", + "author_association": "NONE", + "body": "zstring_view", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1018368172/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1018796064", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1018796064", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1018796064, + "node_id": "IC_kwDOFK7cns48uZgg", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-21T19:26:29Z", + "updated_at": "2022-01-21T19:26:29Z", + "author_association": "NONE", + "body": "В чём предполагаются отличия от `std::string_view`?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1018796064/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019422983", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1019422983", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1019422983, + "node_id": "IC_kwDOFK7cns48wykH", + "user": { + "login": "kol65536black", + "id": 6318365, + "node_id": "MDQ6VXNlcjYzMTgzNjU=", + "avatar_url": "https://avatars.githubusercontent.com/u/6318365?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kol65536black", + "html_url": "https://github.com/kol65536black", + "followers_url": "https://api.github.com/users/kol65536black/followers", + "following_url": "https://api.github.com/users/kol65536black/following{/other_user}", + "gists_url": "https://api.github.com/users/kol65536black/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kol65536black/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kol65536black/subscriptions", + "organizations_url": "https://api.github.com/users/kol65536black/orgs", + "repos_url": "https://api.github.com/users/kol65536black/repos", + "events_url": "https://api.github.com/users/kol65536black/events{/privacy}", + "received_events_url": "https://api.github.com/users/kol65536black/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-23T06:10:27Z", + "updated_at": "2022-01-23T06:11:31Z", + "author_association": "NONE", + "body": "std::string_view имеет больший размер, так-как он должен содержать либо два указателя, либо указатель и размер. Из-за этого больше накладные расходы при передаче, в аргумента функции и т.п. \r\n\r\nУказатель/ссылка на \"const std::string\" выглядят неплохо, но по сути это \"указатель на указатель\", что требует двойного разыменования.\r\n\r\nstd::string_view не гарантирует, что ссылается на строку, оканчивающуюся нулем. Поэтому, принимая откуда-то std::string_view и если эту строку надо далее передать в качестве const char*, это нельзя сделать без выделения/копирования данных, даже, если в 99% случаев принимаемый std::string_view действительно ссылается строку с нулем.\r\n\r\nТ.е. полностью перейти на \"std::string/std::string_view\" и отказаться от \"const char*\" нельзя. По крайней мере не заплатив за это цену в виде потери производительности. И в коде \"const char*\" для строк всё равно будет использоваться. Но хочется удобства и единообразия с тем что есть в std. Поэтому хочется иметь обертку над \"const char*\", класс std::string_view строго такой оберткой не является, у него немного другой смысл.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019422983/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019435564", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1019435564", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1019435564, + "node_id": "IC_kwDOFK7cns48w1os", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-23T08:11:43Z", + "updated_at": "2022-01-23T08:12:32Z", + "author_association": "NONE", + "body": "> Поэтому, принимая откуда-то std::string_view и если эту строку надо далее передать в качестве const char*, это нельзя сделать без выделения/копирования данных\r\n\r\nНо `std::string_ref` здесь не поможет. Данные так или иначе придётся в 1% случаев скопировать (скорее всего на вызывающей стороне; там, что вы назвали «откуда-то»), чтобы получить нуль-терминированную строку, а её можно передать и через `std::string_view`. Для гарантии перед распадом в `const char*` можно добавить контракт/assert.\r\n\r\n> Из-за этого больше накладные расходы при передаче, в аргумента функции и т.п.\r\n\r\nМожем ли мы количественно оценить величину этих расходов?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019435564/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019436380", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1019436380", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1019436380, + "node_id": "IC_kwDOFK7cns48w11c", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-23T08:19:05Z", + "updated_at": "2022-01-23T08:19:05Z", + "author_association": "NONE", + "body": "> Для гарантии перед распадом в const char* можно добавить контракт/assert.\r\n\r\nНевозможно без UB проверить, является ли произвольный `std::string_view` нуль-терминированным. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019436380/reactions", + "total_count": 1, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 1, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019452906", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1019452906", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1019452906, + "node_id": "IC_kwDOFK7cns48w53q", + "user": { + "login": "vtopunov", + "id": 8456542, + "node_id": "MDQ6VXNlcjg0NTY1NDI=", + "avatar_url": "https://avatars.githubusercontent.com/u/8456542?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/vtopunov", + "html_url": "https://github.com/vtopunov", + "followers_url": "https://api.github.com/users/vtopunov/followers", + "following_url": "https://api.github.com/users/vtopunov/following{/other_user}", + "gists_url": "https://api.github.com/users/vtopunov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/vtopunov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/vtopunov/subscriptions", + "organizations_url": "https://api.github.com/users/vtopunov/orgs", + "repos_url": "https://api.github.com/users/vtopunov/repos", + "events_url": "https://api.github.com/users/vtopunov/events{/privacy}", + "received_events_url": "https://api.github.com/users/vtopunov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-23T10:13:16Z", + "updated_at": "2022-01-23T10:13:16Z", + "author_association": "NONE", + "body": "[Так](https://github.com/vtopunov/zstring_view/blob/master/zstring_view.h)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019452906/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019513793", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1019513793", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1019513793, + "node_id": "IC_kwDOFK7cns48xIvB", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-23T15:59:10Z", + "updated_at": "2022-01-23T16:02:09Z", + "author_association": "NONE", + "body": "> Невозможно без UB проверить, является ли произвольный `std::string_view` нуль-терминированным.\r\n\r\nМожет это как-то в стандарт C добавить, хотя бы и не с блестящей производительностью?\r\nПонятно, что UB идёт от невозможности проверить, выделена ли память под ```view.data() + view.size()```.\r\nБиблиотеки это умеют делать, если есть исходный адрес блока: [GLIBC](https://man7.org/linux/man-pages/man3/malloc_usable_size.3.html), [BSD/OSX](https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/malloc_size.3.html), [Windows](https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/msize?view=msvc-170), но если указатель куда-то подвинули с точки, которую вернул `malloc`...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019513793/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019531362", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1019531362", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1019531362, + "node_id": "IC_kwDOFK7cns48xNBi", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-23T17:33:56Z", + "updated_at": "2022-01-23T17:33:56Z", + "author_association": "NONE", + "body": "> Понятно, что UB идёт от невозможности проверить, выделена ли память под view.data() + view.size().\r\n\r\nПредлагаю также рассмотреть ситуацию, когда о куче не идёт и речи:\r\n```\r\nchar c = 'a'\r\nstd::string_view view(&c, 1);\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019531362/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019536055", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1019536055", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1019536055, + "node_id": "IC_kwDOFK7cns48xOK3", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-23T18:01:20Z", + "updated_at": "2022-01-23T18:01:35Z", + "author_association": "NONE", + "body": "Большой разницы не вижу. Если память выделена, куча это или стек, то можно \"просто\" определить, что `*(view.data() + view.size())`, вызванный внутри особой библиотечной функции не есть UB (в кавычках, потому что будут разные интересные последствия для оптимизаций, конечно). Проблемы начинаются, если чтение по этой памяти технически невозможно, т. е. делает SIGSERV или вообще лезет в какое-нибудь устройство...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019536055/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019561379", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1019561379", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1019561379, + "node_id": "IC_kwDOFK7cns48xUWj", + "user": { + "login": "vtopunov", + "id": 8456542, + "node_id": "MDQ6VXNlcjg0NTY1NDI=", + "avatar_url": "https://avatars.githubusercontent.com/u/8456542?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/vtopunov", + "html_url": "https://github.com/vtopunov", + "followers_url": "https://api.github.com/users/vtopunov/followers", + "following_url": "https://api.github.com/users/vtopunov/following{/other_user}", + "gists_url": "https://api.github.com/users/vtopunov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/vtopunov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/vtopunov/subscriptions", + "organizations_url": "https://api.github.com/users/vtopunov/orgs", + "repos_url": "https://api.github.com/users/vtopunov/repos", + "events_url": "https://api.github.com/users/vtopunov/events{/privacy}", + "received_events_url": "https://api.github.com/users/vtopunov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-23T20:31:47Z", + "updated_at": "2022-01-23T20:31:47Z", + "author_association": "NONE", + "body": "> Большой разницы не вижу. Если память выделена, куча это или стек, то можно \"просто\" определить, что `*(view.data() + view.size())`, вызванный внутри особой библиотечной функции не есть UB (в кавычках, потому что будут разные интересные последствия для оптимизаций, конечно). Проблемы начинаются, если чтение по этой памяти технически невозможно, т. е. делает SIGSERV или вообще лезет в какое-нибудь устройство...\r\n\r\nТогда несколько конструкторов у std::string_view придется выпилить. Интересно, почему сразу так не сделали?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019561379/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019567031", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1019567031", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1019567031, + "node_id": "IC_kwDOFK7cns48xVu3", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-23T21:04:31Z", + "updated_at": "2022-01-23T21:17:51Z", + "author_association": "NONE", + "body": "Потому что текущий `std::string_view` реализован чисто языковыми конструкциями; то, что я предложил, требует поддержки минимум от `libc` и, что более вероятно, ОС, и будет работать небыстро. Но как инструмент для валидации это было бы полезно.\r\n\r\nПоэтому давайте вернёмся к обсуждению исходного предложения.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019567031/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019788760", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1019788760", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1019788760, + "node_id": "IC_kwDOFK7cns48yL3Y", + "user": { + "login": "kol65536black", + "id": 6318365, + "node_id": "MDQ6VXNlcjYzMTgzNjU=", + "avatar_url": "https://avatars.githubusercontent.com/u/6318365?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kol65536black", + "html_url": "https://github.com/kol65536black", + "followers_url": "https://api.github.com/users/kol65536black/followers", + "following_url": "https://api.github.com/users/kol65536black/following{/other_user}", + "gists_url": "https://api.github.com/users/kol65536black/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kol65536black/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kol65536black/subscriptions", + "organizations_url": "https://api.github.com/users/kol65536black/orgs", + "repos_url": "https://api.github.com/users/kol65536black/repos", + "events_url": "https://api.github.com/users/kol65536black/events{/privacy}", + "received_events_url": "https://api.github.com/users/kol65536black/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-24T07:16:52Z", + "updated_at": "2022-01-24T07:16:52Z", + "author_association": "NONE", + "body": "> Можем ли мы количественно оценить величину этих расходов?\r\n\r\nЯ количественно оценить не готов. Но на каждый такой std::string_view нужно два (указателя/целых числа) вместо одного (для string_ref), быстрее закончатся регистры процессора и аргументы функции придется передавать через стек. \r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019788760/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019792321", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1019792321", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1019792321, + "node_id": "IC_kwDOFK7cns48yMvB", + "user": { + "login": "kol65536black", + "id": 6318365, + "node_id": "MDQ6VXNlcjYzMTgzNjU=", + "avatar_url": "https://avatars.githubusercontent.com/u/6318365?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kol65536black", + "html_url": "https://github.com/kol65536black", + "followers_url": "https://api.github.com/users/kol65536black/followers", + "following_url": "https://api.github.com/users/kol65536black/following{/other_user}", + "gists_url": "https://api.github.com/users/kol65536black/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kol65536black/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kol65536black/subscriptions", + "organizations_url": "https://api.github.com/users/kol65536black/orgs", + "repos_url": "https://api.github.com/users/kol65536black/repos", + "events_url": "https://api.github.com/users/kol65536black/events{/privacy}", + "received_events_url": "https://api.github.com/users/kol65536black/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-24T07:22:03Z", + "updated_at": "2022-01-24T17:32:07Z", + "author_association": "NONE", + "body": ">Но std::string_ref здесь не поможет. Данные так или иначе придётся в 1% случаев скопировать\r\n\r\nНу вот пусть оно в 1% случаев копирует с вызывающей стороны, чем копирует в 100% случаев в вызываемом коде. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1019792321/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022889660", + "html_url": "https://github.com/cpp-ru/ideas/issues/455#issuecomment-1022889660", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/455", + "id": 1022889660, + "node_id": "IC_kwDOFK7cns48-A68", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-27T06:29:30Z", + "updated_at": "2022-01-27T06:29:30Z", + "author_association": "MEMBER", + "body": "zip приняли в C++23 в https://wg21.link/P2321\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022889660/reactions", + "total_count": 1, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 1, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022894950", + "html_url": "https://github.com/cpp-ru/ideas/issues/353#issuecomment-1022894950", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/353", + "id": 1022894950, + "node_id": "IC_kwDOFK7cns48-CNm", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-27T06:40:28Z", + "updated_at": "2022-01-27T06:40:28Z", + "author_association": "MEMBER", + "body": "`if consteval` приняли в C++23 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022894950/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022903377", + "html_url": "https://github.com/cpp-ru/ideas/issues/260#issuecomment-1022903377", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/260", + "id": 1022903377, + "node_id": "IC_kwDOFK7cns48-ERR", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-27T06:58:05Z", + "updated_at": "2022-01-27T06:58:05Z", + "author_association": "MEMBER", + "body": "Готовится для включения в C++23 ranges::join_with http://wg21.link/p2441", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022903377/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022904794", + "html_url": "https://github.com/cpp-ru/ideas/issues/235#issuecomment-1022904794", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/235", + "id": 1022904794, + "node_id": "IC_kwDOFK7cns48-Ena", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-27T07:00:52Z", + "updated_at": "2022-01-27T07:00:52Z", + "author_association": "MEMBER", + "body": "Приняли в C++23, на основе этого оператора получится сделать нормальгый mdspan", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022904794/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022915780", + "html_url": "https://github.com/cpp-ru/ideas/issues/208#issuecomment-1022915780", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/208", + "id": 1022915780, + "node_id": "IC_kwDOFK7cns48-HTE", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-27T07:18:46Z", + "updated_at": "2022-01-27T07:18:46Z", + "author_association": "MEMBER", + "body": "Добавили std::allocate_at_least в C++23 http://wg21.link/p0401", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022915780/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022923403", + "html_url": "https://github.com/cpp-ru/ideas/issues/155#issuecomment-1022923403", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/155", + "id": 1022923403, + "node_id": "IC_kwDOFK7cns48-JKL", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-27T07:31:45Z", + "updated_at": "2022-01-27T07:31:45Z", + "author_association": "MEMBER", + "body": "Как верно заметили выше, работает с C++20 https://godbolt.org/z/PvdarP5ja", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022923403/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022924750", + "html_url": "https://github.com/cpp-ru/ideas/issues/119#issuecomment-1022924750", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/119", + "id": 1022924750, + "node_id": "IC_kwDOFK7cns48-JfO", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-27T07:34:04Z", + "updated_at": "2022-01-27T07:34:04Z", + "author_association": "MEMBER", + "body": "https://wg21.link/p2077 приняли в C++23 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1022924750/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1024901130", + "html_url": "https://github.com/cpp-ru/ideas/issues/504#issuecomment-1024901130", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "id": 1024901130, + "node_id": "IC_kwDOFK7cns49FsAK", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-29T12:18:28Z", + "updated_at": "2022-01-29T12:18:28Z", + "author_association": "NONE", + "body": "Нашёл прошлое предложение: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1402r0.pdf\r\nРезультаты голосования: https://github.com/cplusplus/papers/issues/189\r\n\r\n> нужно два (указателя/целых числа) вместо одного (для string_ref), быстрее закончатся регистры процессора\r\n\r\nОбычно как компилятор, так и железо хорошо этот процесс оптимизируют. Поэтому без количественных данных выглядит как premature optimization.\r\nКстати, в PR1402 предлагалось просто обернуть `std::string_view`, не выбрасывая размер.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1024901130/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025005671", + "html_url": "https://github.com/cpp-ru/ideas/issues/507#issuecomment-1025005671", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507", + "id": 1025005671, + "node_id": "IC_kwDOFK7cns49GFhn", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-29T23:22:23Z", + "updated_at": "2022-01-29T23:26:42Z", + "author_association": "NONE", + "body": "> Подсказка компилятору о том, что более предпочтительна подстановка кода\r\n\r\nВброшу пару идей:\r\n- Для необязательных вещей/подсказок ввели [[атрибуты]] в квадратных скобках\r\n- Из соображений симметрии можно добавить атрибут «не инлайнить, экономить размер кода»\r\n\r\n> методы, которые по Стандарту implicit inline functions, как то инстанциации шаблонов\r\n\r\nКомпиляторы разве не должны их инлайнить по максимуму? Гарантируется, что другие единицы трансляции на них ссылаться не будут, если не сказано `extern template`. Про остальное не уверен.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025005671/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025007147", + "html_url": "https://github.com/cpp-ru/ideas/issues/507#issuecomment-1025007147", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507", + "id": 1025007147, + "node_id": "IC_kwDOFK7cns49GF4r", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-29T23:34:15Z", + "updated_at": "2022-01-29T23:34:36Z", + "author_association": "NONE", + "body": "> Из соображений симметрии можно добавить атрибут «не инлайнить, экономить размер кода»\r\n\r\nС этим всё сложно - атрибутов довольно много, вот где я их смотрел\r\nhttps://github.com/llvm/llvm-project/blob/main/clang/lib/CodeGen/CodeGenModule.cpp#L1829-L1990\r\n\r\nАтрибут `inlinehint` здесь `Attribute::InlintHint`. Атрибут \"не инлайнить\" (т.е. в смысле вообще никогда) это `Attribute::NoInline`. Атрибут \"экономить размер кода\" это то ли `Attribute::OptimizeForSize`, то ли `Attribute::MinSize`. И там еще несколько есть.\r\n\r\nТо что вы предлагаете это \"атрибут чтобы не было атрибута `inlinehint`\", я думаю так не сработает\r\n\r\n> Компиляторы разве не должны их инлайнить по максимуму?\r\n\r\nШаблонные inline functions или вообще? В общем случае всё что меняется у первоначального LLVM IR, это наличие атрибута `linkonce_odr` вместо `dso_local`, больше ничего. Частные кейсы надо по Стандартам поискать", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025007147/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025008045", + "html_url": "https://github.com/cpp-ru/ideas/issues/507#issuecomment-1025008045", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507", + "id": 1025008045, + "node_id": "IC_kwDOFK7cns49GGGt", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-29T23:41:51Z", + "updated_at": "2022-01-29T23:42:32Z", + "author_association": "NONE", + "body": "Со скобочными атрибутами, если не менять Стандарт в указанном месте, то выйдет наверное как `[[noinlinehint]] inline int foo()` (чтобы оставить `linkonce`, а не `linkonce`+`inlinehint`), думаю такое не понравится всем((\r\n\r\nКстати, если даже качественные изменения не примут, всё равно бы наверное хотелось, чтобы понятие _inline functions_ в текущем состоянии переименовали в _linkonce functions_, потому что дикая путаница в данный момент.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025008045/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025008135", + "html_url": "https://github.com/cpp-ru/ideas/issues/507#issuecomment-1025008135", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507", + "id": 1025008135, + "node_id": "IC_kwDOFK7cns49GGIH", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-29T23:42:37Z", + "updated_at": "2022-01-29T23:42:37Z", + "author_association": "NONE", + "body": "> Шаблонные inline functions или вообще?\r\n\r\nШаблоны. Про остальное тоже есть вопросы – например, default конструкторы на то и есть, чтобы они как можно сильнее выродились в memset/memcpy. Но пока не готов подкрепить практикой.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025008135/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025009050", + "html_url": "https://github.com/cpp-ru/ideas/issues/507#issuecomment-1025009050", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507", + "id": 1025009050, + "node_id": "IC_kwDOFK7cns49GGWa", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-29T23:50:05Z", + "updated_at": "2022-01-29T23:51:36Z", + "author_association": "NONE", + "body": "> чтобы оставить linkonce, а не linkonce+inlinehint), думаю такое не понравится всем((\r\n\r\nДа, в этом контексте абсурдно. Но если `inlinehint` по умолчанию навесить всему, что _implict inline_, то будет осмысленно:\r\n\r\n```c++\r\nclass Bar {\r\n void foo() [[noinline]] {\r\n // very long code\r\n }\r\n};\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025009050/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025097161", + "html_url": "https://github.com/cpp-ru/ideas/issues/507#issuecomment-1025097161", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507", + "id": 1025097161, + "node_id": "IC_kwDOFK7cns49Gb3J", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-30T08:45:01Z", + "updated_at": "2022-01-30T08:47:42Z", + "author_association": "NONE", + "body": "> inlinehint объявляется для всех inline functions независимо от способа, каким они стали inline functions\r\n\r\n> Но если inlinehint по умолчанию навесить всему, что implict inline\r\n\r\nПочитал тред из архивов LLVM, производительность не очень хорошая: https://lists.llvm.org/pipermail/llvm-dev/2015-July/087668.html", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025097161/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025106095", + "html_url": "https://github.com/cpp-ru/ideas/issues/507#issuecomment-1025106095", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507", + "id": 1025106095, + "node_id": "IC_kwDOFK7cns49GeCv", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-30T09:42:51Z", + "updated_at": "2022-01-30T09:54:57Z", + "author_association": "NONE", + "body": "В той переписке мне приглянулась мысль, что раз стандарт количественных данных не содержит, то и предлагать оптимизации не может.\r\nПоэтому мне показалось правильным, если касательно оптимизаций стандарт даст мотивировочную часть и опишет необходимые условия, но не будет иметь резолютивную часть:\r\n\r\n> The inline specifier indicates to the implementation that inline substitution of the function body at the point of call is to be preferred to the usual function call mechanism **_must be possible_**. An implementation is not required to perform this inline substitution at the point of call; however, even if this inline substitution is omitted, the other rules for inline functions specified in this subclause shall still be respected.\r\n\r\nВ результате:\r\n- решение об оптимизациях остаётся за разработчиками компилятора на основании их количественных данных\r\n- это фиксирует статус-кво (опция 1 исходного предложения)\r\n- атрибуты и флаги компилятора позволяют влиять на его решения\r\n- не противоречит внесению термина `linkonce` в стандарт:\r\n\r\n> A function declaration ([dcl.fct], [class.mfct], [class.friend]) with an inline specifier declares an inline function **_a linkonce function_**. \r\n\r\n> [Note 4: A constexpr function is implicitly inline **_linkonce_**. In the global module, a function defined within a class definition is implicitly inline **_linkonce_** ([class.mfct], [class.friend]). — end note]", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025106095/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025124421", + "html_url": "https://github.com/cpp-ru/ideas/issues/507#issuecomment-1025124421", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507", + "id": 1025124421, + "node_id": "IC_kwDOFK7cns49GihF", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-01-30T11:38:01Z", + "updated_at": "2022-01-30T11:38:01Z", + "author_association": "NONE", + "body": "Спасибо! Да - в paper надо бы написать, что из возможных исходов нарушение статус-кво повлечет непредсказуемые последствия: из переписки 2015 года стало видно, что где-то ускорился код, где-то бинарник увеличился, где-то и то и другое. На такое пойти опасно, это по эффекту почти как легкий слом ABI.\r\n\r\nЯ думаю что понятие _inline variable_ (в том же параграфе) тоже надо заменить на _linkonce variable_. Сейчас слово inline там совершенно точно неправильно. Читатели могут думать что компилятор такие переменные всегда \"заинлайнит\", но это не так - такие переменные кроме отличающегося ODR ничем не отличаются от \"обычных\".\r\n\r\nЕсли например какой-то TU возьмет адрес у такой переменной, то компилятор ее не сможет заинлайнить в 100% случаев и поместит ее в секцию `.rdata` и будет обращаться к ней читая `.rdata`. То есть понятия `inlinehint` у переменнных by desing не бывает.\r\n\r\nПониже [\\[dcl.inline\\].2](https://eel.is/c++draft/dcl.inline#2) можно бы написать `[Note 2]`, который явно скажет, что у всех остальных linkonce функций нет рекомендации про inline substitution.\r\n\r\nВ paper в качестве мотивирующего примера (что текущие понятия запутывают) можно еще положить попытку написания в clang-tidy фиксера \"лишних inline\", который вы кидали в прошлом issue =) Там тоже далеко не сразу поняли что что-то не так.\r\n\r\nP.S. @pavelkryukov , как с вами связаться? =) Если у вас есть желание вместе подготовить paper и послать. Если захотите, то моя почта `izaronplatz@gmail.com`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1025124421/reactions", + "total_count": 1, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 1 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1030603727", + "html_url": "https://github.com/cpp-ru/ideas/issues/506#issuecomment-1030603727", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/506", + "id": 1030603727, + "node_id": "IC_kwDOFK7cns49bcPP", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-05T11:22:32Z", + "updated_at": "2022-02-05T11:22:32Z", + "author_association": "NONE", + "body": "Кому и как можно показать черновик предложения?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1030603727/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1030926796", + "html_url": "https://github.com/cpp-ru/ideas/issues/503#issuecomment-1030926796", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/503", + "id": 1030926796, + "node_id": "IC_kwDOFK7cns49crHM", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-06T22:19:44Z", + "updated_at": "2022-02-06T22:19:44Z", + "author_association": "NONE", + "body": "В C++ он на самом деле разрешен (видимо по принципу \"разрешено то, что не запрещено\"), такой код работает\r\nhttps://godbolt.org/z/5o3xYMo51\r\n\r\nОднако мешающих багов достаточно много. Такой набор у Clang - https://github.com/llvm/llvm-project/issues?q=is%3Aissue+consteval+is%3Aopen, у GCC/MSVC скорее всего тоже немаленький.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1030926796/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1032261747", + "html_url": "https://github.com/cpp-ru/ideas/issues/503#issuecomment-1032261747", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/503", + "id": 1032261747, + "node_id": "IC_kwDOFK7cns49hxBz", + "user": { + "login": "XRay3D", + "id": 10693876, + "node_id": "MDQ6VXNlcjEwNjkzODc2", + "avatar_url": "https://avatars.githubusercontent.com/u/10693876?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/XRay3D", + "html_url": "https://github.com/XRay3D", + "followers_url": "https://api.github.com/users/XRay3D/followers", + "following_url": "https://api.github.com/users/XRay3D/following{/other_user}", + "gists_url": "https://api.github.com/users/XRay3D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/XRay3D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/XRay3D/subscriptions", + "organizations_url": "https://api.github.com/users/XRay3D/orgs", + "repos_url": "https://api.github.com/users/XRay3D/repos", + "events_url": "https://api.github.com/users/XRay3D/events{/privacy}", + "received_events_url": "https://api.github.com/users/XRay3D/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-08T06:39:11Z", + "updated_at": "2022-02-08T06:39:11Z", + "author_association": "NONE", + "body": "> В C++ он на самом деле разрешен (видимо по принципу \"разрешено то, что не запрещено\"), такой код работает\n> https://godbolt.org/z/5o3xYMo51\n> \n> Однако мешающих багов достаточно много. Такой набор у Clang - https://github.com/llvm/llvm-project/issues?q=is%3Aissue+consteval+is%3Aopen, у GCC/MSVC скорее всего тоже немаленький.\n\nНо таким образом не удается инициализировать constexpr поля.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1032261747/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1034253646", + "html_url": "https://github.com/cpp-ru/ideas/issues/508#issuecomment-1034253646", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/508", + "id": 1034253646, + "node_id": "IC_kwDOFK7cns49pXVO", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-09T22:21:12Z", + "updated_at": "2022-02-09T22:21:12Z", + "author_association": "NONE", + "body": "> выглядит странно, что стандартные классы исключений не могут получать описание ошибки в виде `std::string_view`.\r\n\r\nДа, но обычно описание ошибки генерируют в рантайме, чтобы иметь в нём информацию для отладки; тут как раз подходит ссылка на `std::string`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1034253646/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1034508580", + "html_url": "https://github.com/cpp-ru/ideas/issues/508#issuecomment-1034508580", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/508", + "id": 1034508580, + "node_id": "IC_kwDOFK7cns49qVkk", + "user": { + "login": "eao197", + "id": 11836621, + "node_id": "MDQ6VXNlcjExODM2NjIx", + "avatar_url": "https://avatars.githubusercontent.com/u/11836621?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/eao197", + "html_url": "https://github.com/eao197", + "followers_url": "https://api.github.com/users/eao197/followers", + "following_url": "https://api.github.com/users/eao197/following{/other_user}", + "gists_url": "https://api.github.com/users/eao197/gists{/gist_id}", + "starred_url": "https://api.github.com/users/eao197/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/eao197/subscriptions", + "organizations_url": "https://api.github.com/users/eao197/orgs", + "repos_url": "https://api.github.com/users/eao197/repos", + "events_url": "https://api.github.com/users/eao197/events{/privacy}", + "received_events_url": "https://api.github.com/users/eao197/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-10T05:29:11Z", + "updated_at": "2022-02-10T05:29:11Z", + "author_association": "NONE", + "body": "> Да, но обычно описание ошибки генерируют в рантайме,\r\n\r\nЭто далеко не всегда так. Бывают случаи когда проверяются аргументы функции/метода:\r\n\r\n```cpp\r\nvoid do_something(const some_type * target, int retries) {\r\n if(!target) throw_invalid_parameter_exception(\"target can't be null\");\r\n if(retries < -10 || retries > 15) throw_invalid_parameter_exception(\"retries is out of allowed range [-10, 15]\");\r\n ...\r\n} \r\n```\r\n\r\nРаз уж в C++ добавили std::string_view, то было бы хорошо иметь возможность отказаться от использования `const char *` в том числе и при выбрасывании runtime/logic_error.\r\n\r\n> чтобы иметь в нём информацию для отладки; тут как раз подходит ссылка на std::string.\r\n\r\nДаже когда описание исключения генерируется автоматически, то далеко не всегда это происходит через std::string. Описание может быть помещено внутрь какого-то `std::array` на стеке. И при формировании описания необязательно будет использоваться sprintf, который добавляет 0-символ в конце. Так что в этом std::array может тупо не быть 0-символа, необходимого для передачи описания в runtime/logic_error в виде `const char*`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1034508580/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1034929717", + "html_url": "https://github.com/cpp-ru/ideas/issues/496#issuecomment-1034929717", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/496", + "id": 1034929717, + "node_id": "IC_kwDOFK7cns49r8Y1", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-10T13:35:38Z", + "updated_at": "2022-02-10T13:35:38Z", + "author_association": "NONE", + "body": "В С++ это не работает по 2-м причинам:\r\n\r\n1. Нельзя брать адрес от временного объекта.\r\n2. Аргументом cast-expression-а не может быть braced-init-list.\r\n\r\nПервый пункт, мне кажется, никто исправлять не захочет, это противоречит идеологии C++.\r\nВторой пункт исправлять не нужно, у нас есть другой синтаксис для записи того же выражения -- вместо\r\n`(struct point) {.x=1, .y=1}` можно писать просто `point {.x=1, .y=1}`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1034929717/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035126857", + "html_url": "https://github.com/cpp-ru/ideas/issues/505#issuecomment-1035126857", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/505", + "id": 1035126857, + "node_id": "IC_kwDOFK7cns49sshJ", + "user": { + "login": "crackedmind", + "id": 1381503, + "node_id": "MDQ6VXNlcjEzODE1MDM=", + "avatar_url": "https://avatars.githubusercontent.com/u/1381503?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/crackedmind", + "html_url": "https://github.com/crackedmind", + "followers_url": "https://api.github.com/users/crackedmind/followers", + "following_url": "https://api.github.com/users/crackedmind/following{/other_user}", + "gists_url": "https://api.github.com/users/crackedmind/gists{/gist_id}", + "starred_url": "https://api.github.com/users/crackedmind/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/crackedmind/subscriptions", + "organizations_url": "https://api.github.com/users/crackedmind/orgs", + "repos_url": "https://api.github.com/users/crackedmind/repos", + "events_url": "https://api.github.com/users/crackedmind/events{/privacy}", + "received_events_url": "https://api.github.com/users/crackedmind/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-10T16:27:38Z", + "updated_at": "2022-02-10T16:27:38Z", + "author_association": "NONE", + "body": "я бы вообще бы прошелся по всем типам в std для которых объявлен operator<< и сделать пропозал для добавления форматтеров, мне вот не хватает filesystem::path. Если с filesystem::path все просто. То с thread::id не очень, т.к. из public методов у него только конструктор. \r\n\r\nНо я даже не знаю как тут быть, только действительно пропозал делать :)\r\n\r\nТ.е. например для MSVC STL это бы выглядело так\r\n\r\n```\r\nclass thread::id { // thread id\r\npublic:\r\n id() noexcept : _Id(0) {} // id for no thread\r\n\r\nprivate:\r\n id(_Thrd_id_t _Other_id) : _Id(_Other_id) {}\r\n\r\n _Thrd_id_t _Id;\r\n \r\n // пропустим не нужное\r\n\r\n template \r\n friend basic_ostream<_Ch, _Tr>& operator<<(basic_ostream<_Ch, _Tr>& _Str, thread::id _Id);\r\n friend hash;\r\n friend formatter; // added\r\n};\r\n\r\ntemplate <>\r\nstruct formatter : public formatter<_Thrd_id_t> { // _Thrd_id_t alias на unsigned int\r\n template \r\n auto format(const thread::id& id, FormatContext& ctx) {\r\n return std::formatter<_Thrd_id_t>::format(id._Id, ctx);\r\n }\r\n};\r\n```\r\n\r\nНо тут возникает вторая проблема, нам для этого придется подключать format внутри thread, да и внутри любого друго хедера. Как это сейчас сделано в chrono. В MSVC STL заведен issue на избавление от такого подключения, но пока без движения.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035126857/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035269234", + "html_url": "https://github.com/cpp-ru/ideas/issues/510#issuecomment-1035269234", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/510", + "id": 1035269234, + "node_id": "IC_kwDOFK7cns49tPRy", + "user": { + "login": "crackedmind", + "id": 1381503, + "node_id": "MDQ6VXNlcjEzODE1MDM=", + "avatar_url": "https://avatars.githubusercontent.com/u/1381503?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/crackedmind", + "html_url": "https://github.com/crackedmind", + "followers_url": "https://api.github.com/users/crackedmind/followers", + "following_url": "https://api.github.com/users/crackedmind/following{/other_user}", + "gists_url": "https://api.github.com/users/crackedmind/gists{/gist_id}", + "starred_url": "https://api.github.com/users/crackedmind/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/crackedmind/subscriptions", + "organizations_url": "https://api.github.com/users/crackedmind/orgs", + "repos_url": "https://api.github.com/users/crackedmind/repos", + "events_url": "https://api.github.com/users/crackedmind/events{/privacy}", + "received_events_url": "https://api.github.com/users/crackedmind/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-10T18:15:37Z", + "updated_at": "2022-02-10T18:15:37Z", + "author_association": "NONE", + "body": "Было уже, с С++11 никто ничего не сделал, есть пропозал на удаление\r\n\r\n> Minimal support for Garbage Collection was added to C++0x in 2008 by [[N2670]](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2186r2.html#biblio-n2670). The main addition was the concept of \"strict pointer safety\", as well as library support for this pointer safety. Most of the rationale leading to the wording in this paper is captured in the two preceding proposals that merged to form this minimal paper, [[N2310]](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2186r2.html#biblio-n2310) and [[N2585]](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2186r2.html#biblio-n2585).\r\n> \r\n> There have been successful garbage collectors for C++, for example the [Boehm GC](https://www.hboehm.info/gc/) as well as Garbage Collectors in language virtual machines where the VM is implemented in C++, to support a garbage-collected language. This allows the implementation language to reference objects in the garbage collected language, and lets them interface very closely. You’re likely reading this paper in such a virtual machine, implemented in C++, with support for garbage collection: JavaScript VMs do this. Similarly, you’ve probably played games which mix C++ and C# using the Unity game engine, which [relies on the Boehm GC](https://docs.unity3d.com/Manual/UnderstandingAutomaticMemoryManagement.html).\r\n\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2186r2.html\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035269234/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035522961", + "html_url": "https://github.com/cpp-ru/ideas/issues/496#issuecomment-1035522961", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/496", + "id": 1035522961, + "node_id": "IC_kwDOFK7cns49uNOR", + "user": { + "login": "NN---", + "id": 580536, + "node_id": "MDQ6VXNlcjU4MDUzNg==", + "avatar_url": "https://avatars.githubusercontent.com/u/580536?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/NN---", + "html_url": "https://github.com/NN---", + "followers_url": "https://api.github.com/users/NN---/followers", + "following_url": "https://api.github.com/users/NN---/following{/other_user}", + "gists_url": "https://api.github.com/users/NN---/gists{/gist_id}", + "starred_url": "https://api.github.com/users/NN---/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/NN---/subscriptions", + "organizations_url": "https://api.github.com/users/NN---/orgs", + "repos_url": "https://api.github.com/users/NN---/repos", + "events_url": "https://api.github.com/users/NN---/events{/privacy}", + "received_events_url": "https://api.github.com/users/NN---/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-10T21:12:35Z", + "updated_at": "2022-02-10T21:12:35Z", + "author_association": "NONE", + "body": "Первый пункт не совсем верен.\nМы ведь можем передать временный объект по ссылке на константу и взять адрес на объект в функции.\nПри этом мы ещё можем поля объявить mutable и их менять.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035522961/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035523749", + "html_url": "https://github.com/cpp-ru/ideas/issues/496#issuecomment-1035523749", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/496", + "id": 1035523749, + "node_id": "IC_kwDOFK7cns49uNal", + "user": { + "login": "NN---", + "id": 580536, + "node_id": "MDQ6VXNlcjU4MDUzNg==", + "avatar_url": "https://avatars.githubusercontent.com/u/580536?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/NN---", + "html_url": "https://github.com/NN---", + "followers_url": "https://api.github.com/users/NN---/followers", + "following_url": "https://api.github.com/users/NN---/following{/other_user}", + "gists_url": "https://api.github.com/users/NN---/gists{/gist_id}", + "starred_url": "https://api.github.com/users/NN---/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/NN---/subscriptions", + "organizations_url": "https://api.github.com/users/NN---/orgs", + "repos_url": "https://api.github.com/users/NN---/repos", + "events_url": "https://api.github.com/users/NN---/events{/privacy}", + "received_events_url": "https://api.github.com/users/NN---/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-10T21:13:26Z", + "updated_at": "2022-02-10T21:13:26Z", + "author_association": "NONE", + "body": "По второй части согласен.\nСегодня нет проблем создать объект структуры с инициализацией, кроме небольшого ограничения на порядок полей ;)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035523749/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035577435", + "html_url": "https://github.com/cpp-ru/ideas/issues/482#issuecomment-1035577435", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/482", + "id": 1035577435, + "node_id": "IC_kwDOFK7cns49uahb", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-10T22:04:43Z", + "updated_at": "2022-02-10T22:04:43Z", + "author_association": "NONE", + "body": "> вроде как рефлексию собираются делать через constexpr-объекты, а не шаблоны\r\n\r\nВсё же издам глас вопиющего в пустыне: зачем сходить с накатанной лыжни?\r\nВ языке уже есть шаблоно-подобные `std::is_enum`, `std::is_destructible`, `std::is_same`...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035577435/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035626125", + "html_url": "https://github.com/cpp-ru/ideas/issues/508#issuecomment-1035626125", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/508", + "id": 1035626125, + "node_id": "IC_kwDOFK7cns49umaN", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-10T23:09:57Z", + "updated_at": "2022-02-12T10:13:00Z", + "author_association": "NONE", + "body": "в #263 есть ссылка на предложение P0506 ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035626125/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035905930", + "html_url": "https://github.com/cpp-ru/ideas/issues/508#issuecomment-1035905930", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/508", + "id": 1035905930, + "node_id": "IC_kwDOFK7cns49vquK", + "user": { + "login": "eao197", + "id": 11836621, + "node_id": "MDQ6VXNlcjExODM2NjIx", + "avatar_url": "https://avatars.githubusercontent.com/u/11836621?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/eao197", + "html_url": "https://github.com/eao197", + "followers_url": "https://api.github.com/users/eao197/followers", + "following_url": "https://api.github.com/users/eao197/following{/other_user}", + "gists_url": "https://api.github.com/users/eao197/gists{/gist_id}", + "starred_url": "https://api.github.com/users/eao197/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/eao197/subscriptions", + "organizations_url": "https://api.github.com/users/eao197/orgs", + "repos_url": "https://api.github.com/users/eao197/repos", + "events_url": "https://api.github.com/users/eao197/events{/privacy}", + "received_events_url": "https://api.github.com/users/eao197/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-11T06:00:32Z", + "updated_at": "2022-02-11T06:00:32Z", + "author_association": "NONE", + "body": "> в https://github.com/cpp-ru/ideas/issues/263 есть ссылка на предложение 0506\r\n\r\nЯ так понимаю, что судьба этого предложения печальна. Раз с 2017-го года никаких подвижек нет.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1035905930/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037106487", + "html_url": "https://github.com/cpp-ru/ideas/issues/508#issuecomment-1037106487", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/508", + "id": 1037106487, + "node_id": "IC_kwDOFK7cns490P03", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-12T10:12:53Z", + "updated_at": "2022-02-12T10:12:53Z", + "author_association": "NONE", + "body": "> Я так понимаю, что судьба этого предложения печальна. Раз с 2017-го года никаких подвижек нет.\r\n\r\nP0506 более агрессивное:\r\n- не добавлять новых конструкторов, а заменить старые (`const char*`/`const std::string&`)\r\n- потрогать std::regex, std::filesystem и т. д.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037106487/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037176658", + "html_url": "https://github.com/cpp-ru/ideas/issues/508#issuecomment-1037176658", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/508", + "id": 1037176658, + "node_id": "IC_kwDOFK7cns490g9S", + "user": { + "login": "eao197", + "id": 11836621, + "node_id": "MDQ6VXNlcjExODM2NjIx", + "avatar_url": "https://avatars.githubusercontent.com/u/11836621?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/eao197", + "html_url": "https://github.com/eao197", + "followers_url": "https://api.github.com/users/eao197/followers", + "following_url": "https://api.github.com/users/eao197/following{/other_user}", + "gists_url": "https://api.github.com/users/eao197/gists{/gist_id}", + "starred_url": "https://api.github.com/users/eao197/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/eao197/subscriptions", + "organizations_url": "https://api.github.com/users/eao197/orgs", + "repos_url": "https://api.github.com/users/eao197/repos", + "events_url": "https://api.github.com/users/eao197/events{/privacy}", + "received_events_url": "https://api.github.com/users/eao197/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-12T11:53:13Z", + "updated_at": "2022-02-12T11:53:13Z", + "author_association": "NONE", + "body": "По факту стандартные исключения не могут получать std::string_view, хотя это было бы полезно. И логично, раз уж в C++17 добавили этот самый std::string_view.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037176658/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037258784", + "html_url": "https://github.com/cpp-ru/ideas/issues/510#issuecomment-1037258784", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/510", + "id": 1037258784, + "node_id": "IC_kwDOFK7cns4901Ag", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-12T15:31:58Z", + "updated_at": "2022-02-12T15:31:58Z", + "author_association": "NONE", + "body": "Уже удалили поддержку, номинально добавленную в С++98", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037258784/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037459779", + "html_url": "https://github.com/cpp-ru/ideas/issues/511#issuecomment-1037459779", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/511", + "id": 1037459779, + "node_id": "IC_kwDOFK7cns491mFD", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-12T20:35:15Z", + "updated_at": "2022-02-12T20:35:15Z", + "author_association": "NONE", + "body": "Это уже принято: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1024r3.pdf.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037459779/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037866025", + "html_url": "https://github.com/cpp-ru/ideas/issues/509#issuecomment-1037866025", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/509", + "id": 1037866025, + "node_id": "IC_kwDOFK7cns493JQp", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-13T06:57:29Z", + "updated_at": "2022-02-13T09:21:32Z", + "author_association": "NONE", + "body": "На всякий случай продублирую тут: если вставать на путь кастомизации выкидывания исключения, то логично обработать стандартные варианты `E` -- `std::error_code` и `std::exception_ptr`.\r\n```cpp\r\ntemplate\r\nstruct on_error_policy {\r\n [[noreturn]] void operator()(E&& e) const {\r\n throw bad_expected_access(std::forward(e));\r\n }\r\n};\r\n\r\ntemplate<>\r\nstruct on_error_policy {\r\n [[noreturn]] void operator()(std::error_code ec) const {\r\n throw std::system_error(ec);\r\n }\r\n};\r\n\r\ntemplate<>\r\nstruct on_error_policy {\r\n [[noreturn]] void operator()(std::exception_ptr e) const {\r\n std::rethrow_exception(std::move(e));\r\n }\r\n};\r\n\r\ntemplate>\r\nclass expected;\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037866025/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037993599", + "html_url": "https://github.com/cpp-ru/ideas/issues/509#issuecomment-1037993599", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/509", + "id": 1037993599, + "node_id": "IC_kwDOFK7cns493oZ_", + "user": { + "login": "alexeysidorov92", + "id": 16775720, + "node_id": "MDQ6VXNlcjE2Nzc1NzIw", + "avatar_url": "https://avatars.githubusercontent.com/u/16775720?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/alexeysidorov92", + "html_url": "https://github.com/alexeysidorov92", + "followers_url": "https://api.github.com/users/alexeysidorov92/followers", + "following_url": "https://api.github.com/users/alexeysidorov92/following{/other_user}", + "gists_url": "https://api.github.com/users/alexeysidorov92/gists{/gist_id}", + "starred_url": "https://api.github.com/users/alexeysidorov92/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/alexeysidorov92/subscriptions", + "organizations_url": "https://api.github.com/users/alexeysidorov92/orgs", + "repos_url": "https://api.github.com/users/alexeysidorov92/repos", + "events_url": "https://api.github.com/users/alexeysidorov92/events{/privacy}", + "received_events_url": "https://api.github.com/users/alexeysidorov92/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-13T10:24:43Z", + "updated_at": "2022-02-13T10:24:43Z", + "author_association": "NONE", + "body": "**С одной стороны**, поддерживаю. Хотелось бы иметь возможность кастомизации.\r\n\r\nПопробую ещё один простой пример вкинуть, хотя это частный случай [unify local and centralized error handling](https://www.youtube.com/watch?v=PH4WBuE1BHI&t=1825s), на который ссылались на Хабре. \r\n\r\nНередко исключения ловятся в одном единственном блоке `catch` как `const std::exception&`, в котором просто логируется сообщение об ошибке. Рассмотрим на примере [std::filesystem::file_size](https://en.cppreference.com/w/cpp/filesystem/file_size):\r\n\r\n```cpp\r\ntry\r\n{\r\n const auto size = fs::file_size(\"C:\\\\file.txt\");\r\n\r\n if (size > 100)\r\n {\r\n // code ... \r\n }\r\n else\r\n {\r\n // code ... \r\n }\r\n}\r\ncatch (const std::exception& ex)\r\n{\r\n std::cerr << ex.what();\r\n}\r\n```\r\n\r\nИ если `fs::file_size` выбросит исключение, то в логах будет актуальная информация (например: \"file does not exist: C:\\\\file.txt\").\r\n\r\nДопустим, что `fs::file_size` теперь возвращает `std::expected`. Если мы просто исправим обращение к `size` на `size.value()`, то в случае ошибки потеряем в логах информацию о её причинах. Там будет записано что-то вроде \"bad expected access\".\r\n\r\nТогда нам нужно будет либо добавить ещё один блок `catch`:\r\n\r\n```cpp\r\ncatch (const std::bad_expected_access& ex)\r\n{\r\n std::cerr << ex.error().message();\r\n}\r\n```\r\n\r\nЛибо обрабатывать ошибку по месту:\r\n\r\n```cpp\r\nconst auto size = fs::file_size(\"file.txt\");\r\n\r\nif (!size)\r\n{\r\n std::cerr << size.error().message();\r\n return;\r\n}\r\n```\r\n\r\nА если в функции несколько разных `std::expected` встретятся, то это вообще жуть будет :)\r\n\r\nПоэтому хочется, чтобы при обращении к `value()` вылетало \"нормальное\" исключение.\r\n\r\n**С другой стороны**, как бы эти кастомизации злую шутку не сыграли в конечном итоге, если каждый будет свои policy пилить...\r\n\r\nМожет, с целью минимизации энтропии попробовать вместо одного `std::expected` рассмотреть три? :D\r\n\r\nНазвания условные:\r\n\r\n```cpp\r\n// Версия expected, что мы здесь обсуждаем\r\ntemplate \r\nclass customized_expected;\r\n\r\n// Версия expected, что предлагается в стандарт - продвинутый optional\r\ntemplate\r\nusing value_or_error = customized_expected\r\n\r\n// Версия, что изначально предлагал Александреску. Можно даже добавить дополнительное ограничение в виде `std::derived_from`\r\ntemplate\r\nusing expected = customized_expected\r\n```\r\n\r\n Те кто хочет легковесный продвинутый `optional`, будут использовать `value_or_error`. Тот кто хочет исключения - `expected`.\r\n \r\n Да и пользователям, думаю, будет чуть понятнее, какие исключения в каком случае ловить...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1037993599/reactions", + "total_count": 2, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 1 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1040642158", + "html_url": "https://github.com/cpp-ru/ideas/issues/268#issuecomment-1040642158", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/268", + "id": 1040642158, + "node_id": "IC_kwDOFK7cns4-BvBu", + "user": { + "login": "marakew", + "id": 3596295, + "node_id": "MDQ6VXNlcjM1OTYyOTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/3596295?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/marakew", + "html_url": "https://github.com/marakew", + "followers_url": "https://api.github.com/users/marakew/followers", + "following_url": "https://api.github.com/users/marakew/following{/other_user}", + "gists_url": "https://api.github.com/users/marakew/gists{/gist_id}", + "starred_url": "https://api.github.com/users/marakew/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/marakew/subscriptions", + "organizations_url": "https://api.github.com/users/marakew/orgs", + "repos_url": "https://api.github.com/users/marakew/repos", + "events_url": "https://api.github.com/users/marakew/events{/privacy}", + "received_events_url": "https://api.github.com/users/marakew/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-15T18:42:09Z", + "updated_at": "2022-02-15T18:42:09Z", + "author_association": "NONE", + "body": "земля слухами полнится\r\nпишут что пропозл sender/receiver для экзекуторов - dead\r\n\r\nнадеюсь теперь придут к принятым везде модели channels\r\nи не будут заниматься ерундой", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1040642158/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045897710", + "html_url": "https://github.com/cpp-ru/ideas/issues/509#issuecomment-1045897710", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/509", + "id": 1045897710, + "node_id": "IC_kwDOFK7cns4-VyHu", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-19T06:47:41Z", + "updated_at": "2022-02-19T06:47:51Z", + "author_association": "NONE", + "body": "> Поэтому хочется, чтобы при обращении к `value()` вылетало \"нормальное\" исключение.\r\n\r\nМне кажется идея std::expected была как раз в том, чтобы не бросать исключение. Ну то есть если у тебя есть некая операция, возвращающая либо значение, либо исключение, то ты уже и так можешь сделать блок catch и забирать просто по значению внутри. Зачем делать промежуточное звено в виде expected в такой ситуации?\r\nЭто имеет смысл разве что в многопоточной системе и какой то фьюче. А как некая вещь объединяющая error code и значение вроде бы неплохо получилось, использование предполагается типа\r\nauto v = Foo();\r\nif (v)\r\n do(*v);\r\nКак собственно это с еррор кодом происходит, но его неудобно передавать, создавать и можно забыть обработать, в отличие от std::expected\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045897710/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045988834", + "html_url": "https://github.com/cpp-ru/ideas/issues/458#issuecomment-1045988834", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/458", + "id": 1045988834, + "node_id": "IC_kwDOFK7cns4-WIXi", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-19T10:44:44Z", + "updated_at": "2022-02-19T10:44:44Z", + "author_association": "MEMBER", + "body": "Приняли в C++23 вместе с новыми конструкторами от диапазона для контейнеров https://wg21.link/p1206", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045988834/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045989115", + "html_url": "https://github.com/cpp-ru/ideas/issues/398#issuecomment-1045989115", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/398", + "id": 1045989115, + "node_id": "IC_kwDOFK7cns4-WIb7", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-19T10:46:26Z", + "updated_at": "2022-02-19T10:46:26Z", + "author_association": "MEMBER", + "body": "Приняли в C++23", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045989115/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045989734", + "html_url": "https://github.com/cpp-ru/ideas/issues/71#issuecomment-1045989734", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/71", + "id": 1045989734, + "node_id": "IC_kwDOFK7cns4-WIlm", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-19T10:50:14Z", + "updated_at": "2022-02-19T10:50:14Z", + "author_association": "MEMBER", + "body": "ranges::to приняли в C++23", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045989734/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045990155", + "html_url": "https://github.com/cpp-ru/ideas/issues/477#issuecomment-1045990155", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/477", + "id": 1045990155, + "node_id": "IC_kwDOFK7cns4-WIsL", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-19T10:52:58Z", + "updated_at": "2022-02-19T10:52:58Z", + "author_association": "MEMBER", + "body": "Работа ведётся в https://wg21.link/p1040", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045990155/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045991239", + "html_url": "https://github.com/cpp-ru/ideas/issues/455#issuecomment-1045991239", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/455", + "id": 1045991239, + "node_id": "IC_kwDOFK7cns4-WI9H", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-19T10:59:31Z", + "updated_at": "2022-02-19T10:59:31Z", + "author_association": "MEMBER", + "body": "chain приняли в стандарт под именем join\r\n```cpp\r\n#include \r\n#include \r\n \r\nint main()\r\n{\r\n using namespace std::literals;\r\n auto v = { std::views::iota(1, 5), std::views::iota(5, 10) };\r\n auto jv = std::ranges::join_view(v);\r\n // 1 2 3 4 5 6 7 8 9\r\n for (int const e : jv) std::cout << e << ' ';\r\n std::cout << '\\n';\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1045991239/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1048144825", + "html_url": "https://github.com/cpp-ru/ideas/issues/466#issuecomment-1048144825", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/466", + "id": 1048144825, + "node_id": "IC_kwDOFK7cns4-eWu5", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-22T19:37:17Z", + "updated_at": "2022-02-22T19:37:17Z", + "author_association": "MEMBER", + "body": "В C++23 починили split_view с бэкпортом фикса в C++20. Им теперь удобно пользоваться для строк т.к. теперь он возвращает continuous итераторы из которых можно создавать string_view.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1048144825/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1048282838", + "html_url": "https://github.com/cpp-ru/ideas/issues/466#issuecomment-1048282838", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/466", + "id": 1048282838, + "node_id": "IC_kwDOFK7cns4-e4bW", + "user": { + "login": "bakwc", + "id": 1684011, + "node_id": "MDQ6VXNlcjE2ODQwMTE=", + "avatar_url": "https://avatars.githubusercontent.com/u/1684011?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/bakwc", + "html_url": "https://github.com/bakwc", + "followers_url": "https://api.github.com/users/bakwc/followers", + "following_url": "https://api.github.com/users/bakwc/following{/other_user}", + "gists_url": "https://api.github.com/users/bakwc/gists{/gist_id}", + "starred_url": "https://api.github.com/users/bakwc/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/bakwc/subscriptions", + "organizations_url": "https://api.github.com/users/bakwc/orgs", + "repos_url": "https://api.github.com/users/bakwc/repos", + "events_url": "https://api.github.com/users/bakwc/events{/privacy}", + "received_events_url": "https://api.github.com/users/bakwc/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-02-22T22:44:48Z", + "updated_at": "2022-02-22T22:44:48Z", + "author_association": "NONE", + "body": "Как будет выглядеть пример для std::string (не для string_view)?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1048282838/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1086790811", + "html_url": "https://github.com/cpp-ru/ideas/issues/515#issuecomment-1086790811", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/515", + "id": 1086790811, + "node_id": "IC_kwDOFK7cns5Axxyb", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-04-03T07:03:07Z", + "updated_at": "2022-04-03T07:03:07Z", + "author_association": "NONE", + "body": "Уже есть [`std::div`](https://en.cppreference.com/w/cpp/numeric/math/div)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1086790811/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1086811720", + "html_url": "https://github.com/cpp-ru/ideas/issues/510#issuecomment-1086811720", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/510", + "id": 1086811720, + "node_id": "IC_kwDOFK7cns5Ax25I", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-04-03T08:46:26Z", + "updated_at": "2022-04-03T08:46:26Z", + "author_association": "MEMBER", + "body": "Посмотрите на Hazzard Pointer https://wg21.link/p1121\r\n\r\nЭто \"правильный GC\" для C++. Или вам нужно нечто другое?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1086811720/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1086823142", + "html_url": "https://github.com/cpp-ru/ideas/issues/515#issuecomment-1086823142", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/515", + "id": 1086823142, + "node_id": "IC_kwDOFK7cns5Ax5rm", + "user": { + "login": "exldna", + "id": 73162077, + "node_id": "MDQ6VXNlcjczMTYyMDc3", + "avatar_url": "https://avatars.githubusercontent.com/u/73162077?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/exldna", + "html_url": "https://github.com/exldna", + "followers_url": "https://api.github.com/users/exldna/followers", + "following_url": "https://api.github.com/users/exldna/following{/other_user}", + "gists_url": "https://api.github.com/users/exldna/gists{/gist_id}", + "starred_url": "https://api.github.com/users/exldna/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/exldna/subscriptions", + "organizations_url": "https://api.github.com/users/exldna/orgs", + "repos_url": "https://api.github.com/users/exldna/repos", + "events_url": "https://api.github.com/users/exldna/events{/privacy}", + "received_events_url": "https://api.github.com/users/exldna/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-04-03T09:36:50Z", + "updated_at": "2022-04-03T09:36:50Z", + "author_association": "NONE", + "body": "спасибо, буду пользоваться", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1086823142/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1107621663", + "html_url": "https://github.com/cpp-ru/ideas/issues/517#issuecomment-1107621663", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/517", + "id": 1107621663, + "node_id": "IC_kwDOFK7cns5CBPcf", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-04-23T19:03:34Z", + "updated_at": "2022-04-23T19:03:34Z", + "author_association": "MEMBER", + "body": "Хак прикольный, но не даёт 100% гарантии - компилятор может недостаточно хорошо заинлайнить, или тело корутины может оказаться слишком большим, или сама корутина окажется многомегабайтной, или режим оптимизации недостаточно выкручен...", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1107621663/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1107638968", + "html_url": "https://github.com/cpp-ru/ideas/issues/517#issuecomment-1107638968", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/517", + "id": 1107638968, + "node_id": "IC_kwDOFK7cns5CBTq4", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-04-23T19:48:22Z", + "updated_at": "2022-04-23T19:48:22Z", + "author_association": "NONE", + "body": "> Хак прикольный, но не даёт 100% гарантии - компилятор может недостаточно хорошо заинлайнить, или тело корутины может оказаться слишком большим, или сама корутина окажется многомегабайтной, или режим оптимизации недостаточно выкручен...\r\n\r\nну если добавлять это в стандарт, то гарантировать оптимизацию по типу возврата из функции", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1107638968/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1107640003", + "html_url": "https://github.com/cpp-ru/ideas/issues/517#issuecomment-1107640003", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/517", + "id": 1107640003, + "node_id": "IC_kwDOFK7cns5CBT7D", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-04-23T19:56:29Z", + "updated_at": "2022-04-23T19:56:39Z", + "author_association": "NONE", + "body": "> Хак прикольный\r\n\r\nhttps://github.com/cpp-ru/ideas/issues/514\r\nА вот это не прикольно?()\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1107640003/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1134596532", + "html_url": "https://github.com/cpp-ru/ideas/issues/294#issuecomment-1134596532", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/294", + "id": 1134596532, + "node_id": "IC_kwDOFK7cns5DoJG0", + "user": { + "login": "matwey", + "id": 156627, + "node_id": "MDQ6VXNlcjE1NjYyNw==", + "avatar_url": "https://avatars.githubusercontent.com/u/156627?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/matwey", + "html_url": "https://github.com/matwey", + "followers_url": "https://api.github.com/users/matwey/followers", + "following_url": "https://api.github.com/users/matwey/following{/other_user}", + "gists_url": "https://api.github.com/users/matwey/gists{/gist_id}", + "starred_url": "https://api.github.com/users/matwey/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/matwey/subscriptions", + "organizations_url": "https://api.github.com/users/matwey/orgs", + "repos_url": "https://api.github.com/users/matwey/repos", + "events_url": "https://api.github.com/users/matwey/events{/privacy}", + "received_events_url": "https://api.github.com/users/matwey/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-05-23T12:13:32Z", + "updated_at": "2022-05-23T12:13:32Z", + "author_association": "NONE", + "body": "> Работа над идеей идёт полным ходом, в C++23 должен появиться std::allocate_unique из http://wg21.link/p0211\r\n\r\nПо ссылке какая-то подозрительно простая реализация предлагается.\r\n`Allocator` не обязан уметь присваивание, например, `std::pmr::polymorphic_allocator` не умеет присваиваться. Т.е. если сложить инстанс такого аллокатора в `allocation_deleter<>`, то мы получим `unique_ptr`, который не умеет перемещающее присваивание, `swap` и т.п. И кому нужен такой `unique_ptr`?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1134596532/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1135022717", + "html_url": "https://github.com/cpp-ru/ideas/issues/294#issuecomment-1135022717", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/294", + "id": 1135022717, + "node_id": "IC_kwDOFK7cns5DpxJ9", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-05-23T18:49:46Z", + "updated_at": "2022-05-23T18:49:46Z", + "author_association": "NONE", + "body": "> не умеет перемещающее присваивание, `swap` и т.п.\r\n\r\nно ведь можно в такой `allocation_deleter<>` положить аллокатор, предварительно обернув его в `unique_ptr`? :)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1135022717/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1135041010", + "html_url": "https://github.com/cpp-ru/ideas/issues/294#issuecomment-1135041010", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/294", + "id": 1135041010, + "node_id": "IC_kwDOFK7cns5Dp1ny", + "user": { + "login": "matwey", + "id": 156627, + "node_id": "MDQ6VXNlcjE1NjYyNw==", + "avatar_url": "https://avatars.githubusercontent.com/u/156627?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/matwey", + "html_url": "https://github.com/matwey", + "followers_url": "https://api.github.com/users/matwey/followers", + "following_url": "https://api.github.com/users/matwey/following{/other_user}", + "gists_url": "https://api.github.com/users/matwey/gists{/gist_id}", + "starred_url": "https://api.github.com/users/matwey/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/matwey/subscriptions", + "organizations_url": "https://api.github.com/users/matwey/orgs", + "repos_url": "https://api.github.com/users/matwey/repos", + "events_url": "https://api.github.com/users/matwey/events{/privacy}", + "received_events_url": "https://api.github.com/users/matwey/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-05-23T19:09:39Z", + "updated_at": "2022-05-23T19:09:39Z", + "author_association": "NONE", + "body": "А кто для вложенного `unique_ptr` будет память выделять?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1135041010/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1152929231", + "html_url": "https://github.com/cpp-ru/ideas/issues/521#issuecomment-1152929231", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/521", + "id": 1152929231, + "node_id": "IC_kwDOFK7cns5EuE3P", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-06-11T13:35:05Z", + "updated_at": "2022-06-11T13:58:10Z", + "author_association": "NONE", + "body": "**tl;dr:** пример и аргументация кажутся неудачными, идею критике подвергать пока не буду.\r\n\r\n> При работе с классами, хорошей практикой, является объявление полей закрытыми.\r\n> Возьмём для примера класс QPoint с фреймворка Qt.\r\n\r\nСпорный переход: QPoint больше похож на структуру данных (внешний функционал), которую Qt почему-то реализовал как класс. Получился \"квазикласс\" в терминах этой статьи: http://www.idinews.com/quasiClass.pdf\r\n\r\n> Концепция свойств(геттеров, сеттеров) существует во многих языках, таких например как Swift, Kotlin, C# и д.р.,\r\nна уровне языка.\r\n\r\nЗаметим, что во многих не менее замечательных языках концепция свойств годами отсутствует.\r\n\r\n> Концепция свойств(геттеров, сеттеров) как раз позволяет писать меньше кода, и при этом код остается таким же читаемым.\r\n\r\nЕсли полей в структуре немного, то и кода для _автоматических_ геттеров/сеттеров нужно немного, особенно с наличием `auto` и `decltype`.\r\nЕсли полей в структуре много... то с ней чего-то не то.\r\n\r\n```c++\r\nclass QPoint {\r\npublic:\r\n // construct, dectructor, other\r\nprivate: \r\n int x { \r\n set(int value) {\r\n std::cout << \"invoke setter - x\" << std::endl; \r\n this->x = value;\r\n }; \r\n get() const {\r\n std::cout << \"invoke getter - x\" << std::endl; \r\n return x;\r\n }; \r\n }; \r\n int y { set; get; };\r\n};\r\n```\r\n\r\nВ этом примере следующий шаг, который хочется сделать — применить этот геттер/сеттер к `y`. В этот момент естественно ввести класс `QCoordinate`, в котором определить `operator=` и `operator int()`.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1152929231/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1152930006", + "html_url": "https://github.com/cpp-ru/ideas/issues/521#issuecomment-1152930006", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/521", + "id": 1152930006, + "node_id": "IC_kwDOFK7cns5EuFDW", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-06-11T13:40:50Z", + "updated_at": "2022-06-11T19:54:10Z", + "author_association": "NONE", + "body": "```c++\r\nclass QPoint {\r\npublic:\r\n // construct, dectructor, other\r\nprivate: \r\n int x { set; get; }; \r\n int y { set; get; };\r\n};\r\n\r\n```\r\n\r\nМного вопросов, как это будет сочетаться с конструкциями, специфичными для C++.\r\n\r\nРаз:\r\n\r\n```c++\r\nQPoint p;\r\nstd::vector pointers;\r\npointers.push_back(&p.x); // что это?\r\n```\r\n\r\nДва:\r\n```c++\r\n// что будет делать такой код?\r\nauto pointer_to_member = &QPoint::x;\r\np.*pointer_to_member = 3;\r\n```\r\n\r\nТри:\r\n\r\n```c++\r\nQPoint::QPoint(int a, int b) : x(a), y(b) { } // вызывать ли сеттер?\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1152930006/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1152931131", + "html_url": "https://github.com/cpp-ru/ideas/issues/520#issuecomment-1152931131", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/520", + "id": 1152931131, + "node_id": "IC_kwDOFK7cns5EuFU7", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-06-11T13:48:35Z", + "updated_at": "2022-06-11T13:48:35Z", + "author_association": "NONE", + "body": "```c++\r\nfor(int x=0; x < width; ++x){\r\n for(int y=0; x < heigh; ++y){\r\n if(img[x][y] != 0 ){\r\n break 2;\r\n }\r\n }\r\n}\r\n```\r\n\r\nЭто хуже, чем `goto`, потому что требует огромной внимательности от того, кому нужно будет добавить третий цикл:\r\n\r\n```c++\r\nfor(int x=0; x < width; ++x){\r\n for(int z=0; z < depth; ++z){\r\n for(int y=0; x < heigh; ++y){\r\n if(img[x][y] != 0 ){\r\n break 2; // oops!\r\n }\r\n }\r\n }\r\n}\r\n```\r\n\r\n> А также вынося вложенные циклы в отдельную функцию/лямбду и делая return для выхода из вложенных циклов.\r\n\r\nОбычно от этого код становится только понятнее и масштабируемее :-)\r\n\r\nЕщё можно подумать, как для такого обхода использовать корутины.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1152931131/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1152932512", + "html_url": "https://github.com/cpp-ru/ideas/issues/521#issuecomment-1152932512", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/521", + "id": 1152932512, + "node_id": "IC_kwDOFK7cns5EuFqg", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-06-11T13:58:45Z", + "updated_at": "2022-06-11T13:58:45Z", + "author_association": "NONE", + "body": "Старые предложения об автоматических геттерах/сеттерах и более общем случае неявных функций, все не позднее 2005 года:\r\n* PME: Properties, Methods and Events: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1384.pdf\r\n* C++/CLI Properties http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1600.html (сразу говорят, что не идёт в стандарт C++)\r\n* Implicitly-Callable Functions: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1611.pdf\r\n* C++ Properties -- a Library Solution: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1615.pdf\r\n\r\nВ последнем предложении содержится много критики к решениям уровня языка", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1152932512/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1152949954", + "html_url": "https://github.com/cpp-ru/ideas/issues/521#issuecomment-1152949954", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/521", + "id": 1152949954, + "node_id": "IC_kwDOFK7cns5EuJ7C", + "user": { + "login": "klappdev", + "id": 40568872, + "node_id": "MDQ6VXNlcjQwNTY4ODcy", + "avatar_url": "https://avatars.githubusercontent.com/u/40568872?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/klappdev", + "html_url": "https://github.com/klappdev", + "followers_url": "https://api.github.com/users/klappdev/followers", + "following_url": "https://api.github.com/users/klappdev/following{/other_user}", + "gists_url": "https://api.github.com/users/klappdev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/klappdev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/klappdev/subscriptions", + "organizations_url": "https://api.github.com/users/klappdev/orgs", + "repos_url": "https://api.github.com/users/klappdev/repos", + "events_url": "https://api.github.com/users/klappdev/events{/privacy}", + "received_events_url": "https://api.github.com/users/klappdev/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-06-11T15:22:00Z", + "updated_at": "2022-06-11T15:22:00Z", + "author_association": "NONE", + "body": "Геттеры/сеттеры на уровне языка работают как буто простые методы. Поэтому не должно конфликтовать с другими частями языка.\r\nВ С++23 добавили deducing this. Что является тоже пересмотром методов в частности. И позволяет меньше писать шаблонного кода.\r\nПоэтому почему не пересмотреть и в сторону свойств. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1152949954/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1153915480", + "html_url": "https://github.com/cpp-ru/ideas/issues/520#issuecomment-1153915480", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/520", + "id": 1153915480, + "node_id": "IC_kwDOFK7cns5Ex1pY", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-06-13T13:28:12Z", + "updated_at": "2022-06-13T13:28:12Z", + "author_association": "NONE", + "body": "Во многих философских трудах пишут, что многовложенные циклы это code smell, которого нужно избегать. Чаще всего рефакторят тело цикла в отдельные функции.\r\n\r\nВ таком случае вопрос странсформируется в \"как мне выпрыгнуть на N функций вверх\", это уже точно никому не должно быть нужно.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1153915480/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1156932089", + "html_url": "https://github.com/cpp-ru/ideas/issues/520#issuecomment-1156932089", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/520", + "id": 1156932089, + "node_id": "IC_kwDOFK7cns5E9WH5", + "user": { + "login": "topin89", + "id": 25770107, + "node_id": "MDQ6VXNlcjI1NzcwMTA3", + "avatar_url": "https://avatars.githubusercontent.com/u/25770107?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/topin89", + "html_url": "https://github.com/topin89", + "followers_url": "https://api.github.com/users/topin89/followers", + "following_url": "https://api.github.com/users/topin89/following{/other_user}", + "gists_url": "https://api.github.com/users/topin89/gists{/gist_id}", + "starred_url": "https://api.github.com/users/topin89/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/topin89/subscriptions", + "organizations_url": "https://api.github.com/users/topin89/orgs", + "repos_url": "https://api.github.com/users/topin89/repos", + "events_url": "https://api.github.com/users/topin89/events{/privacy}", + "received_events_url": "https://api.github.com/users/topin89/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-06-15T21:02:48Z", + "updated_at": "2022-06-15T21:02:48Z", + "author_association": "NONE", + "body": "> Это хуже, чем goto, потому что требует огромной внимательности от того, кому нужно будет добавить третий цикл\r\n\r\nХороший аргумент, согласен.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1156932089/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1159458056", + "html_url": "https://github.com/cpp-ru/ideas/issues/519#issuecomment-1159458056", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/519", + "id": 1159458056, + "node_id": "IC_kwDOFK7cns5FG-0I", + "user": { + "login": "incoder1", + "id": 5263071, + "node_id": "MDQ6VXNlcjUyNjMwNzE=", + "avatar_url": "https://avatars.githubusercontent.com/u/5263071?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/incoder1", + "html_url": "https://github.com/incoder1", + "followers_url": "https://api.github.com/users/incoder1/followers", + "following_url": "https://api.github.com/users/incoder1/following{/other_user}", + "gists_url": "https://api.github.com/users/incoder1/gists{/gist_id}", + "starred_url": "https://api.github.com/users/incoder1/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/incoder1/subscriptions", + "organizations_url": "https://api.github.com/users/incoder1/orgs", + "repos_url": "https://api.github.com/users/incoder1/repos", + "events_url": "https://api.github.com/users/incoder1/events{/privacy}", + "received_events_url": "https://api.github.com/users/incoder1/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-06-18T12:41:46Z", + "updated_at": "2022-06-18T12:45:52Z", + "author_association": "NONE", + "body": "+ Здравая мысль. Даже за то чтобы миксина оптимизировалась как std::copy, без наследования, VTBL и лишних типов. Просто выполнялось правило 5 с удалением конструктора копирования и оператором присвоения.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1159458056/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1167305239", + "html_url": "https://github.com/cpp-ru/ideas/issues/522#issuecomment-1167305239", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/522", + "id": 1167305239, + "node_id": "IC_kwDOFK7cns5Fk6oX", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-06-27T12:42:32Z", + "updated_at": "2022-06-27T12:44:10Z", + "author_association": "NONE", + "body": "> Как замена указателям в С++, имеются ссылки, умные указатели.\r\n\r\nЭто не замена указателям.\r\nВ современном С++ это всё разные семантики:\r\n* T& - невладеющее вью на ровно один валидный элемент типа T, const убирает мутабельность\r\n* T* - невладеющее вью на либо 0, либо один валидный элемент типа T, const убирает мутабельность\r\n* span\\ - невладеющее вью на некоторое количество последовательно лежащих валидных значений типа T\r\n* unique/shared_ptr - это не УМНЫЕ указатели, а ВЛАДЕЮЩИЕ указатели, в остальном их семантика аналогична обычному указателю\r\n* пары итератор-сентинел(ренжи) - невладеющие вью на некоторое количество значений типа T\r\n* контейнеры - владеющие сущности над некоторым количеством значений типа T\r\n \r\nПоэтому потенциальный std::nullable уже есть в языке и называется T*, а std::non_null называется T&\r\n\r\nP.S. not_null\\ это T, nullable\\ это optional\\ в более общем случае", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1167305239/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1167311030", + "html_url": "https://github.com/cpp-ru/ideas/issues/521#issuecomment-1167311030", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/521", + "id": 1167311030, + "node_id": "IC_kwDOFK7cns5Fk8C2", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-06-27T12:48:26Z", + "updated_at": "2022-06-27T12:48:26Z", + "author_association": "NONE", + "body": "Тривиальные геттеры и сеттеры это ошибка проектирования и бесполезный код. В джаву С++ не нужно превращать\r\nСеттер должен делать что-то осмысленное и называться не SetX, например\r\nvector::resize/reserve, это вообще говоря в ваших терминах сеттеры, но называются они осмысленно и делают логичные для инкапсуляции логики вещи\r\nP.S. в расте есть vec::set_len просто ору", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1167311030/reactions", + "total_count": 5, + "+1": 5, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1201332089", + "html_url": "https://github.com/cpp-ru/ideas/issues/521#issuecomment-1201332089", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/521", + "id": 1201332089, + "node_id": "IC_kwDOFK7cns5Hmt95", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-01T15:10:35Z", + "updated_at": "2022-08-01T15:10:35Z", + "author_association": "NONE", + "body": "Вообще геттеры и сетеры очень удобны если нужно автоматически оповещать об изменении в данных. И на C++ довольно не удобно получать указатель на this класса, который содержит подобные геттеры и сеттеры.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1201332089/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1204939008", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1204939008", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1204939008, + "node_id": "IC_kwDOFK7cns5H0ekA", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-04T08:32:13Z", + "updated_at": "2022-08-04T10:16:56Z", + "author_association": "NONE", + "body": "Предлагаю тем кто поставил унылых смайликов оценить разницу \r\nhttps://godbolt.org/z/b9hME36jf\r\nhttps://godbolt.org/z/eG9b8sYad\r\nи предложить варианты получше\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1204939008/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1205784569", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1205784569", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1205784569, + "node_id": "IC_kwDOFK7cns5H3s_5", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-04T21:25:06Z", + "updated_at": "2022-08-04T21:27:36Z", + "author_association": "NONE", + "body": "Как один из поставивших \"унылый смайлик\" отвечу: я не смог придумать пример, в котором это принесёт пользу. Какая смысловая нагрузка у `next_case:`? Мы не будем знать реальное значение в case, только то, что оно на 1 больше предыдущего - какой в этом смысл? Если для понимания нужно вручную вычислять это значение, то это усложняет чтение кода. Допустим, я смотрю на блок кода рядом с next_case и должен размышлять следующим образом: \"он будет вызван, если значение в switch окажется на единицу больше, чем то, для которого выполнится кусок кода, расположенный на строчке выше\" - так? Странно.\r\n\r\nБолее того, на практике редко используется switch по числам, чаще по enum'ам - в таком случае идея кажется ещё более абсурдной. \r\n\r\nПриведенный пример - это какой-то невероятно частный случай, да ещё и багоопасный. Что за магическая константа N? Если я напишу больше next_case, чем N, как отлавливать ошибку?\r\n\r\nНе убедили, в общем. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1205784569/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1206616788", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1206616788", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1206616788, + "node_id": "IC_kwDOFK7cns5H64LU", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-05T16:05:44Z", + "updated_at": "2022-08-11T20:13:27Z", + "author_association": "NONE", + "body": "Поясню. Есть подход с коротинами. А можно разделить задачу на короткие блоки вручную. Из плюсов вы можете без особых сложностей сериализовать подобное состояние и потом загрузить его и продолжить выполнени.\r\nТак вот единственны подобный механизм можно получить с помошью switch остальные варианты более накладные.\r\nТак например в микроконтроллерах и всяких ардуинах да и в некоторых играх, применяется подход loop-ом который вызаваетья или постоянно или с определенным шагом по времени (например 1000 раз в сек).\r\n```\r\nvoid setup() {\r\n ...\r\n}\r\nvoid loop() {\r\n ...\r\n}\r\n```\r\nТак вот подобная конструкция поволит нарезать последовательность кода на фрагменты:\r\n```\r\nswitch(state) {\r\n next_case: открыть_холодильник(); break;\r\n next_case: достать_жирафа(); break;\r\n next_case: засунуть_бегимота(); break;\r\n next_case: закрыть_холодильник();\r\n default: done=true;\r\n}\r\n```\r\nЧем плохо? \r\nВозможно даже более радикальный синтаксис:\r\n```\r\nswitch(state) { default: done=true;\r\n break: открыть_холодильник();\r\n break: достать_жирафа();\r\n break: засунуть_бегимота(); \r\n break: закрыть_холодильник();\r\n}\r\n```\r\nКакие альтернативы есть в языке?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1206616788/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1206662440", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1206662440", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1206662440, + "node_id": "IC_kwDOFK7cns5H7DUo", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-05T17:00:24Z", + "updated_at": "2022-08-05T17:00:24Z", + "author_association": "NONE", + "body": "Альтернативу вы и сами упомянули - корутины. С их помощью это реализуется.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1206662440/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1206686635", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1206686635", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1206686635, + "node_id": "IC_kwDOFK7cns5H7JOr", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-05T17:32:31Z", + "updated_at": "2022-08-05T17:34:26Z", + "author_association": "NONE", + "body": "Как с их помошью выполнить сохранение в текущего состояния и последующего его востановления, и продолжения исполнения с места сохранения (например на другом компьютере)?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1206686635/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207176876", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1207176876", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1207176876, + "node_id": "IC_kwDOFK7cns5H9A6s", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-06T08:49:29Z", + "updated_at": "2022-08-06T09:41:36Z", + "author_association": "NONE", + "body": "Также, как без них, это не зависит от графа выполнения кода. \r\n\r\nВы предлагаете добавить в язык новую синтаксическую конструкцию, для которой привели только один очень специфический пример использования, который может быть реализован через существующие возможности.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207176876/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207190897", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1207190897", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1207190897, + "node_id": "IC_kwDOFK7cns5H9EVx", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-06T10:32:18Z", + "updated_at": "2022-08-06T10:32:18Z", + "author_association": "NONE", + "body": "Да я предлагаю, небольшое расширение в switch которое позволит нарезать последовательный код на части. Более того подобное нововведение не является чем-то крайне сложным в реализации.\r\n\"реализован через существующие возможности\" - так я могу любые конструкции реализовать на любом языке. Но это не всегда удобно. А тут же при минимальных изменениях получаем удобный инструмент. Проблема в том что существующие возможности значительно уступают подобному подходу. Посмотрите то что компилируют разные компиляторы для подобных костылей.\r\nhttps://godbolt.org/z/b9hME36jf\r\nhttps://godbolt.org/z/eG9b8sYad\r\n\r\nБолее того я бы еще добавил в switch конструкцию вида:\r\n```\r\nswitch(some_enum) {\r\n case E1: { } break;\r\n no default: \r\n};\r\n```\r\nГде no default означало бы что в switch перечислены все допустимые значения, в обратном случае компилятор бы сообщал чего забыли и останавливался.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207190897/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207198064", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1207198064", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1207198064, + "node_id": "IC_kwDOFK7cns5H9GFw", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-06T11:25:36Z", + "updated_at": "2022-08-06T11:28:42Z", + "author_association": "NONE", + "body": "Синтаксис языка не меняют без весомых аргументов (один специфический кейс использования - это слабый аргумент). Даже если \"реализовать\" несложно, подобные изменения повлекут необходимость доработки не только компиляторов, но и IDE, статических анализаторов, и прочих утилит. Более того, нужно будет обучить всех тому, что в языке появился новый элемент. Если это будет ключевым словом, понадобится ещё и убедиться, что нет конфликтов с существующим кодом. Подчеркну, что это всё **ради одного частного случая**.\r\n\r\nВсё вышеописанное - моё мнение, но комитет ещё строже.\r\n\r\nПо поводу no default: подумайте про следующую ситуацию:\r\n\r\n```\r\nenum class E { A = 0 };\r\n\r\nswitch (static_cast(42)) {\r\n case E::A: { break; }\r\n no default:\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207198064/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207215441", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1207215441", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1207215441, + "node_id": "IC_kwDOFK7cns5H9KVR", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-06T13:30:32Z", + "updated_at": "2022-08-06T13:30:32Z", + "author_association": "NONE", + "body": "По поводу no default не вижу никаках противоречий:\r\n```\r\nswitch (static_cast(42)) {\r\n case E::A: { } break; \r\n no default: /* попадаем в эту ветку */\r\n}\r\n```\r\nПодобная конструкция нужна только для того что бы найти все места где могли упустить case при добавлении в enum нового значения.\r\n\"Синтаксис языка не меняют без весомых аргументов\" -- то есть для наркоманских конструкций https://en.cppreference.com/w/cpp/utility/launder которые выворачивают наружу внутренности компилятора были аргументы. А тут вы считаете что аргументов не достаточно.\r\n\r\n\"ради одного частного случая\" -- коротины же добавили (кое-как) это тоже всего лишь один частный случай.\r\nОни и раньше в обычном C легко реализовывались средствами языка с помощью setjmp/longjmp.\r\nВидимо просто вы не стой стороны смотрите на подобный частный случай. Еще раз повторю что и сейчас можно использовать обычный switch просто в случае добавления, удаления или перестановки частков приходится постоянно править цифры в case-ах. А в случае костылей получаем менее удобный и код с излишними наворотами и оверхедом.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207215441/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207217443", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1207217443", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1207217443, + "node_id": "IC_kwDOFK7cns5H9K0j", + "user": { + "login": "Smertig", + "id": 3898244, + "node_id": "MDQ6VXNlcjM4OTgyNDQ=", + "avatar_url": "https://avatars.githubusercontent.com/u/3898244?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Smertig", + "html_url": "https://github.com/Smertig", + "followers_url": "https://api.github.com/users/Smertig/followers", + "following_url": "https://api.github.com/users/Smertig/following{/other_user}", + "gists_url": "https://api.github.com/users/Smertig/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Smertig/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Smertig/subscriptions", + "organizations_url": "https://api.github.com/users/Smertig/orgs", + "repos_url": "https://api.github.com/users/Smertig/repos", + "events_url": "https://api.github.com/users/Smertig/events{/privacy}", + "received_events_url": "https://api.github.com/users/Smertig/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-06T13:43:18Z", + "updated_at": "2022-08-06T13:44:14Z", + "author_association": "NONE", + "body": "Есть огромная разница между изменениями синтаксиса языка и:\r\n1. `std::launder`, который является **библиотечной** фичей (не нужен большинству пользователей, но нужен, чтобы заткнуть UB в реализациях стандартных библиотек) с небольшой поддержкой от компилятора.\r\n2. Корутинами, которые никак нельзя назвать частным случаем - они упрощают громадное количество как библиотечного асинхронного кода, так и пользовательского, не говоря уже про недавно принятые генераторы, например.\r\n\r\nТак что ваши сравнения абсолютно некорректны", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207217443/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207221091", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1207221091", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1207221091, + "node_id": "IC_kwDOFK7cns5H9Ltj", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-06T14:07:48Z", + "updated_at": "2022-08-06T14:07:48Z", + "author_association": "NONE", + "body": "> Какие альтернативы есть в языке?\r\n\r\nмассив указателей на функции.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207221091/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207221587", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1207221587", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1207221587, + "node_id": "IC_kwDOFK7cns5H9L1T", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-06T14:10:39Z", + "updated_at": "2022-08-06T14:10:39Z", + "author_association": "NONE", + "body": "> no default: /* попадаем в эту ветку */\r\n\r\nstd::unreachable, __unreachable(), __assume(false)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207221587/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207246983", + "html_url": "https://github.com/cpp-ru/ideas/issues/525#issuecomment-1207246983", + "issue_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "id": 1207246983, + "node_id": "IC_kwDOFK7cns5H9SCH", + "user": { + "login": "kin4stat", + "id": 26118089, + "node_id": "MDQ6VXNlcjI2MTE4MDg5", + "avatar_url": "https://avatars.githubusercontent.com/u/26118089?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kin4stat", + "html_url": "https://github.com/kin4stat", + "followers_url": "https://api.github.com/users/kin4stat/followers", + "following_url": "https://api.github.com/users/kin4stat/following{/other_user}", + "gists_url": "https://api.github.com/users/kin4stat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kin4stat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kin4stat/subscriptions", + "organizations_url": "https://api.github.com/users/kin4stat/orgs", + "repos_url": "https://api.github.com/users/kin4stat/repos", + "events_url": "https://api.github.com/users/kin4stat/events{/privacy}", + "received_events_url": "https://api.github.com/users/kin4stat/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-08-06T16:58:02Z", + "updated_at": "2022-08-06T16:59:25Z", + "author_association": "NONE", + "body": "> std::unreachable, __unreachable(), __assume(false)\r\n\r\nАга, и в примере выше получаем отстрел ноги :)\r\n\r\n> Да я предлагаю, небольшое расширение в switch которое позволит нарезать последовательный код на части. Более того подобное нововведение не является чем-то крайне сложным в реализации.\r\n\r\nДля вас в язык специально добавили stackless корутины, зачем делать еще один сомнительный велосипед для случая один на миллион? Свитч по чиселкам самый непопулярный юзкейс, к чему это вообще?\r\n\r\n> Подобная конструкция нужна только для того что бы найти все места где могли упустить case при добавлении в enum нового значения.\r\n\r\nТак зачем этим нагружать компилятор? Его задача компилировать код, а не ошибки в нем искать. Если очень хочется - всегда есть инструменты реализованные поверх куска компиляторов.\r\n\r\n`clang-tidy myfile.cpp -checks=hiccp-multiway-path-covered`\r\n\r\nИ не бойтесь - от вас [ни один случай не ускользнет, потому что оно простое как валенок](https://github.com/llvm/llvm-project/issues/55885)\r\n\r\n> постоянно править цифры в case-ах\r\n\r\nЕсли у вас там цифры вместо enum'ов и у вас при большом желании отлавливать ошибки не подключен специализированный инструмент для этой цели - вы ССЗБ\r\n\r\n\r\n> Как с их помошью выполнить сохранение в текущего состояния и последующего его востановления, и продолжения исполнения с места сохранения (например на другом компьютере)?\r\n\r\nДа как угодно, хоть так:\r\n```cpp\r\nstruct save_state {};\r\n\r\nstruct promise_type {\r\n\t/* ... */\r\n\tauto await_transform() {\r\n\t\t/* ... */\r\n\t\t++current_state;\r\n\t\t/* ... */\r\n\t}\r\n\t\r\n\tauto await_transform(save_state) {\r\n\t\tstruct {\r\n\t\t\t/* ... */\r\n\t\t\tvoid await_suspend(std::coroutine_handle h) const {\r\n\t\t\t\tstd::ostream state{ \"state.txt\" };\r\n\t\t\t\tstate << state;\r\n\t\t\t}\r\n\t\t\t/* ... */\r\n\t\t\t\r\n\t\t\tint& state;\r\n\t\t} save_state_object{ current_state };\r\n\t\treturn save_state_object;\r\n\t}\r\n\t/* ... */\r\n\t\r\n\tint& current_state;\r\n};\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/comments/1207246983/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + } +] diff --git a/backup/all_issues.json b/backup/all_issues.json new file mode 100644 index 0000000..4eea438 --- /dev/null +++ b/backup/all_issues.json @@ -0,0 +1,37948 @@ +[ + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/566", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/566/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/566/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/566/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/566", + "id": 1776389717, + "node_id": "I_kwDOFK7cns5p4Y5V", + "number": 566, + "title": "Добавить в алгоритмы merge_unique", + "user": { + "login": "tomilov", + "id": 896175, + "node_id": "MDQ6VXNlcjg5NjE3NQ==", + "avatar_url": "https://avatars.githubusercontent.com/u/896175?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/tomilov", + "html_url": "https://github.com/tomilov", + "followers_url": "https://api.github.com/users/tomilov/followers", + "following_url": "https://api.github.com/users/tomilov/following{/other_user}", + "gists_url": "https://api.github.com/users/tomilov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/tomilov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tomilov/subscriptions", + "organizations_url": "https://api.github.com/users/tomilov/orgs", + "repos_url": "https://api.github.com/users/tomilov/repos", + "events_url": "https://api.github.com/users/tomilov/events{/privacy}", + "received_events_url": "https://api.github.com/users/tomilov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2023-06-27T08:38:27Z", + "updated_at": "2023-06-27T08:54:59Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "_<Описание вашей идеи>_\r\nНе хватает функции, которая за один проход сливает две неубывающих последовательности в строго возрастающую\r\n\r\n_<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>_\r\nБазовый алгоритм\r\n\r\n_<Код c реализацией вашей идеи, если есть>_\r\n```\r\ntemplate\r\nOutputIterator merge_unique(InputIterator1 first1, InputIterator1 last1,\r\n InputIterator2 first2, InputIterator2 last2,\r\n OutputIterator result)\r\n{\r\n while (first1 != last1 && first2 != last2)\r\n {\r\n if (*first1 < *first2)\r\n {\r\n *result = *first1;\r\n while (++first1 != last1 && !(*std::prev(first1) < *first1));\r\n }\r\n else if (*first2 < *first1)\r\n {\r\n *result = *first2;\r\n while (++first2 != last2 && !(*std::prev(first2) < *first2));\r\n }\r\n else // *first1 == *first2\r\n {\r\n *result = *first1;\r\n while (++first1 != last1 && !(*std::prev(first1) < *first1));\r\n while (++first2 != last2 && !(*std::prev(first2) < *first2));\r\n }\r\n ++result;\r\n }\r\n while (first1 != last1) {\r\n *result++ = *first1;\r\n while (++first1 != last1 && !(*std::prev(first1) < *first1));\r\n }\r\n while (first2 != last2) {\r\n *result++ = *first2;\r\n while (++first2 != last2 && !(*std::prev(first2) < *first2));\r\n }\r\n return result;\r\n}\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/566/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/566/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/565", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/565/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/565/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/565/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/565", + "id": 1764013290, + "node_id": "I_kwDOFK7cns5pJLTq", + "number": 565, + "title": "Новая семантика ... , частичные CTAD, неименованные локалы и т.д.", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2023-06-19T18:30:33Z", + "updated_at": "2023-06-20T10:20:11Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Увидел пропозал в С++26 на auto _ которое бы заменялось на [[maybe_unused]] auto x и сгорело немного\r\n\r\nКажется существуют способы гораздо лучше с точки зрения языка, которые решают сразу несколько проблем, моё предложение решает проблемы:\r\n* множества make* функций\r\n* неименованных локалов(которые хочется не именовать)\r\n* structured binding и рефлексия на его основе\r\n* более удобное метапрограммирование и новые возможности в нём(понятные и логичные)\r\n* решение проблемы \"как написать универсальное is_specialization_of\"\r\n* и т.д.\r\n\r\nИтак, первая часть пропозала:\r\n\r\n```c++\r\nauto [...args] = x; // структурная привязка в вариадик\r\nauto [a, b, ...args] = x; // два первых аргумента обычные, остальные вариадик\r\nauto [a, ...] = x; // первый аргумент обычный, остальные НЕИМЕНОВАННЫЙ вариадик\r\nauto [..., a] = x; // выделение последнего и неименованный вариадик в начале\r\nauto [a, ..., b] = x; // и даже так, если tuple_size_v < 2, то программа ill formed\r\n// это можно также использовать для создания неименованных переменных\r\n// std::get для lock_guard возвращает *this чтобы это было возможно\r\nauto [...] = std::lock_guard(mtx);\r\n// std::scoped_lock это буквально логический тупл локов\r\nauto [...] = std::scoped_lock(mtxs...);\r\n```\r\n\r\nВторая часть пропозала:\r\n\r\nВ контексте декларации шаблонных аргументов ... X будет означать пак любых аргуменов, например здесь Args это пак ЛЮБЫХ аргументов, не только типов\r\n```C++\r\ntemplate<... Args>\r\n```\r\n\r\nЭто позволяет сделать следующее\r\n\r\n```C++\r\ntemplate\r\nstruct is_specialization : std::false_type {};\r\n\r\ntemplate<...Args, template<...> typename Template>\r\nstruct is_specialization> : std::true_type {};\r\n```\r\nКонтекст декларации аргументов функции\r\n\r\n```C++\r\n// это шаблон функции с неименованным паком аргументов аналогично тому как работает void foo(auto);\r\nvoid foo(vector); \r\n// эквивалентно этому переписанному коду(если бы были аргументы не типы у шаблона, то добавило бы их тоже)\r\ntemplate\r\nvoid foo(vector)\r\n\r\n// Аналогично для\r\nvoid foo(vector<...>); // неименованный пак\r\nvoid foo(vector<... Args>); // именованный пак\r\ntemplate\r\nvoid foo(vector); // тоже работает, сейчас на гцц такое поведение поддержано\r\n\r\nvoid foo(vector<..., int, ...>); // ошибка компиляции\r\nvoid foo(vector<...> v, unique_ptr<...>); // работает\r\n```\r\n\r\nКонтекст передачи шаблонных шаблонных аргументов\r\nTemplate - алиас на Template с requires что первый тип same_as\r\nПример:\r\n\r\n```C++\r\nview | to> // переписывается в то что ниже\r\n\r\ntemplate T, ... Args> // all args, not just types\r\nusing __alias_vector = vector;\r\nview | to>\r\n\r\n```\r\n\r\nКонтекст вывода типов переменных (CTAD)\r\n\r\n```C++\r\n// применяет частичный CTAD с переданным пользователем типом int\r\nvector x = vector();\r\n// выполняет полный CTAD\r\nvector<...> x = vector();\r\n```\r\n\r\nМеханизм работы частичного CTAD:\r\nУ компилятора имеются дедакт гайды, в некоторых из них типы СПРАВА undeductible, в этом случае это называется частичный дедакт гайд(сейчас это запрещено)\r\nПри передаче пользователем части аргументов компилятор подставляет их и некоторые из частичных дедакт гайдов становятся полными, после этого компилятор делает обычный CTAD как сейчас(это похоже на C++20 фичу с дедакт гайдом из алиасов, просто фактически как и выше Template создаёт алиас по которому компилятор выводит полный тип)\r\n\r\nПример:\r\n```C++\r\n// это частичный дедакт гайд\r\n// компилятор видит что тип U в типе справа невыводим, но когда пользователь сам передаёт тип U\r\n// компилятор имеет всю информацию чтобы вывести тип\r\ntemplate\r\nvector(vector) -> vector;\r\n\r\n// использование. Компилятор видит слева int, подставляет в дедакт гайд,\r\n// остаётся вывести аллокатор, дедакт гайд подсказывает, что он my_alloc\r\nvector v = vector{};\r\n\r\n```\r\nЭтот частичный дедакт гайд также можно переписать с помощью пропозала короче\r\n\r\n```C++\r\ntemplate\r\nvector(vector<..., Alloc>) -> vector<..., Alloc>; // использованы два неименованных пака, разных\r\n```\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/565/reactions", + "total_count": 5, + "+1": 5, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/565/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/564", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/564/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/564/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/564/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/564", + "id": 1763621543, + "node_id": "I_kwDOFK7cns5pHrqn", + "number": 564, + "title": "Решение проблемы релоцирования объектов", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2023-06-19T14:04:50Z", + "updated_at": "2023-06-20T09:35:34Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "\r\nВся суть проблемы с релоцированием объектов заключается в том, что компилятору неизвестно каким образом происходит мув и из кода невозможно узнать (помимо trivial мува) каково поведение типа.\r\n\r\nНо если посмотреть на проблему шире, оказывается, что валидных стратегий реализации мув конструктора всего 4:\r\n1. memcpy (trivial move)\r\n2. exchange с дефолтным состоянием\r\n3. self reference сценарий\r\n4. у объекта вовсе нет мува, а есть только копирование(С++03 объект)\r\nну или тип вообще не movable, но очевидно его и релоцировать нельзя\r\nТак вот, сейчас в С++ представлен только первый тип как = default и трейт is_trivially_move_constructible, \r\n\r\nЯ предлагаю\r\n\r\nдобавить сценарий 2 как стратегию поведения на муве и трейты для этого, например\r\n\r\nType(Type&&) = default; // то что сейчас, мув конструктор у всех филдов/базовых классов\r\n\r\nType(Type&&) = swap; // дефолтное конструирование + вызов swap через adl для всех филдов и базовых классов\r\n\r\nТо же самое можно сделать с оператором\r\nType& operator=(Type&&) = swap; // типичная реализация мув оператора\r\n\r\nи добавить трейт is_not_self_reference который будет давать true если у типа и рекурсивно у всех типов за ним нет нетривиальных мувов.\r\nТ.к. фактически нет никакого смысла делать нетривиальный мув при таких условиях\r\n\r\nЭто \r\n* уберёт бойлерплейт\r\n* позволит компилятору и контейнерам узнавать практически во всех случаях, что тип не селф референс\r\n\r\nБолее того, практически все дефолтные конструкторы и деструкторы можно сделать constexpr, даже у std::any такой конструктор.\r\nкомпилятор может \"выдумать\" объект и дефолтно его сконструировать, а потом разрушить и на компиляции узнать, что деструктор был noop.\r\n\r\nДля этого я предлагаю ещё один трейт is_trivially_destructible_after_move\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/564/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/564/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/563", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/563/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/563/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/563/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/563", + "id": 1754047478, + "node_id": "I_kwDOFK7cns5ojKP2", + "number": 563, + "title": "static_assert в constexpr функции", + "user": { + "login": "blacktea", + "id": 42189825, + "node_id": "MDQ6VXNlcjQyMTg5ODI1", + "avatar_url": "https://avatars.githubusercontent.com/u/42189825?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/blacktea", + "html_url": "https://github.com/blacktea", + "followers_url": "https://api.github.com/users/blacktea/followers", + "following_url": "https://api.github.com/users/blacktea/following{/other_user}", + "gists_url": "https://api.github.com/users/blacktea/gists{/gist_id}", + "starred_url": "https://api.github.com/users/blacktea/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/blacktea/subscriptions", + "organizations_url": "https://api.github.com/users/blacktea/orgs", + "repos_url": "https://api.github.com/users/blacktea/repos", + "events_url": "https://api.github.com/users/blacktea/events{/privacy}", + "received_events_url": "https://api.github.com/users/blacktea/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2023-06-13T05:06:55Z", + "updated_at": "2023-06-17T05:29:09Z", + "closed_at": "2023-06-17T05:28:50Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "**Мотивация**\r\n\r\nВ `constexpr` функциях можно использовать `static_assert` в if..else конструкциях. \r\n\r\nНапример,\r\n```\r\ntemplate\r\nconstexpr int mypow(T&& b)\r\n{\r\n if constexpr(std::is_same_v) {\r\n return b*2;\r\n }\r\n else {\r\n static_assert(false, \"type is not supported\");\r\n }\r\n}\r\n```\r\nКомпиляция закончится ошибкой только если функция будет инстанциированна отличным от `int` типом.\r\nТак же можно использовать исключения в `constexpr` функциях.\r\n\r\n```\r\ntemplate\r\nconstexpr int mypow(T&& b)\r\n{\r\n if constexpr(std::is_same_v) {\r\n return b*2;\r\n }\r\n throw std::runtime_error{\"type is not supported\"};\r\n}\r\n```\r\nКомпилятор может отслеживать поток выполнения приложения. Таким образом, функция является `constexpr`, если выполняется условие.\r\n\r\nОднако, та же логика не работает для `static_assert` и if..else конструкции. Следующий код не скопилируется, даже если вызвать с `int` типом. Компилятор в любов случае фэйлится на `static_assert`.\r\n\r\n```\r\ntemplate\r\nconstexpr int mypow(T&& b)\r\n{\r\n if constexpr(std::is_same_v) {\r\n return b*2;\r\n }\r\n static_assert(false, \"type is not supported\");\r\n}\r\n```\r\n\r\nМое предложение - не проверять `static_assert` в терминальном случае. \r\n**Достоинства:**\r\n* Код выглядит немного чище, чем с `else` веткой.\r\n* Сохранится последовательность когда используется `throw`.\r\n\r\nПолезные ссылки:\r\n* https://godbolt.org/z/dz4o4qn79 - ссылка на последний пример.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/563/reactions", + "total_count": 3, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/563/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/562", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/562/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/562/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/562/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/562", + "id": 1728720765, + "node_id": "I_kwDOFK7cns5nCi99", + "number": 562, + "title": "Добавить функцию деманглирования имени type_info из boost::core::demangle.", + "user": { + "login": "shiz01", + "id": 45585072, + "node_id": "MDQ6VXNlcjQ1NTg1MDcy", + "avatar_url": "https://avatars.githubusercontent.com/u/45585072?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/shiz01", + "html_url": "https://github.com/shiz01", + "followers_url": "https://api.github.com/users/shiz01/followers", + "following_url": "https://api.github.com/users/shiz01/following{/other_user}", + "gists_url": "https://api.github.com/users/shiz01/gists{/gist_id}", + "starred_url": "https://api.github.com/users/shiz01/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/shiz01/subscriptions", + "organizations_url": "https://api.github.com/users/shiz01/orgs", + "repos_url": "https://api.github.com/users/shiz01/repos", + "events_url": "https://api.github.com/users/shiz01/events{/privacy}", + "received_events_url": "https://api.github.com/users/shiz01/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2023-05-27T13:14:29Z", + "updated_at": "2023-05-28T08:50:36Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Вмержить в стандарт `boost::core::demangle`, т.к. на данный момент нет какого-либо стандартного способа получить человекочитаемое имя из `typeid(T).name()`.\r\n\r\nДостаточно удобно при отладке шаблонов использовать в логах `type_info`, но без библиотеки boost требуется дополнительное деманглирование.\r\n\r\nНа данный момент `typeid(std::expected, my_error_t>).name()` выведет манглированное имя, которое в логах придётся дополнительно деманглировать при отладке, т.к. трудно однозначно интерпретировать тип.\r\n`St8expectedISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EE10my_error_tE`\r\n\r\nПри использовании `boost::core::demangle`, нам не нужна постобработка логов, мы можем сразу получить читаемое имя типа.\r\n`std::expected, std::allocator >, std::allocator, std::allocator > > >, my_error_t>`\r\n\r\n\r\nПолезные ссылки:\r\n* https://www.boost.org/doc/libs/1_82_0/libs/core/doc/html/core/demangle.html - ссылка на документацию о реализации деманглирования имён из type_info в boost.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/562/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/562/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/561", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/561/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/561/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/561/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/561", + "id": 1696079530, + "node_id": "I_kwDOFK7cns5lGB6q", + "number": 561, + "title": "Добавить вариант std::any_of, all_of, none_of со значением", + "user": { + "login": "blacktea", + "id": 42189825, + "node_id": "MDQ6VXNlcjQyMTg5ODI1", + "avatar_url": "https://avatars.githubusercontent.com/u/42189825?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/blacktea", + "html_url": "https://github.com/blacktea", + "followers_url": "https://api.github.com/users/blacktea/followers", + "following_url": "https://api.github.com/users/blacktea/following{/other_user}", + "gists_url": "https://api.github.com/users/blacktea/gists{/gist_id}", + "starred_url": "https://api.github.com/users/blacktea/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/blacktea/subscriptions", + "organizations_url": "https://api.github.com/users/blacktea/orgs", + "repos_url": "https://api.github.com/users/blacktea/repos", + "events_url": "https://api.github.com/users/blacktea/events{/privacy}", + "received_events_url": "https://api.github.com/users/blacktea/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2023-05-04T13:58:09Z", + "updated_at": "2023-06-19T13:42:51Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Добавить перегрузки к методам std::any_of, all_of, none_of, которые примают значение в качестве референса.\r\nМетод std::find имеет такую перегрузку \r\n```\r\ntemplate< class InputIt, class T >\r\nconstexpr InputIt find( InputIt first, InputIt last, const T& value );\r\n```\r\n[cppreference](https://en.cppreference.com/w/cpp/algorithm/find)\r\n\r\nОжидаемое сигнатура:\r\n\r\n```\r\ntemplate< class InputIt, class T >\r\nconstexpr bool any_of( InputIt first, InputIt last, const T& value );\r\n```\r\n\r\n**Мотивация**\r\nРассмотрим простой пример с использованием std::any_of.\r\nПредположим имеем массив чисел, и хотим узнать содержит ли массив какое-то конкретное число.\r\n\r\nС std::find мы напишем\r\n```\r\nvector v{1,2,3};\r\nint target = 1;\r\nconst bool contains = std::find(v.begin(), v.end(), target) != v.end;\r\n```\r\nC std::any_of:\r\n```\r\nvector v{1,2,3};\r\nint target = 1;\r\nconst bool contains = std::any_of(v.begin(), v.end(), [target](int value){ return target == value; });\r\n```\r\n\r\nМое предложение призвано упростить код. Будет выглядить след. образом.\r\n```\r\nvector v{1,2,3};\r\nint target = 1;\r\nconst bool contains = std::any_of(v.begin(), v.end(), value);\r\n```\r\n\r\n\r\nПолезные ссылки:\r\n* https://en.cppreference.com/w/cpp/algorithm/all_any_none_of\r\n* https://en.cppreference.com/w/cpp/algorithm/find\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/561/reactions", + "total_count": 3, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/561/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/560", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/560/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/560/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/560/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/560", + "id": 1693247118, + "node_id": "I_kwDOFK7cns5k7OaO", + "number": 560, + "title": "Стандарт для описания отображения пользовательских и не только типов при отладке", + "user": { + "login": "DaMilyutin", + "id": 44639272, + "node_id": "MDQ6VXNlcjQ0NjM5Mjcy", + "avatar_url": "https://avatars.githubusercontent.com/u/44639272?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DaMilyutin", + "html_url": "https://github.com/DaMilyutin", + "followers_url": "https://api.github.com/users/DaMilyutin/followers", + "following_url": "https://api.github.com/users/DaMilyutin/following{/other_user}", + "gists_url": "https://api.github.com/users/DaMilyutin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DaMilyutin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DaMilyutin/subscriptions", + "organizations_url": "https://api.github.com/users/DaMilyutin/orgs", + "repos_url": "https://api.github.com/users/DaMilyutin/repos", + "events_url": "https://api.github.com/users/DaMilyutin/events{/privacy}", + "received_events_url": "https://api.github.com/users/DaMilyutin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2023-05-03T00:21:30Z", + "updated_at": "2023-05-03T00:21:30Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Как известно, у MSVS есть такой визуализатор пользовательских типов [natvis](https://learn.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?source=recommendations&view=vs-2022)\r\nОн отчасти хорош, но не всегда и не всё позволяет (по моему опыту). Например, он не позволяет вызывать функции из кода.\r\nТакже он проприетарный для MSVS. И многоловный.\r\n\r\nХотелось бы более удобный язык описания, например похожий на С++ форматеры и стандартизированный.\r\nНапример, как в Rust есть [trait.Debug](https://doc.rust-lang.org/std/fmt/trait.Debug.html). Или в python есть [repr](https://docs-python.ru/tutorial/vstroennye-funktsii-interpretatora-python/funktsija-repr/).\r\n\r\nТакое полезно будет для отображения пользовательских типов в отладке.\r\n\r\nКод предложить не могу, кроме как по приведённым ссылкам.\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/560/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/560/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/559", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/559/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/559/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/559/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/559", + "id": 1688013765, + "node_id": "I_kwDOFK7cns5knQvF", + "number": 559, + "title": "Добавить новое понятие character types: char, char8_t, wchar_t, char16_t, char32_t, ограничить взаимодействие их с другими арифметическими типами", + "user": { + "login": "raidenluikang", + "id": 24319853, + "node_id": "MDQ6VXNlcjI0MzE5ODUz", + "avatar_url": "https://avatars.githubusercontent.com/u/24319853?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/raidenluikang", + "html_url": "https://github.com/raidenluikang", + "followers_url": "https://api.github.com/users/raidenluikang/followers", + "following_url": "https://api.github.com/users/raidenluikang/following{/other_user}", + "gists_url": "https://api.github.com/users/raidenluikang/gists{/gist_id}", + "starred_url": "https://api.github.com/users/raidenluikang/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/raidenluikang/subscriptions", + "organizations_url": "https://api.github.com/users/raidenluikang/orgs", + "repos_url": "https://api.github.com/users/raidenluikang/repos", + "events_url": "https://api.github.com/users/raidenluikang/events{/privacy}", + "received_events_url": "https://api.github.com/users/raidenluikang/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2023-04-28T07:00:58Z", + "updated_at": "2023-04-28T07:01:29Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Предлагаю новое понятие character types и там добавить типы char, wchar_t, char8_t, char16_t, char32_t. Их надо отделять от integral types. И сильно надо ограничить их взаимодействие с другими арифметическими типами. Возможно запредекатит имплисит конвертация другими типы к character types.\r\n\r\n```\r\nchar c = 'A'; // OK\r\nstd::string s ;\r\n s = c; // OK\r\n \r\n int i = 'B'; // deprecated, use char, or use static_cast('B');\r\n \r\n s = i; // deprecated, use char or use static_cast(i);\r\n \r\n \r\n```\r\n\r\nУже очень надоело такие ошибки.\r\n```\r\nstruct some_param{\r\n std::string progress;\r\n};\r\n....\r\n\r\nvoid foo(some_param& param){\r\n param.progress = 100; // Молча компилируется gcc, clang даже с -Wall , только в -Wconversion показывает варнинг но это уже слишком много ошибок показывает везде даже в библиотечные коды, что теряется там полезные варнингы.\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/559/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/559/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/558", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/558/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/558/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/558/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/558", + "id": 1642779803, + "node_id": "I_kwDOFK7cns5h6tSb", + "number": 558, + "title": "std::system V2", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2023-03-27T20:39:45Z", + "updated_at": "2023-03-27T20:39:45Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "_Запуск программы с контролем выполнения_\r\n\r\n_Часто возникают задачи для запуска внешних программ, где std::system уже недостаточно_\r\n\r\n- Нужно контроллировать поток ввода-вывода\r\n- Контроллировать код возврата\r\n- Переменные среды и аргументы программы\r\n- Ожидание завершения\r\n\r\nПочти во всех языках программирования подобный функционал присутствует из коробки, а тянуть boost.process в проект на C++ ради этого часто не хочется.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/558/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/558/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/557", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/557/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/557/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/557/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/557", + "id": 1641638120, + "node_id": "I_kwDOFK7cns5h2Wjo", + "number": 557, + "title": "Добавить operator[] для tuple.", + "user": { + "login": "blacktea", + "id": 42189825, + "node_id": "MDQ6VXNlcjQyMTg5ODI1", + "avatar_url": "https://avatars.githubusercontent.com/u/42189825?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/blacktea", + "html_url": "https://github.com/blacktea", + "followers_url": "https://api.github.com/users/blacktea/followers", + "following_url": "https://api.github.com/users/blacktea/following{/other_user}", + "gists_url": "https://api.github.com/users/blacktea/gists{/gist_id}", + "starred_url": "https://api.github.com/users/blacktea/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/blacktea/subscriptions", + "organizations_url": "https://api.github.com/users/blacktea/orgs", + "repos_url": "https://api.github.com/users/blacktea/repos", + "events_url": "https://api.github.com/users/blacktea/events{/privacy}", + "received_events_url": "https://api.github.com/users/blacktea/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 4, + "created_at": "2023-03-27T08:27:24Z", + "updated_at": "2023-03-28T04:51:54Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "**Идея**\r\nПредлагаю добавить функцию `operator[](size_t)` в класс std::tuple. Функция, в отличии от std::get, принимает аргумент - индекс значения.\r\nЭто очень упростит пользовательский код т.к. постоянно набирать std::get<>(tuple) - жутко не удобно.\r\n \r\n\r\n\r\n**Пример:**\r\n\r\n\r\n```\r\nstd::tuple tp(1, 3.14);\r\n\r\nfor(size_t i = 0; i < tp.size();++i) {\r\n\r\nstd::cerr << tp[0] << '\\n';\r\n\r\n}\r\n```\r\n\r\nТоже самое, сейчас:\r\n\r\n```\r\nstd::apply([](auto&&... xs) {\r\n ((std::cout << std::forward(xs) << '\\n'), ...); },\r\n tp);\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/557/reactions", + "total_count": 4, + "+1": 3, + "-1": 1, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/557/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/556", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/556/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/556/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/556/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/556", + "id": 1631698877, + "node_id": "I_kwDOFK7cns5hQb-9", + "number": 556, + "title": "Добавить runtime функцию для создания std::variant с типом внутри определяемым по индексу", + "user": { + "login": "ExpertSDR3", + "id": 93903520, + "node_id": "U_kgDOBZjaoA", + "avatar_url": "https://avatars.githubusercontent.com/u/93903520?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/ExpertSDR3", + "html_url": "https://github.com/ExpertSDR3", + "followers_url": "https://api.github.com/users/ExpertSDR3/followers", + "following_url": "https://api.github.com/users/ExpertSDR3/following{/other_user}", + "gists_url": "https://api.github.com/users/ExpertSDR3/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ExpertSDR3/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ExpertSDR3/subscriptions", + "organizations_url": "https://api.github.com/users/ExpertSDR3/orgs", + "repos_url": "https://api.github.com/users/ExpertSDR3/repos", + "events_url": "https://api.github.com/users/ExpertSDR3/events{/privacy}", + "received_events_url": "https://api.github.com/users/ExpertSDR3/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2023-03-20T09:17:37Z", + "updated_at": "2023-03-20T09:17:37Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Мне нужно было реализовать FSM на шаблонах, описывается таблица переходом, из неё извлекаются все типы состояний и для хранения текущего состояния я взял std::veriant, он идеально подходит для этого. Во время выполнения состояния могут переключаться по разному и нужно было реализовать функцию, которая создаёт std::variant с конкретным типом внутри и этот тип определяется индексом. \r\nВ STL есть compiletime решение: `std::variant(std::in_place_index)` , но мне нужен был аналог для runtime.\r\n\r\nБлагодаря сообществу нашлось решение:\r\n\r\n``` C++\r\ntemplate \r\nconstexpr static std::variant make_one_impl(std::index_sequence, std::size_t i) {\r\n return std::array { +[] { return std::variant(std::in_place_index); }... }[i]();\r\n}\r\n\r\ntemplate \r\nconstexpr static std::variant make_one(std::size_t index) {\r\n return make_one_impl(std::index_sequence_for(), index);\r\n}\r\n```\r\nНаписать такое под силу не многим, хотелось бы иметь готовые решения в STL.\r\n\r\n\r\nМоя библиотека FSM:\r\n* https://github.com/ValeraMikhaylovsky/fsm\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/556/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/556/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/555", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/555/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/555/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/555/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/555", + "id": 1631661725, + "node_id": "I_kwDOFK7cns5hQS6d", + "number": 555, + "title": "Добавить runtime функцию для доступа к элементу std::tuple по индексу", + "user": { + "login": "ExpertSDR3", + "id": 93903520, + "node_id": "U_kgDOBZjaoA", + "avatar_url": "https://avatars.githubusercontent.com/u/93903520?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/ExpertSDR3", + "html_url": "https://github.com/ExpertSDR3", + "followers_url": "https://api.github.com/users/ExpertSDR3/followers", + "following_url": "https://api.github.com/users/ExpertSDR3/following{/other_user}", + "gists_url": "https://api.github.com/users/ExpertSDR3/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ExpertSDR3/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ExpertSDR3/subscriptions", + "organizations_url": "https://api.github.com/users/ExpertSDR3/orgs", + "repos_url": "https://api.github.com/users/ExpertSDR3/repos", + "events_url": "https://api.github.com/users/ExpertSDR3/events{/privacy}", + "received_events_url": "https://api.github.com/users/ExpertSDR3/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2023-03-20T08:57:05Z", + "updated_at": "2023-06-21T08:24:09Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "При написании библиотек периодически сталкиваюсь с задачей обращения к экземпляру типа внутри std::tuple по индексу в runtime. Готового решения нет, есть std::apply, который передаёт сразу все экземпляры в функтор в виде аргументов, но мне нужен только один.\r\n\r\nПредположим, есть бинарный протокол управления устройством, имеется набор команд, каждая команда это класс, реализуется некоторый шаблонный класс протокола, которому шаблонными параметрами передаются все команды и они хранятся в std::tuple.\r\n\r\n``` C++\r\ntemplate \r\nstruct protocol_t {\r\n\r\n void process(std::size_t index, std::span bytes) {\r\n std::apply_one([&](auto &&cmd){ \r\n cmd.process(bytes);\r\n }, index, m_commands);\r\n }\r\n\r\nprivate:\r\n std::tuple m_commands;\r\n};\r\n```\r\nПример реализации:\r\n * https://godbolt.org/z/fePaMqTf7\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/555/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/555/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/554", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/554/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/554/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/554/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/554", + "id": 1620703339, + "node_id": "I_kwDOFK7cns5gmfhr", + "number": 554, + "title": "Добавить атрибут для default метки, который будет выдавать warning если не все значения enum обработаны в switch", + "user": { + "login": "adromanov", + "id": 13982171, + "node_id": "MDQ6VXNlcjEzOTgyMTcx", + "avatar_url": "https://avatars.githubusercontent.com/u/13982171?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/adromanov", + "html_url": "https://github.com/adromanov", + "followers_url": "https://api.github.com/users/adromanov/followers", + "following_url": "https://api.github.com/users/adromanov/following{/other_user}", + "gists_url": "https://api.github.com/users/adromanov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/adromanov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/adromanov/subscriptions", + "organizations_url": "https://api.github.com/users/adromanov/orgs", + "repos_url": "https://api.github.com/users/adromanov/repos", + "events_url": "https://api.github.com/users/adromanov/events{/privacy}", + "received_events_url": "https://api.github.com/users/adromanov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2023-03-13T03:53:32Z", + "updated_at": "2023-03-13T04:20:36Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Предложение добавить атрибут для `default` метки, который будет выдавать warning если не все значения `enum` обработаны в `switch`.\r\nКонкретное имя для аттрибута - to be discussed, для примера назовём его `[[enum-switch]]` по аналогии с флагом `gcc` \\ `clang` `-Wenum-switch`\r\n```\r\nenum class Enum { A, B, C };\r\nconst Enum value = get_value();\r\nswitch (value)\r\n{\r\ncase Enum::A: return \"A\";\r\ncase Enum::B: return \"B\";\r\ncase Enum::C: return \"C\";\r\n[[enum-switch]] default: return \"Unknown\";\r\n};\r\n```\r\n\r\nИспользования метки `default` в `switch` по значению `enum` в данный момент можно разделить на 2 категории:\r\n1) Мы явно указываем несколько, но не все значения `enum`, которые хотим обработать, а также хотим иметь логику по умолчанию для всех остальных значений.\r\n2) Мы имеем метки для всех возможных значений `enum`, но имеем метку `default` на случай, _если что-то пошло не так_. Например, мы обрабатываем сообщение от третьей стороны и делаем `switch` по типу сообщения. В большинстве случаев нам будут приходить только те сообщения, которые описаны в протоколе, но в общем случае мы не можем на 100% доверять данным, приходящим извне - невалидные данные могут быть присланы со злым умыслом или повреждены во время передачи.\r\n\r\nДля второй категории новый атрибут будет полезен - при добавлении нового значения в `enum` компилятор предупредит нас о том, что новое значение не обработано в `switch` **даже если есть `default` метка** - так же, как сейчас компиляторы с флагом `-Wenum-switch` предупреждают, если нет метки `default` и не все значения `enum` имеют метки.\r\n\r\nЭтого нельзя добиться дополнительным флагом для компилятора потому что есть случаи, когда мы сознательно не перечисляем остальные значения `enum` (категория 1).\r\n\r\nЖелаемого поведения можно добиться, вынеся код из `default` за пределы `switch`, но в некоторых случаях это усложнит код - например, мы хотим сделать ранний возврат из `default` метки. Поэтому я считаю, что с новым аттрибутом код будет проще и менее подвержен ошибкам.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/554/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/554/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/553", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/553", + "id": 1608377204, + "node_id": "I_kwDOFK7cns5f3eN0", + "number": 553, + "title": "Добавление warning при вызове функции, кидающей исключение, из noexcept функции", + "user": { + "login": "cezarnik", + "id": 20155967, + "node_id": "MDQ6VXNlcjIwMTU1OTY3", + "avatar_url": "https://avatars.githubusercontent.com/u/20155967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/cezarnik", + "html_url": "https://github.com/cezarnik", + "followers_url": "https://api.github.com/users/cezarnik/followers", + "following_url": "https://api.github.com/users/cezarnik/following{/other_user}", + "gists_url": "https://api.github.com/users/cezarnik/gists{/gist_id}", + "starred_url": "https://api.github.com/users/cezarnik/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/cezarnik/subscriptions", + "organizations_url": "https://api.github.com/users/cezarnik/orgs", + "repos_url": "https://api.github.com/users/cezarnik/repos", + "events_url": "https://api.github.com/users/cezarnik/events{/privacy}", + "received_events_url": "https://api.github.com/users/cezarnik/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 10, + "created_at": "2023-03-03T10:28:53Z", + "updated_at": "2023-03-13T12:46:30Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Предложение - чтобы при указании какого-то флага компилятор (```-Wnoexcept-safe```, помощь в названии флага приветствуется) мог указывать, что в такой-то ```noexcept``` функции может быть вызвана функция, кидающая исключение.\r\n\r\nЧасто, когда пишешь код без исключений (например, когда их выкидывание очень сильно влияет на производительность), хочется передавать ошибку как возвращаемый результат (например, через ```std::expected```), а саму функцию помечать как ```noexcept```.\r\nСейчас выкидывание исключения из ```noexcept``` функции приводит к вызову ```std::terminate```. Это делает спецификатор ```noexcept``` очень непрактичным для каких-то нетривиальных функций:\r\nСделав функцию ```A``` ```noexcept```, автор должен быть уверен, что никакие функции, которые он позовёт из ```A```, не должны бросать исключение. Что ещё более страшно, что функции, которые вызываются из ```A```, могут менять свою спецификацию или начать кидать исключения, что ставит ```A``` под угрозу вызова ```std::terminate```\r\nБолее того, все деструкторы обычно noexcept, и изменение любой функции, вызываемой в деструкторе, может вызвать поломку этого кода, поэтому сейчас используются конструкции такого вида\r\n```\r\n~MyClass(){\r\n try {\r\n CallSomeFunctions();\r\n } catch(...) {\r\n // Do nothing.\r\n }\r\n}\r\n```\r\n\r\nМожно оставить реализацию с ```std::terminate``` при таком вызове для обратной совместимости, но для всех желающих компиляция с новым флагом ```-Werror``` позволит избежать таких проблем.\r\n\r\nВ реализации могут быть трудности с определением, кинется ли исключение в случае, если у нас есть try/catch блок в нашей ```noexcept``` функции, который ловит что-то кроме ```...``` - может быть такой случай:\r\n```\r\nclass MyException : public std::exception{};\r\nclass AnotherException : public std::exception{};\r\n\r\nCallSomeFunctions() {\r\n throw AnotherException();\r\n}\r\n\r\n~MyClass(){\r\n try {\r\n CallSomeFunctions();\r\n } catch(const MyException& myEx) {\r\n // Do nothing.\r\n }\r\n}\r\n``` \r\n\r\nВ данном случае вылетит исключение. Чтобы такое понимать, надо для простоты либо считать, что exception может вылететь всегда, если не ловится ```...```, либо поддерживать все виды выбрасывемых типов, и проверять, что они являются наследниками типа, который написан в catch. Второй вариант, мне кажется, не сойдётся, так как может быть всякая экзотика с вызовом std::function, которая, если не пометить её как noexcept (так можно?), может кидать произвольные исключения\r\n\r\nВ случае, если в noexcept функции нет try/catch блоков, то проверка корректности заключается в проверке спецификатора noexcept у всех вызываемых функций. Пример ниже должен кинуть warning (даже если в B ничего не бросается)\r\n\r\n```\r\nA() noexcept {\r\n B();\r\n}\r\n\r\nB() {\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/553/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/553/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/552", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/552/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/552/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/552/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/552", + "id": 1608264494, + "node_id": "I_kwDOFK7cns5f3Csu", + "number": 552, + "title": "Поправить правила преобразования типов", + "user": { + "login": "ssoft-hub", + "id": 21082620, + "node_id": "MDQ6VXNlcjIxMDgyNjIw", + "avatar_url": "https://avatars.githubusercontent.com/u/21082620?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/ssoft-hub", + "html_url": "https://github.com/ssoft-hub", + "followers_url": "https://api.github.com/users/ssoft-hub/followers", + "following_url": "https://api.github.com/users/ssoft-hub/following{/other_user}", + "gists_url": "https://api.github.com/users/ssoft-hub/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ssoft-hub/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ssoft-hub/subscriptions", + "organizations_url": "https://api.github.com/users/ssoft-hub/orgs", + "repos_url": "https://api.github.com/users/ssoft-hub/repos", + "events_url": "https://api.github.com/users/ssoft-hub/events{/privacy}", + "received_events_url": "https://api.github.com/users/ssoft-hub/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2023-03-03T09:30:13Z", + "updated_at": "2023-03-20T19:31:39Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В языке существует особенность, которая проявляется при реализации паттерна Adapter (Proxy, Wrapper).\r\n\r\nПростейшая реализация Proxy, который агрегирует значение и при преобразовании к типу вложенного значения сохраняет свойства rvalue/lvalue и контантность, выглядит следующим образом:\r\n\r\n```cpp\r\ntemplate < typename T >\r\nclass Proxy\r\n{\r\nprivate:\r\n T m_v;\r\n\r\npublic:\r\n T && get () && { return static_cast< T && >(m_v); }\r\n T const && get () const && { return static_cast< T const && >(m_v); }\r\n T & get () & { return m_v; }\r\n T const & get () const & { return m_v; }\r\n};\r\n```\r\n\r\nСлучай для спецификатора volitile добавляет еще 4 варианта методов, но для упрощения здесь не рассматриваются.\r\n\r\nЯвное преобразование типа Proxy к типу вложенного значения с помощью метода get() позволяет бесшовно использовать экземпляры Proxy. Следующий код позволяет в этом убедиться:\r\n\r\n```cpp\r\nclass Data {};\r\nusing ProxyData = Proxy< Data >;\r\n\r\nProxyData foo () { return {}; }\r\nProxyData const cfoo () { return {}; }\r\n\r\nvoid bar ( MyData && other ) {}\r\nvoid bar ( MyData const && other ) {}\r\nvoid bar ( MyData & other ) {}\r\nvoid bar ( MyData const & other ) {}\r\n\r\nint main ()\r\n{\r\n // rvalue / mutable\r\n {\r\n Data data = foo().get();\r\n data = foo().get();\r\n bar( foo().get() );\r\n }\r\n\r\n // rvalue / const\r\n {\r\n Data data = cfoo().get();\r\n data = cfoo().get();\r\n bar( cfoo().get() );\r\n }\r\n\r\n // lvalue / mutable\r\n {\r\n ProxyData proxy;\r\n Data data = proxy.get();\r\n data = proxy.get();\r\n bar( proxy.get() );\r\n }\r\n\r\n // lvalue / const\r\n {\r\n ProxyData const proxy;\r\n Data data = proxy.get();\r\n data = proxy.get();\r\n bar( proxy.get() );\r\n }\r\n}\r\n```\r\n\r\nНе всегда удобно использовать метод get(), особенно при множественном вложении значения в разные Proxy. Хотелось бы использовать экземпляр Proxy в выражениях наравне с экземплярами вложенного типа \"прозрачно\", без явного приведения с помощью метода get().\r\n\r\nЕсли попытаться заменить явный метод get() на пользовательский оператор преобразования типа, то это приведет к ошибкам компиляции для временного экземпляра Proxy (компилятор gcc7 данный код компилирует без ошибок).\r\n\r\n```cpp\r\ntemplate < typename T >\r\nclass Proxy\r\n{\r\nprivate:\r\n T m_v;\r\n\r\npublic:\r\n operator T && () && { return static_cast< T && >(m_v); }\r\n operator T const && () const && { return static_cast< T const && >(m_v); }\r\n operator T & () & { return m_v; }\r\n operator T const & () const & { return m_v; }\r\n};\r\n\r\nclass Data {};\r\nusing ProxyData = Proxy< Data >;\r\n\r\nProxyData foo () { return {}; }\r\nProxyData const cfoo () { return {}; }\r\n\r\nvoid bar ( MyData && other ) {}\r\nvoid bar ( MyData const && other ) {}\r\nvoid bar ( MyData & other ) {}\r\nvoid bar ( MyData const & other ) {}\r\n\r\nint main ()\r\n{\r\n // rvalue / mutable\r\n {\r\n Data data = foo();\r\n data = foo(); // error: ambiguous overload for 'operator='\r\n bar( foo() ); // error: call of overloaded 'bar(ProxyData)' is ambiguous\r\n }\r\n\r\n // rvalue / const\r\n {\r\n Data data = cfoo();\r\n data = cfoo(); // error: ambiguous overload for 'operator='\r\n bar( cfoo() ); // error: call of overloaded 'bar(ProxyData)' is ambiguous\r\n }\r\n\r\n // lvalue / mutable\r\n {\r\n ProxyData proxy;\r\n Data data = proxy;\r\n data = proxy;\r\n bar( proxy );\r\n }\r\n\r\n // lvalue / const\r\n {\r\n ProxyData const proxy;\r\n Data data = proxy;\r\n data = proxy;\r\n bar( proxy );\r\n }\r\n}\r\n```\r\n\r\nТакая ситуация связана с тем, что результат функции foo() одинаково хорошо стандартно преобразуется в ссылку rvalue и константную ссылку lvalue на временный экземпляр Proxy, который в свою очередь может быть одинаково пользовательски преобразован в ссылку rvalue и константную ссылку lvalue на внутреннее значение. Цепочки преобразований равнозначные - компилятор не может выбрать одну из них.\r\n\r\nЕсли стандартизировать преобразование в ссылку rvalue предпочтительнее преобразования в константную ссылку lvalue, то данную ситуацию можно было бы разрешить однозначно верно.\r\n\r\nТакое изменение не привнесет нежелательных побочных эффектов в существующую кодовую базу, так как только уточняет правила связывания временных объектов с сылками (работает в gcc7) и позволит реализовать пользовательские операторы преобразования типов с сохранением свойств rvalue/lvalue и const/volatile.\r\n\r\nСсылка на исходный код [godbolt](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGIAMwArKSuADJ4DJgAcj4ARpjEIACc0gAOqAqETgwe3r4BwemZjgLhkTEs8Ykptpj2JQxCBEzEBLk%2BfkG19dlNLQRl0XEJydIKza3t%2BV3j/YMVVaMAlLaoXsTI7Bzm/hHI3lgA1Cb%2BbmwsJACeJ9gmGgCCd/fjxF4OhwAiTM1PJgDsVgeh2Bn2%2BTEOECWxwB/w%2BTxBoOaEMR4PMADZ0YdUAQEAlDlD/lY/nCgSCvkiICjDmgGONjmYMQysTi8QSYcT4WSwcjyaimdjccR8dCiST7gjeTzuTS6ZiBayRbDfqTgZK5akEt8SMd/B8pUj0XKWUK2RZDsRMAR1gxDgAqHF4BQnM1KlVU9WaohCk56ymSmUEemMtHMwXCwnmy3Wu0Op3%2BF0ct1q/ka4ha726/V8kPyk0iyNW4g2%2B0IR3O6FiiXcj1pr0631UgNB0MKiMWwvF2Pl12PDnx5X3ABuqDw6EOsRaWaDRrDpp7w9H48nfulAllDJnrfZYoXY4nQpXBv5xvD26eu6XB8ba8Dm7zhJ7TwImBYqQMz51bkOBEuGuYbEOAAVHVbgeF43kDZRiFQVRrgeB83WAlgAH1B2dAcEVQVN0yA6cmUhPCQzbKMi0OWZHGQZDRHGE4v2Aw0mRuCAUMHJZu0TcUQSwz1tWApsGJDAj%2BI3RiAQLaNyLwSjqIIWjcOE4MQOY1C2PjCtOWBbja145sCMxYiO0OFj2MrLjsLrPib10qEFPzdto2MtTH0QwjDmAS0IQJESiLE%2BzSMk6SmBo05cIEpSWNUhNTOBSzaVvby3I8oSrLCgyJOaCiqKC2SQti9dFKYiKTI00KmXcwM9NEs0/JtRyopKvL4pDcrPOpFKqvE0i6vU%2BC%2B0BR4Hi8TIjEOKCYMuNVMzG2C5Mm25%2B3gh5pom7l%2BFQVq0tIh8%2Bp6%2B5lv9KzkDWjbfJIm1trhJyOKeCJAxYJgIk834YTdBEEM4hFPsOAB6b7zUHMQvEwH6jK8ZpYnoEqvuBd7obhql0GrTM1shAA6crIXQ174eBRGDWR1BUDRjHIqhnHL0pFGlnRy0CNJ7Gvucj74d%2B/7AeBv6AzJxmXuZ8mEaRvUjsJ4nafpvnybx1FM2FonqZJrGJZx/dKVl0WCDpxX%2BaZ/nWdoAHvA50HwchhnPth/mQX27lUmgmaFqV%2BHJSl%2BtDlt8aaY18XLZBF2fTdu3Lk9zGHZ94EVYDj2SfxLXyZ18m9YNoGQa5s23t5sPRsDg64sj%2B3%2Bsz53BbzoOFdDsO/czd3YOD72w4j6vS7FmPy5xns4fb6GLZx1niCTo2WDBpgIcwbnzYzsOi/xvUqdjn3K5nkW659iOqZbgu4%2ButOQV7/uU5vMf043n2p%2BloXZ9by2F%2BpC/j8tiO1ahZf4fjnu/v19mQcHk3R%2B3mGJ59tbJEjc56W1Pq7EBl9%2BbX0gXffmDdA7r0PiCV%2BLN35705gfP%2BipsEIiAeCJssDkFfXAf7IhuDfbF3IY7OGCDxpIOwZ3HmYoSo1UOBoRWsIOArFoJwQIvA/AcC0KQVAnA3DWGsGRNYGxgY7B4KQAgmhuErAANYgEkAADlRlwP4GiuBmECEkDQaJAgaMCJIaQvCOCSAEUokRnBeAKBABoBRSiVhwFgEgNAr46AJHIJQbxqRfGJGAH8YIWBBxSUwAANTwJgAA7gAeT/JweRNBaDPmIE4iAsQ7GxAiC0S4qTeD5OYMQS4iTYjaEwA4YppBvFsEEIkhgtAilCN4Fge6RhxDtNIPgC0Dg8CDkwE43pmBVA1LBlseRt06h2NoHgWIaZykeCwHYggxA8AsGKSsKgBhgAKFiQk5JjA6n8EECIMQ7ApAyEEIoFQ6hem6C4PoQwxgJGWH0IspxkAVhYQaKMxxdQakNBcAwdwngOh6DCBEIYlQRgvKKFkAQUw/CIoyMihg8xhiJBeXYEFvQJhtEhfkPFwLBkCD6K0bF8LcW2CJaivQsxqWwoWAilYChpGbAkDwvhtjemiI4IcVQGi0QAFo0SSDcsgZAhw/io0CBCXAhBtRyKWLwRR7T3FeNQD4%2BgZAKAQECcElABgjDIQ2V4BgKi%2BmYEiZsI5SSUncF4OkzJ2Tcm9NKYUup3rymVOqbUl19TdWNIIM01pdjOlvJ6cI/pBLhmjOEeMyZz46mzKscIhZSzCmrK2MIjZWydl8H2YcuJTrTnBvOcIUQ4gbnVvuWoOxugzCvKMCgD5Nhs0/MhCI1IAKHHdAJc4CArhGUvJheUHFegkUNHHaQWd2QaWLDJT0SlDKSVoqHRSxoRLl0Ivpf0edzKBisunVwDlXLrm8o4Pw0ggjhGCuFaKiVUr9hvIhJa61UIIDKrrGqjVbjSAQB1XqvxhrjX6pAMAfRraIlRMdScwRaS6DusoJ64Rfq2nyKwwGkFdSGmMHDS0tpcaXwxvzR0vAAzHCJrsSm5AUz02CDmb07NyzLh5vWZs7ZLrdmlsQ86tJshLl1ukA2pQTannqLbe8yw1gvmxB7X8/t2RAWrHWNyi9%2Bg%2BX3rsU%2BkV4rJXStlfo1GZglX4H/WYfwF7ANauA6BoJ%2Br/FGt1c5kY%2BwuBJGQv4ODdqEPlqQ2c1DCQPV5IKeU31kWKlVPw8GwjTSSNRvI90yjfTqMJpGfRiZjG03BozfMxZHGuO9MLbxng/GmAHME5W4TFza3XPE7IRtjzhG6H8LJjt8nPndvgCpgdHAgVrr8KO8F87J1wpXQujFc7N0ztm0us9tKmXkoaFS4leQt34p3Rt/ddKT3Hr3ctldl7NPXp07e/lj7ODPpDCwBQg5ZWDm89ojQEIADqABJKI2Af1/tVTZuzritUrFxEwLAiRe1qMCFwVGGizBcA0X8SQGgkj%2BEkFIQIkrLs2L0wKwdTiXGaq0EsG9Zhru8EFfZ0nKxhlZOyOooAA%3D%3D%3D)\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/552/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/552/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/551", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/551/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/551/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/551/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/551", + "id": 1606427752, + "node_id": "I_kwDOFK7cns5fwCRo", + "number": 551, + "title": "Функция возвращющие размер динамического выделенного массива в частности std::unique_ptr::size() method.", + "user": { + "login": "raidenluikang", + "id": 24319853, + "node_id": "MDQ6VXNlcjI0MzE5ODUz", + "avatar_url": "https://avatars.githubusercontent.com/u/24319853?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/raidenluikang", + "html_url": "https://github.com/raidenluikang", + "followers_url": "https://api.github.com/users/raidenluikang/followers", + "following_url": "https://api.github.com/users/raidenluikang/following{/other_user}", + "gists_url": "https://api.github.com/users/raidenluikang/gists{/gist_id}", + "starred_url": "https://api.github.com/users/raidenluikang/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/raidenluikang/subscriptions", + "organizations_url": "https://api.github.com/users/raidenluikang/orgs", + "repos_url": "https://api.github.com/users/raidenluikang/repos", + "events_url": "https://api.github.com/users/raidenluikang/events{/privacy}", + "received_events_url": "https://api.github.com/users/raidenluikang/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2023-03-02T09:19:57Z", + "updated_at": "2023-03-02T09:19:57Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "При выделение массив динамический способом, компилятор \"знает\" его размер, и хранить его где-то в любом случае.\r\n\r\n```\r\nint arr = new int[444]; // --> 444 где то в памяти хранится, все равно.\r\n\r\n....\r\n\r\ndelete [] arr; // -> Если компилятор \"незнал\" бы размер, здесь он не смог бы удалить весь выделенный память.\r\n```\r\nПредлагаю добавить функция \"извлекающий\" тот размер из памяти.\r\n\r\nТипа того `get_dynamic_array_allocated_size`.\r\n\r\n\r\n_<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>_\r\nЭто очень полезно в std::unique_ptr , теперь там можно добавить size() метод возвращающий размер массива.\r\n\r\n\r\nЭто удобно в std::vector> с стандартнами аллокатаорами, теперь vector capacity можно не хранить, а спросить это из аллокатора.\r\n\r\n_<Код c реализацией вашей идеи, если есть>_\r\n\r\n\r\nПолезные ссылки:\r\n* https://quick-bench.com/ - онлайн бенчмарк, поможет вам продемонстрировать эффективность вашего подхода\r\n* https://godbolt.org/ - онлайн дизассемблер\r\n* https://eel.is/c++draft/ - черновик стандарта C++ с возможностью ссылаться на конкретные параграфы\r\n* https://wg21.link/ - универсальная ссылка на международные proposal или баги в С++, например https://wg21.link/P1000 ссылается на документ P1000, а https://wg21.link/cwg100 на 100 баг в ядре языка\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/551/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/551/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/549", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/549/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/549/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/549/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/549", + "id": 1593881491, + "node_id": "I_kwDOFK7cns5fALOT", + "number": 549, + "title": "RTTI and Exceptions сделать опциональный", + "user": { + "login": "raidenluikang", + "id": 24319853, + "node_id": "MDQ6VXNlcjI0MzE5ODUz", + "avatar_url": "https://avatars.githubusercontent.com/u/24319853?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/raidenluikang", + "html_url": "https://github.com/raidenluikang", + "followers_url": "https://api.github.com/users/raidenluikang/followers", + "following_url": "https://api.github.com/users/raidenluikang/following{/other_user}", + "gists_url": "https://api.github.com/users/raidenluikang/gists{/gist_id}", + "starred_url": "https://api.github.com/users/raidenluikang/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/raidenluikang/subscriptions", + "organizations_url": "https://api.github.com/users/raidenluikang/orgs", + "repos_url": "https://api.github.com/users/raidenluikang/repos", + "events_url": "https://api.github.com/users/raidenluikang/events{/privacy}", + "received_events_url": "https://api.github.com/users/raidenluikang/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2023-02-21T17:49:40Z", + "updated_at": "2023-02-21T18:05:56Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Некоторые страдает изза RTTI и exceptions (исключение), embedded, mobile, ioT разработчики, еще у некоторые компании не разрешается использовать RTTI and exceptions.\r\n\r\n Почти все 3 большие компиляторы (GCC, Clang, MSVC) поддерживает -fno-rtti , -fno-exceptions. Но это не предусмотрено в стандарте, если не ошибаюсь.\r\n\r\nПредлагаю стандартном уровне их сделать опциональные фича, Определить каждый случае без исключение или без RTTI.\r\n\r\nДа это очень трудноёмкая задача, зато точно знаем что будет если включим -fno-rtti, -fno-exceptions.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/549/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/549/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/548", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/548/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/548/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/548/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/548", + "id": 1592852855, + "node_id": "I_kwDOFK7cns5e8QF3", + "number": 548, + "title": "Предварительное описание методов", + "user": { + "login": "osheter", + "id": 87515424, + "node_id": "MDQ6VXNlcjg3NTE1NDI0", + "avatar_url": "https://avatars.githubusercontent.com/u/87515424?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/osheter", + "html_url": "https://github.com/osheter", + "followers_url": "https://api.github.com/users/osheter/followers", + "following_url": "https://api.github.com/users/osheter/following{/other_user}", + "gists_url": "https://api.github.com/users/osheter/gists{/gist_id}", + "starred_url": "https://api.github.com/users/osheter/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/osheter/subscriptions", + "organizations_url": "https://api.github.com/users/osheter/orgs", + "repos_url": "https://api.github.com/users/osheter/repos", + "events_url": "https://api.github.com/users/osheter/events{/privacy}", + "received_events_url": "https://api.github.com/users/osheter/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 7, + "created_at": "2023-02-21T05:49:57Z", + "updated_at": "2023-05-29T15:16:57Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Разрешить предварительное описание методов, не описывая весь класс.\r\nИспользовать вместо pimpl.\r\n\r\n// h-файл\r\n```\r\nclass foo;\r\nint foo::bar() const;\r\n```\r\n\r\n// cpp-файл\r\n```\r\nclass foo\r\n{ \r\npublic:\r\n int bar() const { return 0; }\r\n};\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/548/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/548/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/547", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/547/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/547/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/547/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/547", + "id": 1590263334, + "node_id": "I_kwDOFK7cns5eyX4m", + "number": 547, + "title": "Аттрибут [[pure]] для функций.", + "user": { + "login": "IMMZ", + "id": 1856709, + "node_id": "MDQ6VXNlcjE4NTY3MDk=", + "avatar_url": "https://avatars.githubusercontent.com/u/1856709?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/IMMZ", + "html_url": "https://github.com/IMMZ", + "followers_url": "https://api.github.com/users/IMMZ/followers", + "following_url": "https://api.github.com/users/IMMZ/following{/other_user}", + "gists_url": "https://api.github.com/users/IMMZ/gists{/gist_id}", + "starred_url": "https://api.github.com/users/IMMZ/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/IMMZ/subscriptions", + "organizations_url": "https://api.github.com/users/IMMZ/orgs", + "repos_url": "https://api.github.com/users/IMMZ/repos", + "events_url": "https://api.github.com/users/IMMZ/events{/privacy}", + "received_events_url": "https://api.github.com/users/IMMZ/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2023-02-18T08:49:12Z", + "updated_at": "2023-02-18T11:59:52Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Наряду с аттрибутами [[likely]] и [[unlikely]] было бы неплохо добавить аттрибут [[pure]], чтобы указать, что функция [чистая](https://en.wikipedia.org/wiki/Pure_function), т.е. не имеет побочных эффектов. Это могло бы помочь компиляторам с оптимизацией.\r\n\r\nПример:\r\n[[pure]]\r\nint sum(int a, int b) {\r\n return a + b;\r\n}\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/547/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/547/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/550", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/550/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/550/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/550/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/550", + "id": 1602468826, + "node_id": "I_kwDOFK7cns5fg7va", + "number": 550, + "title": "std::format специализированный типом возвращаемого контейнера.", + "user": { + "login": "XRay3D", + "id": 10693876, + "node_id": "MDQ6VXNlcjEwNjkzODc2", + "avatar_url": "https://avatars.githubusercontent.com/u/10693876?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/XRay3D", + "html_url": "https://github.com/XRay3D", + "followers_url": "https://api.github.com/users/XRay3D/followers", + "following_url": "https://api.github.com/users/XRay3D/following{/other_user}", + "gists_url": "https://api.github.com/users/XRay3D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/XRay3D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/XRay3D/subscriptions", + "organizations_url": "https://api.github.com/users/XRay3D/orgs", + "repos_url": "https://api.github.com/users/XRay3D/repos", + "events_url": "https://api.github.com/users/XRay3D/events{/privacy}", + "received_events_url": "https://api.github.com/users/XRay3D/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2023-02-07T22:16:37Z", + "updated_at": "2023-02-28T06:51:08Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Чтобы можно было использовать сразу\r\n```cpp\r\nuse(std::format(\"...\", ...));\r\n```\r\nвместо использования промежуточных переменных.\r\n```cpp\r\nQString str;\r\nstd::format_to(std::back_inserter(str), \"...\", ...);\r\nuse(str);\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/550/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/550/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/546", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/546/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/546/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/546/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/546", + "id": 1560942208, + "node_id": "I_kwDOFK7cns5dChaA", + "number": 546, + "title": "Функция принудительного завершения времени жизни локальной переменной", + "user": { + "login": "Centimo", + "id": 7148130, + "node_id": "MDQ6VXNlcjcxNDgxMzA=", + "avatar_url": "https://avatars.githubusercontent.com/u/7148130?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Centimo", + "html_url": "https://github.com/Centimo", + "followers_url": "https://api.github.com/users/Centimo/followers", + "following_url": "https://api.github.com/users/Centimo/following{/other_user}", + "gists_url": "https://api.github.com/users/Centimo/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Centimo/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Centimo/subscriptions", + "organizations_url": "https://api.github.com/users/Centimo/orgs", + "repos_url": "https://api.github.com/users/Centimo/repos", + "events_url": "https://api.github.com/users/Centimo/events{/privacy}", + "received_events_url": "https://api.github.com/users/Centimo/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2023-01-28T17:35:30Z", + "updated_at": "2023-01-28T17:36:35Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "**Кратко**\r\nПредлагается добавить в стандарт функцию, которая бы позволяла принудительно завершать время жизни локальной переменной, делая её недоступной для дальнейшего использования. Также предлагается реализовать _copy elision_ (или его аналог) для _xvalues_ вида `const T&&`.\r\n\r\n**Проблема**\r\nНа данный момент в C++ нет возможности убрать из скоупа переменную. В лучше случае, мы можем сделать `std::move`, который оставит после себя обнулённый (в зависимости от определения) объект.\r\nПример:\r\n\r\n```C++\r\n{\r\n std::shared_ptr< Some > local_variable = std::make_shared< Some >(...);\r\n\t\r\n ...\r\n\t\r\n some_function(std::move(local_variable));\r\n\t\r\n ...\r\n\t\r\n local_variable->some_method(); // runtime (!) error\r\n}\r\n```\r\n\r\n**Предложение**\r\nДобавить функцию - пусть это будет, например, `std::drop`, - которая бы возвращала по аналогии с `std::move` _xvalue expression_, но при этом бы гарантировала ошибку компиляции в случае повтороного доступа к переменной. Тогда пример выше можно было бы написать следующим образом:\r\n\r\n```C++\r\n{\r\n /* [const] */ std::shared_ptr< Some > local_variable = std::make_shared< Some >(...);\r\n\t\r\n ...\r\n\t\r\n some_function(std::drop(local_variable)); // тут переменная \"перемещается в функцию\" `some_function`, но удаляется из локального скоупа\r\n\t\r\n ...\r\n\t\r\n // local_variable->some_method(); // _compile_ time (!) error: \"local_variable was dropped before at line ...\"\r\n // auto local_variable{}; // _compile_ time (!) error - переопределение должно быть запрещено\r\n // decltype(local_variable) new_variable{}; // _compile_ time (!) error - такое тоже, вероятно, стоит запретить\r\n}\r\n\r\n```\r\nЕсли сделать переменную `local_variable` константной, то `std::move` теряет свой смысл (константная переменная должна \"обнулиться\", что явно не самый ожидаемый результат), а вот `std::drop` остаётся актуальной - нет смысла заботиться о константности переменной, удалённой из скоупа. То есть функция `std::drop` должна либо преобразовывать `const T&&` в `T&&`, либо реализовать _copy elision_. Последний вариант кажется более удачным.\r\nЕщё один пример для дискуссии:\r\n\r\n```C++\r\n{\r\n std::shared_ptr< Some > local_variable = std::make_shared< Some >(...);\r\n\t\r\n ...\r\n\t\r\n // использование std::drop внутри условных операторов тоже стоит запретить. Как и внутри `switch .. case` и `try ... catch`.\r\n /*\r\n if (is_drop) {\r\n std::drop(local_variable);\r\n }\r\n */ \r\n\t\r\n // Использование функции вместе с её аргументом в тех случаях, когда порядок вычисления не определён, не допускается\r\n // some_function(std::drop(local_variable), local_variable);\r\n ...\r\n\t\r\n // а вот такое, возможно, стоит разрешить\r\n if constexpr (constexpr_is_drop) {\r\n std::drop(local_variable);\r\n }\r\n}\r\n```\r\n\r\nЕщё пример. Рассмотрим следующую структуру:\r\n```C++\r\nstruct Message {\r\n const std::string _text;\r\n\r\n Message() = delete;\r\n Message(const Message&) = delete;\r\n Message(Message&&) = delete;\r\n Message(const Message&&);\r\n Message operator = (Message&&) = delete;\r\n Message operator = (const Message&&);\r\n\t\r\n static std::unique_ptr< Message > make();\r\n};\r\n```\r\n\r\nТут всё просто: сообщение, которое:\r\nа) Константно. Если мы создали сообщение (например, с помощью статического метода класса `Message`), то оно не должно меняться.\r\nб) Существует в единственном экземпляре, для чего мы запретили конструктор копирования.\r\nв) Не может быть пустым, для чего мы запретили конструктор и оператор перемещения и конструктор по умолчанию.\r\n\r\nПусть мы хотим после этого определить следующий тип:\r\n\r\n```C++\r\nstruct Package {\r\n const Message _message;\r\n const int _id;\r\n\t\r\n Package(const Message&& message, int id) \r\n : _message(std::forward< const Message >(message) // копирование, а не перемещение\r\n // : _message(message) // ошибка компиляции (конструктор копирования `Message` удалён)\r\n // : _message(std::forward< Message >(message) // ошибка компиляции (_message константна)\r\n , _id(id)\r\n {}\r\n};\r\n\r\nint main() {\r\n const Message message = ...;\r\n\t\r\n ...\r\n\t\r\n const Package package(std::move(message), 3); // копирование\r\n // const Package package(std::drop(message), 3); // перемещение\r\n}\r\n```\r\n\r\nОшибки компиляции логичны, иначе нарушались бы гарантии константности. Но с функцией `std::drop` можно было бы реализовать перемещение констант.\r\n\r\n**Предложение суммарно:**\r\n1) Добавить функцию, позволяющую удалять локальные переменные из скоупа.\r\n2) Реализовать copy elision (или его аналог) для xvalues вида `const T&&` (с учётом случаев первого пункта).\r\n\r\n**Плюсы:**\r\n1) Появляется возможность сделать код более понятным и безопасным\r\n2) Расширяются возможности при работе с константами\r\n3) Добавляются подсказки для компиляторов/статических анализаторов\r\n\r\n**Минусы:**\r\n1) Возможно, чтобы разделить временные объекты и перемещаемые константы, придётся добавлять новый тип выражений (?)\r\n? ...\r\n\r\n**Обратная совместимость.**\r\nРеализация функции `std::drop` не нарушает обратную совместимость. Расширение _copy elision_ для _xvalues_ вида `const T&&` может нарушить обратную совместимость, если не будет привязано к использованию функции `std::drop`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/546/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/546/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/545", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/545/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/545/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/545/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/545", + "id": 1536359426, + "node_id": "I_kwDOFK7cns5bkvwC", + "number": 545, + "title": "static_print", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815551289, + "node_id": "MDU6TGFiZWwyODE1NTUxMjg5", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%20%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D0%BE%D0%BC", + "name": "Помощь советом", + "color": "FEF2C0", + "default": false, + "description": "Идея прорабатывается другими участниками международного коммитета" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2023-01-17T13:12:35Z", + "updated_at": "2023-02-23T09:16:10Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Почему досих пор нет static_print? Уже 5 лет прошло.\r\n\r\nhttps://github.com/saarraz/static-print\r\n\r\nhttps://www.youtube.com/watch?v=61w4LbQ0fzU\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/545/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/545/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/544", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/544/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/544/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/544/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/544", + "id": 1532818303, + "node_id": "I_kwDOFK7cns5bXPN_", + "number": 544, + "title": "Добавить полезную вещь энумератам.", + "user": { + "login": "ghost", + "id": 10137, + "node_id": "MDQ6VXNlcjEwMTM3", + "avatar_url": "https://avatars.githubusercontent.com/u/10137?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/ghost", + "html_url": "https://github.com/ghost", + "followers_url": "https://api.github.com/users/ghost/followers", + "following_url": "https://api.github.com/users/ghost/following{/other_user}", + "gists_url": "https://api.github.com/users/ghost/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ghost/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ghost/subscriptions", + "organizations_url": "https://api.github.com/users/ghost/orgs", + "repos_url": "https://api.github.com/users/ghost/repos", + "events_url": "https://api.github.com/users/ghost/events{/privacy}", + "received_events_url": "https://api.github.com/users/ghost/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2023-01-13T19:43:21Z", + "updated_at": "2023-03-02T16:39:24Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Сделать enum чуть полезнее, чтобы можно было спокойно получать значение, зная какое значение имеет энумерат.\r\n\r\nДанная вещь будет полезна при создании обработчика событий браузера, написании игровых движков и там, где нужно зная какое значение имеет энумерат, получить значение.\r\n\r\nКак в Rust'е на данный момент:\r\n```\r\nenum DayTime{\r\n \r\n Morning(String),\r\n Evening(String)\r\n}\r\n\r\nfn main(){\r\n//получили откуда-то значение var\r\nmatch var {\r\n Morning(a) => {/* что-то */},\r\n Evening(b) => {/* что-то */}\r\n}\r\n}\r\n```\r\n\r\nКак это выглядело бы в C++:\r\n```\r\nstruct Data{\r\n enum class Types{\r\n WebErrorCode,\r\n LoadedTime\r\n };\r\n Types t;\r\n std::variant values;\r\n};\r\nint main() {\r\n//взяли откуда-то экземпляр типа `Data`\r\nif (d.t == Data::Types::WebErrorCode){\r\n //Тут дальше что-то делаете со значениями\r\n}\r\n}\r\n```\r\n\r\nКак хотелось бы в C++:\r\n```\r\nenum Data{\r\n WebErrorCode(int),\r\n LoadedTime(float)\r\n};\r\n\r\nint main(){\r\n//откуда-то получили данные\r\nif (D == Data::WebErrorCode){\r\n int res = std::get(D); //Если попробовать получить Data::LoadedTime, то кидало бы ошибку компиляции.\r\n //Дальше что-то делаете с этим.\r\n}\r\n}\r\n```\r\n\r\nТакже можно расширить switch, которым никто особо не пользуется, до match как в первом примере.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/544/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/544/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/543", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/543/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/543/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/543/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/543", + "id": 1519447744, + "node_id": "I_kwDOFK7cns5akO7A", + "number": 543, + "title": "in-place set_intersection, set_difference", + "user": { + "login": "loskutov", + "id": 1202012, + "node_id": "MDQ6VXNlcjEyMDIwMTI=", + "avatar_url": "https://avatars.githubusercontent.com/u/1202012?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/loskutov", + "html_url": "https://github.com/loskutov", + "followers_url": "https://api.github.com/users/loskutov/followers", + "following_url": "https://api.github.com/users/loskutov/following{/other_user}", + "gists_url": "https://api.github.com/users/loskutov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/loskutov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/loskutov/subscriptions", + "organizations_url": "https://api.github.com/users/loskutov/orgs", + "repos_url": "https://api.github.com/users/loskutov/repos", + "events_url": "https://api.github.com/users/loskutov/events{/privacy}", + "received_events_url": "https://api.github.com/users/loskutov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2023-01-04T19:07:19Z", + "updated_at": "2023-02-24T19:05:46Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Согласно стандарту, вызов `std::set_intersection` с output range, пересекающимся с input range, [приводит к неопределённому поведению](https://eel.is/c++draft/set.intersection#2), что делает невалидным код вроде:\r\n```cpp\r\n// std::vector lhs, rhs;\r\nlhs.erase(std::set_intersection(lhs.begin(), lhs.end(),\r\n rhs.begin(), rhs.end(),\r\n lhs.begin()),\r\n lhs.end()\r\n);\r\n```\r\n\r\nПри этом желание пересечь два множества, не выделяя дополнительной памяти, является довольно естественным и не накладывает дополнительных ограничений на имплементацию: см. [libstdc++](https://github.com/gcc-mirror/gcc/blob/18f176d0b25591e2880bc5ef453ce0834f9e0e2a/libstdc%2B%2B-v3/include/bits/stl_algo.h#L5261), [libc++](https://github.com/llvm/llvm-project/blob/ed2d3644abee9535eb07333beb1562a651001281/libcxx/include/__algorithm/set_intersection.h#L40) — даже в случае, если output range совпадает с каким-либо из input range, рассматриваемые алгоритмом интервалы (суффиксы исходных) всё равно не пересекаются с заполненной частью output range, и запись туда никак не влияет на последующие чтения.\r\n\r\nАналогичные соображения применимы и к `std::set_difference` (для первого input range) и соответствующим функциям из пространства имён `std::ranges`.\r\n\r\nКонечно, в случае, когда output range начинается строго внутри одного из input ranges, получается что-то странное, и в таком случае ничего не гарантировать выглядит разумным решением. Предлагается переписать preconditions, чтобы UB получалось только в таком случае, а если пересечение имеется, но такое, что input range начинается внутри (возможно, в начале) output range — такие входные данные должны быть допустимыми.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/543/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/543/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/542", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/542/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/542/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/542/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/542", + "id": 1509935658, + "node_id": "I_kwDOFK7cns5Z_8oq", + "number": 542, + "title": "standardize empty base/member optimization", + "user": { + "login": "DaMilyutin", + "id": 44639272, + "node_id": "MDQ6VXNlcjQ0NjM5Mjcy", + "avatar_url": "https://avatars.githubusercontent.com/u/44639272?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/DaMilyutin", + "html_url": "https://github.com/DaMilyutin", + "followers_url": "https://api.github.com/users/DaMilyutin/followers", + "following_url": "https://api.github.com/users/DaMilyutin/following{/other_user}", + "gists_url": "https://api.github.com/users/DaMilyutin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/DaMilyutin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/DaMilyutin/subscriptions", + "organizations_url": "https://api.github.com/users/DaMilyutin/orgs", + "repos_url": "https://api.github.com/users/DaMilyutin/repos", + "events_url": "https://api.github.com/users/DaMilyutin/events{/privacy}", + "received_events_url": "https://api.github.com/users/DaMilyutin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815246228, + "node_id": "MDU6TGFiZWwyODE1MjQ2MjI4", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++20", + "name": "C++20", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++20" + }, + { + "id": 4417430062, + "node_id": "LA_kwDOFK7cns8AAAABB0yiLg", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/breaking-change", + "name": "breaking-change", + "color": "b60205", + "default": false, + "description": "Идея, ломающая валидный имеющийся код или бинарную совместимость" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2022-12-24T04:37:09Z", + "updated_at": "2023-02-23T09:26:38Z", + "closed_at": "2023-02-23T09:25:18Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "_Idea_\r\nWe have EBO for empty base optimization. That reduces memory of object.\r\nIn same way we have [[no_unique_address]] which does similar thing.\r\nHowever, this is not standadrized as behavior. (Or prove me wrong.)\r\n\r\nWhat I'd like to see is default behavior is both for EBO/EMO.\r\n\r\nI think we go wrong way using attributee for EMO where it should be default behavior.\r\nFrom other hand, we can add attribute [[unique_address]] for contrary behavior.\r\n\r\n_Examples_\r\n`struct Empty\r\n{\r\n// methods, typedefs, static stuff...\r\n};\r\n\r\nstruct EmptyBase\r\n{\r\n// methods, typedefs, static stuff...\r\n}\r\n\r\nstruct Derived: EmptyBase // EBO kicks in by default\r\n{\r\n Data data;\r\n Empty empty; // EMO kicks in by default\r\n};\r\n\r\nstruct Derived: [[unique_address]] EmptyBase // attribute stops EBO\r\n{\r\n Data data;\r\n [[unique_address]] Empty empty; // attribute stops EMO\r\n};`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/542/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/542/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/541", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/541/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/541/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/541/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/541", + "id": 1501472334, + "node_id": "I_kwDOFK7cns5ZfqZO", + "number": 541, + "title": "Новое служебное слово", + "user": { + "login": "CGSG-2021-DK6", + "id": 96876822, + "node_id": "U_kgDOBcY5Fg", + "avatar_url": "https://avatars.githubusercontent.com/u/96876822?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/CGSG-2021-DK6", + "html_url": "https://github.com/CGSG-2021-DK6", + "followers_url": "https://api.github.com/users/CGSG-2021-DK6/followers", + "following_url": "https://api.github.com/users/CGSG-2021-DK6/following{/other_user}", + "gists_url": "https://api.github.com/users/CGSG-2021-DK6/gists{/gist_id}", + "starred_url": "https://api.github.com/users/CGSG-2021-DK6/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/CGSG-2021-DK6/subscriptions", + "organizations_url": "https://api.github.com/users/CGSG-2021-DK6/orgs", + "repos_url": "https://api.github.com/users/CGSG-2021-DK6/repos", + "events_url": "https://api.github.com/users/CGSG-2021-DK6/events{/privacy}", + "received_events_url": "https://api.github.com/users/CGSG-2021-DK6/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035671, + "node_id": "MDU6TGFiZWwyODE1MDM1Njcx", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/duplicate", + "name": "duplicate", + "color": "cfd3d7", + "default": true, + "description": "This issue or pull request already exists" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 4, + "created_at": "2022-12-17T16:53:18Z", + "updated_at": "2023-02-24T17:29:51Z", + "closed_at": "2023-02-24T17:29:39Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Новое служебное слово для объявления переменых в классе, которые доступны как константы вне класса, и как обычные не const в методах самого класса.\r\n\r\nДанное решение будет очень удобным для реализации SOLID идеалогии.\r\nСейчас програмисты вынуждены писать так:\r\n\r\nclass A\r\n{\r\n int x;\r\n...\r\npublic:\r\n const int & GetX( void );\r\n}\r\n...\r\nA a;\r\nint x = a.GetX();\r\n\r\nНа обертку каждой переменной класса в больших проектах уходит большое количество времени. Намного удобнее написать одно служебное слово (например extconst (external const))\r\n\r\nclass A\r\n{\r\npublic:\r\n extconst int x;\r\n ...\r\n A( int n)\r\n {\r\n x = n;\r\n }\r\n}\r\n...\r\nA a;\r\nint x = a.x;\r\na.x = 10; // ошибка компиляции\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/541/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/541/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/540", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/540/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/540/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/540/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/540", + "id": 1458579181, + "node_id": "I_kwDOFK7cns5W8Cbt", + "number": 540, + "title": "Стандартизировать девиртуализацию вызовов", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-11-21T21:08:46Z", + "updated_at": "2022-11-21T21:14:04Z", + "closed_at": "2022-11-21T21:14:04Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Нужно стандартизировать девиртуализацию - то есть оптимизацию, когда делается явный вызов метода объекта полиморфического класса без диспетчеризации (т.е. просмотра vtable), если компилятор может доказать, что 100% будет вызван именно этот метод.\r\n\r\nУсловия для девиртуализации строгие - например в одном из кейсов класс должен быть помечен final, и мы должны иметь дело со ссылкой на этот класс. Об этом круче всего написано в этой статье - https://blog.feabhas.com/2022/11/using-final-in-c-to-improve-performance/\r\n\r\nСамый важный для меня кейс - это **девиртуализация вызова виртуального деструктора** для объекта на стеке. Для всех объектов на стеке можно девиртуализовать все вызовы, в том числе деструктор.\r\nЕсли это стандартизировать, это даст возможность компилятору **автоматически делать деструктор виртуальным** (если в классе есть виртуальные методы), это уберет вероятность UB.\r\nТогда не будет такой тупости, что все пишут `virtual ~Foo() = default`, это сделает компилятор за них.\r\n\r\nУ меня есть микро-статья на эту тему - https://t.me/cxx95/67.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/540/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/540/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/539", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/539/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/539/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/539/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/539", + "id": 1405964178, + "node_id": "I_kwDOFK7cns5TzU-S", + "number": 539, + "title": "обобщить `rebind` в стандартной библиотеке", + "user": { + "login": "sigasigasiga", + "id": 48245894, + "node_id": "MDQ6VXNlcjQ4MjQ1ODk0", + "avatar_url": "https://avatars.githubusercontent.com/u/48245894?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sigasigasiga", + "html_url": "https://github.com/sigasigasiga", + "followers_url": "https://api.github.com/users/sigasigasiga/followers", + "following_url": "https://api.github.com/users/sigasigasiga/following{/other_user}", + "gists_url": "https://api.github.com/users/sigasigasiga/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sigasigasiga/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sigasigasiga/subscriptions", + "organizations_url": "https://api.github.com/users/sigasigasiga/orgs", + "repos_url": "https://api.github.com/users/sigasigasiga/repos", + "events_url": "https://api.github.com/users/sigasigasiga/events{/privacy}", + "received_events_url": "https://api.github.com/users/sigasigasiga/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-10-12T10:28:11Z", + "updated_at": "2022-10-21T09:19:54Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "насколько мне известно, изначально для нужд стандартной библиотеки `rebind` был необходим только для аллокаторов. теперь, с грядущим приходом C++23 `rebind` будет необходим ещё и для `std::expected`.\r\n\r\nкак мне кажется, плодить для каждого нуждающегося в `rebind`'е класса отдельный `typedef` -- слишком кривое решение, которое мало того что плохо масштабируется, порождая лишний бойлерплейт, так ещё и выглядит просто ужасно (вспомните про `std::allocator_traits::template rebind_alloc`). хотя ничто не мешает реализовать подобный функционал вообще для всех шаблонов классов сразу\r\n\r\n```С++\r\nnamespace detail {\r\n\r\ntemplate\r\nstruct type_vector{};\r\n\r\ntemplate class T, typename... OldArgs, typename... NewArgs>\r\nT rebind_impl(T&& f, type_vector);\r\n\r\n} // namespace detail\r\n\r\ntemplate\r\nstruct rebind\r\n{\r\n using type = decltype(rebind_impl(std::declval(), detail::type_vector{}));\r\n};\r\n\r\ntemplate\r\nusing rebind_t = typename rebind::type;\r\n\r\nint main()\r\n{\r\n std::allocator int_alloc;\r\n rebind_t double_alloc;\r\n static_assert(std::is_same_v>);\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/539/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/539/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/538", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/538/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/538/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/538/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/538", + "id": 1371071753, + "node_id": "I_kwDOFK7cns5RuOUJ", + "number": 538, + "title": "std::exclusive_or", + "user": { + "login": "dasfex", + "id": 40736909, + "node_id": "MDQ6VXNlcjQwNzM2OTA5", + "avatar_url": "https://avatars.githubusercontent.com/u/40736909?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/dasfex", + "html_url": "https://github.com/dasfex", + "followers_url": "https://api.github.com/users/dasfex/followers", + "following_url": "https://api.github.com/users/dasfex/following{/other_user}", + "gists_url": "https://api.github.com/users/dasfex/gists{/gist_id}", + "starred_url": "https://api.github.com/users/dasfex/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/dasfex/subscriptions", + "organizations_url": "https://api.github.com/users/dasfex/orgs", + "repos_url": "https://api.github.com/users/dasfex/repos", + "events_url": "https://api.github.com/users/dasfex/events{/privacy}", + "received_events_url": "https://api.github.com/users/dasfex/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-09-13T08:35:57Z", + "updated_at": "2022-09-13T19:02:12Z", + "closed_at": "2022-09-13T19:02:12Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "В STL есть ```std::conjunction``` и ```std::disjunction```. Тут покрыты лишь две из трёх основных битовых операций в короткой форме. Однако нет никакого аналога xor-метафунктора (xor по определению не имеет короткой формы, но всё же). \r\n\r\nPossible implementation:\r\n```cpp\r\ntemplate \r\nstruct exclusive_or : exclusive_or> {};\r\n\r\ntemplate \r\nstruct exclusive_or : T {};\r\n\r\ntemplate \r\nstruct exclusive_or {\r\n static constexpr bool value = T::value ^ S::value;\r\n};\r\n\r\ntemplate \r\nconstexpr inline bool exclusive_or_v = exclusive_or::value;\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/538/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/538/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/537", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/537", + "id": 1360271777, + "node_id": "I_kwDOFK7cns5RFBmh", + "number": 537, + "title": "добавить возможность передать владение указателем в/из `std::string` и `std::vector`", + "user": { + "login": "sigasigasiga", + "id": 48245894, + "node_id": "MDQ6VXNlcjQ4MjQ1ODk0", + "avatar_url": "https://avatars.githubusercontent.com/u/48245894?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sigasigasiga", + "html_url": "https://github.com/sigasigasiga", + "followers_url": "https://api.github.com/users/sigasigasiga/followers", + "following_url": "https://api.github.com/users/sigasigasiga/following{/other_user}", + "gists_url": "https://api.github.com/users/sigasigasiga/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sigasigasiga/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sigasigasiga/subscriptions", + "organizations_url": "https://api.github.com/users/sigasigasiga/orgs", + "repos_url": "https://api.github.com/users/sigasigasiga/repos", + "events_url": "https://api.github.com/users/sigasigasiga/events{/privacy}", + "received_events_url": "https://api.github.com/users/sigasigasiga/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 16, + "created_at": "2022-09-02T14:27:11Z", + "updated_at": "2022-12-14T16:21:50Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "C++ хорош тем, что он позволяет без лишней возни и оверхеда использовать C'шные библиотеки. однако в некоторых сценариях межъязыковое взаимодействие всё-таки даёт о себе знать:\r\nпредположим, C'шная библиотека возвращает какой-то буфер, владение которым отдаётся на откуп пользователю, а затем этот буфер надо передать уже в плюсовую библиотеку, которая принимает какой-то contiguous контейнер (например, `std::vector` или `std::string`). в этом случае не видится никакого другого решения, кроме как скопировать буфер из C'шной библиотеки в контейнер, а затем его удалить. копирование на пустом месте!\r\n\r\nпримерно та же история может быть работать в обратную сторону: может потребоваться отдать в C'шную библиотеку владение указателем, который принадлежит `std::vector`'у или `std::string`'у, и в этом случае тоже придётся делать абсолютно бессмысленное копирование.\r\n\r\nпредлагается дать возможность контейнерам более гибко работать с владением буферами.\r\n\r\n**передача владения в контейнер**\r\nнаверное, стоит сделать новый конструктор от четырёх аргументов: `pointer`, `size`, `capacity` и `allocator` -- такой вариант конструктора, насколько я вижу, ещё никем не использован. возможно, лучше бы было добавить статический метод в класс, чтобы его имя лучше отражало суть происходящего, однако судя по тому, что в комитете ни разу подобным образом не поступили, такой вариант вряд ли прийдётся кому-то по душе.\r\n\r\n**передача владения из контейнера**\r\nдля этого, думаю, стоит добавить метод `release` по аналогии с тем, что сейчас есть в `std::unique_ptr`. возвращать он может какую-то структуру (но ни в коем случае не `std::tuple`, использование которого обречёт пользователей на написание `std::get`), которая будет содержать указатель, размер, capacity и аллокатор.\r\n\r\n**аллокаторы**\r\nэти изменения вряд ли будет работать так просто -- в C'шном коде в лучшем случае память выделяется с помощью `malloc`'а и удаляется с помощью `free`, а `std::allocator` делает это с помощью `new` и `delete` соответственно, и между собой эти два варианта аллокации/деаллокации, к сожалению, несовместимы. поэтому, скорее всего, нужно будет добавить в стандартную библиотеку ещё один вариант аллокатора, который использует `malloc` и `free` (а назвать его можно `mallocator`'ом:) ).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/537/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/537/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/536", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/536/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/536/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/536/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/536", + "id": 1356547282, + "node_id": "I_kwDOFK7cns5Q20TS", + "number": 536, + "title": "Улучшение для final_suspend", + "user": { + "login": "MBkkt", + "id": 32071355, + "node_id": "MDQ6VXNlcjMyMDcxMzU1", + "avatar_url": "https://avatars.githubusercontent.com/u/32071355?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/MBkkt", + "html_url": "https://github.com/MBkkt", + "followers_url": "https://api.github.com/users/MBkkt/followers", + "following_url": "https://api.github.com/users/MBkkt/following{/other_user}", + "gists_url": "https://api.github.com/users/MBkkt/gists{/gist_id}", + "starred_url": "https://api.github.com/users/MBkkt/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/MBkkt/subscriptions", + "organizations_url": "https://api.github.com/users/MBkkt/orgs", + "repos_url": "https://api.github.com/users/MBkkt/repos", + "events_url": "https://api.github.com/users/MBkkt/events{/privacy}", + "received_events_url": "https://api.github.com/users/MBkkt/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2022-08-31T00:46:50Z", + "updated_at": "2022-08-31T00:46:50Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В идеальном мире return_value/void и final_suspend это одна функция.\r\n\r\nНа текущий момент времени этого уже сделать нельзя, к тому же возможно имеются сложности в реализации этого на уровне компилятора (из-за эксепшенов).\r\n\r\nПоэтому предлагается позволить писать:\r\n```cpp\r\ntemplate \r\nauto final_suspend();\r\n```\r\n\r\nА компилятор вызовет final_suspend с типом параметра вызванного return_value.\r\nТогда в final_suspend мы можем понять, какая из перегрузок return_value была выбрана.\r\n\r\nhttps://github.com/YACLib/YACLib/issues/189\r\n\r\nЯ столкнулся с тем, что хочу возвращать разные типы в final_suspend.\r\nДля того чтобы реализовать \"future unwrapping\", иначе говоря вернуть асинхронной задачу из асинхронной задачи без ожидания (пусть и неблокирующего)\r\n\r\nПонятно что это не что-то критичное, но почему нет?\r\nК тому же я думаю со временем примеров станет больше.\r\nПо сути сюда подходит любое поведение, которое отличается в зависимости от возвращаемого типа.\r\nНапример возможны оптимизации на не хранение того что у нас есть отмена.\r\nИли запуск ленивой задачи при возврате из асинхронной.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/536/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/536/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/535", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/535/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/535/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/535/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/535", + "id": 1354517507, + "node_id": "I_kwDOFK7cns5QvEwD", + "number": 535, + "title": "Получение имени типа", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2022-08-29T15:48:38Z", + "updated_at": "2022-08-31T20:13:37Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Часто не хватает простого способа получить имя типа в шаблоне. ( например в диагностике static_assert ) Почему бы не добавить nameof который работал бы аналогично size_of, но возвращал бы string_view/char* на имя типа.\r\n\r\n\r\nПолезные ссылки:\r\n* (https://github.com/Neargye/nameof)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/535/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/535/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/534", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/534/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/534/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/534/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/534", + "id": 1353959068, + "node_id": "I_kwDOFK7cns5Qs8ac", + "number": 534, + "title": "Конструкторы с resize/reserve policy для std::vector. ", + "user": { + "login": "dasfex", + "id": 40736909, + "node_id": "MDQ6VXNlcjQwNzM2OTA5", + "avatar_url": "https://avatars.githubusercontent.com/u/40736909?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/dasfex", + "html_url": "https://github.com/dasfex", + "followers_url": "https://api.github.com/users/dasfex/followers", + "following_url": "https://api.github.com/users/dasfex/following{/other_user}", + "gists_url": "https://api.github.com/users/dasfex/gists{/gist_id}", + "starred_url": "https://api.github.com/users/dasfex/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/dasfex/subscriptions", + "organizations_url": "https://api.github.com/users/dasfex/orgs", + "repos_url": "https://api.github.com/users/dasfex/repos", + "events_url": "https://api.github.com/users/dasfex/events{/privacy}", + "received_events_url": "https://api.github.com/users/dasfex/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-08-29T09:14:25Z", + "updated_at": "2023-02-24T07:25:24Z", + "closed_at": "2023-02-24T07:25:24Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Уже несколько лет почти ежедневно пользуюсь std::vector. И очень частая ситуация (95% случаев), когда код выглядит примерно так:\r\n\r\n```cpp\r\nstd::vector data;\r\ndata.reserve(some_value);\r\n```\r\n\r\nИ имхо очень неудобно делать это постоянно в несколько строк. Круто было бы иметь конструктор вроде:\r\n\r\n```cpp\r\nstd::vector data(std::vector::reserve_policy, some_value);\r\n```\r\n\r\nИ можно ```std::vector::resize_policy``` для консистентности. \r\n\r\nТакже такой конструктор сможет сократить код и в некоторых других сценариях:\r\n\r\n```cpp\r\nvoid f(std::vector data) {} // не обращаем внимания на копию\r\n\r\nstd::vector data;\r\ndata.reserve(size);\r\nf(data);\r\n\r\n// vs\r\n\r\nf(std::vector(std::vector::reserve_policy, size));\r\n```\r\n\r\n```cpp\r\nstd::vector> data(size1);\r\nfor (auto& vec : data) {\r\n vec.reserve(size2);\r\n}\r\n\r\n// vs\r\n\r\nstd::vector> data(size1, std::vector(std::vector::reserve_policy, size2));\r\n```\r\n\r\nПодозреваю, это ещё может открыть компилятору возможность немножко больше пооптимизировать код. \r\n\r\nПлюс можно какие-то удобные обёртки теперь писать, где пользователь сам может отдать policy в наш класс, а мы просто пробросим, чтобы не ифать или делать перегрузки. \r\n\r\nРеализация тривиальна. \r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/534/reactions", + "total_count": 5, + "+1": 4, + "-1": 1, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/534/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/533", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/533/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/533/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/533/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/533", + "id": 1352978526, + "node_id": "I_kwDOFK7cns5QpNBe", + "number": 533, + "title": "Неконсистентность вординга касательно equality of value representation", + "user": { + "login": "eoan-ermine", + "id": 47888628, + "node_id": "MDQ6VXNlcjQ3ODg4NjI4", + "avatar_url": "https://avatars.githubusercontent.com/u/47888628?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/eoan-ermine", + "html_url": "https://github.com/eoan-ermine", + "followers_url": "https://api.github.com/users/eoan-ermine/followers", + "following_url": "https://api.github.com/users/eoan-ermine/following{/other_user}", + "gists_url": "https://api.github.com/users/eoan-ermine/gists{/gist_id}", + "starred_url": "https://api.github.com/users/eoan-ermine/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/eoan-ermine/subscriptions", + "organizations_url": "https://api.github.com/users/eoan-ermine/orgs", + "repos_url": "https://api.github.com/users/eoan-ermine/repos", + "events_url": "https://api.github.com/users/eoan-ermine/events{/privacy}", + "received_events_url": "https://api.github.com/users/eoan-ermine/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2022-08-27T08:02:41Z", + "updated_at": "2022-08-27T16:07:17Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "> «Pointers to layout-compatible types shall have the same value representation and alignment requirements» [(3.4) [basic.compound]](https://eel.is/c++draft/basic.compound#3.4)\r\n\r\n> «Evaluates load(order) and compares its value representation for equality against that of old.» [(23.1) [atomics.ref.ops]](https://eel.is/c++draft/atomics.ref.ops#23.1)\r\n\r\nВординг неконсистентен. В одном месте под equality of value representation имеется ввиду то, что кол-во битов в них одинаковое, а в другом то, что эти биты одинаковые.\r\n\r\nПричем в другом месте выражаются вот так: \r\n\r\n> «Each bit of the value representation of the result is equal to the corresponding bit in the object representation of from» [(26.5.3) [bit.cast]](https://eel.is/c++draft/bit.cast#2)\r\n\r\n\r\nТо есть, и [(23.1) [atomics.ref.ops]](https://eel.is/c++draft/atomics.ref.ops#23.1) было бы логично переписать как-то так для устранения неоднозначности: \r\n\r\n> «compares bits of its value representation for equality against these of old»\r\n\r\n\r\nМожно было бы посчитать, что то, что в одном случае речь идёт о количестве, а в другом о значениях битов, понятно из контекста.\r\n\r\nНо это не отменяет того, что в одном случае для того, чтобы обозначить сравнение значений битов value representation используется вординг each bit of the value representation, а в других случаях просто compares its value representation, что вносит лишнюю путаницу.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/533/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/533/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/532", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/532/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/532/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/532/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/532", + "id": 1347100326, + "node_id": "I_kwDOFK7cns5QSx6m", + "number": 532, + "title": "Неявное приведение std::pair к структуре.", + "user": { + "login": "IvanOrfanidi", + "id": 10355755, + "node_id": "MDQ6VXNlcjEwMzU1NzU1", + "avatar_url": "https://avatars.githubusercontent.com/u/10355755?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/IvanOrfanidi", + "html_url": "https://github.com/IvanOrfanidi", + "followers_url": "https://api.github.com/users/IvanOrfanidi/followers", + "following_url": "https://api.github.com/users/IvanOrfanidi/following{/other_user}", + "gists_url": "https://api.github.com/users/IvanOrfanidi/gists{/gist_id}", + "starred_url": "https://api.github.com/users/IvanOrfanidi/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/IvanOrfanidi/subscriptions", + "organizations_url": "https://api.github.com/users/IvanOrfanidi/orgs", + "repos_url": "https://api.github.com/users/IvanOrfanidi/repos", + "events_url": "https://api.github.com/users/IvanOrfanidi/events{/privacy}", + "received_events_url": "https://api.github.com/users/IvanOrfanidi/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 5, + "created_at": "2022-08-22T23:10:32Z", + "updated_at": "2022-08-29T07:41:49Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Неявное приведение std::pair к структуре.\r\n\r\nВозможное продолжение с structured binding и упрощение синтаксиса С++.\r\nПриведение будет работать если типы структуры и pair совпадают, ну и логично количество элементов только 2.\r\n\r\nНапример:\r\n```\r\nint main() {\r\n std::map all_data = {\r\n {\"GPS\", 14},\r\n {\"GLONASS\", 10},\r\n {\"GALILEO\", 8},\r\n };\r\n\r\n struct GPS_Data {\r\n std::string service{};\r\n unsigned num_of_sat = 0;\r\n };\r\n GPS_Data gps = *all_data.begin();\r\n\r\n std::cout << \"Service: \" << gps.service << \", Number of satellites: \" << gps.num_of_sat << std::endl;\r\n}\r\n\r\n```\r\n\r\nВместо:\r\n```\r\n const auto& [service, num_of_sat] = *all_data.begin();\r\n GPS_Data gps = {service, num_of_sat};\r\n```\r\n\r\nВозможные проблемы:\r\nПониманием кода когда структура содержит один элемент std::pair.\r\n\r\n```\r\n struct GPS_Data {\r\n std::pair data;\r\n };\r\n GPS_Data gps = {*all_data.begin()};\r\n```\r\n\r\nТогда запись:\r\n ```GPS_Data gps = {*all_data.begin()};``` против ```GPS_Data gps = *all_data.begin();```\r\n может вызывать неоднозначность.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/532/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/532/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/531", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/531/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/531/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/531/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/531", + "id": 1347072691, + "node_id": "I_kwDOFK7cns5QSrKz", + "number": 531, + "title": " Неявное приведение", + "user": { + "login": "IvanOrfanidi", + "id": 10355755, + "node_id": "MDQ6VXNlcjEwMzU1NzU1", + "avatar_url": "https://avatars.githubusercontent.com/u/10355755?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/IvanOrfanidi", + "html_url": "https://github.com/IvanOrfanidi", + "followers_url": "https://api.github.com/users/IvanOrfanidi/followers", + "following_url": "https://api.github.com/users/IvanOrfanidi/following{/other_user}", + "gists_url": "https://api.github.com/users/IvanOrfanidi/gists{/gist_id}", + "starred_url": "https://api.github.com/users/IvanOrfanidi/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/IvanOrfanidi/subscriptions", + "organizations_url": "https://api.github.com/users/IvanOrfanidi/orgs", + "repos_url": "https://api.github.com/users/IvanOrfanidi/repos", + "events_url": "https://api.github.com/users/IvanOrfanidi/events{/privacy}", + "received_events_url": "https://api.github.com/users/IvanOrfanidi/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2022-08-22T22:34:31Z", + "updated_at": "2022-08-22T22:35:06Z", + "closed_at": "2022-08-22T22:35:06Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "_<Описание вашей идеи>_\r\n\r\n_<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>_\r\n\r\n_<Код c реализацией вашей идеи, если есть>_\r\n\r\n\r\nПолезные ссылки:\r\n* https://quick-bench.com/ - онлайн бенчмарк, поможет вам продемонстрировать эффективность вашего подхода\r\n* https://godbolt.org/ - онлайн дизассемблер\r\n* https://eel.is/c++draft/ - черновик стандарта C++ с возможностью ссылаться на конкретные параграфы\r\n* https://wg21.link/ - универсальная ссылка на международные proposal или баги в С++, например https://wg21.link/P1000 ссылается на документ P1000, а https://wg21.link/cwg100 на 100 баг в ядре языка\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/531/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/531/timeline", + "performed_via_github_app": null, + "state_reason": "not_planned" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/530", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/530/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/530/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/530/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/530", + "id": 1337946733, + "node_id": "I_kwDOFK7cns5Pv3Jt", + "number": 530, + "title": "Замыкания методов без лямбд", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2022-08-13T12:20:52Z", + "updated_at": "2022-08-16T20:58:29Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В C++ валиден такой синтаксис:\r\n\r\n```c++\r\nstruct A\r\n{\r\n int foo(int x);\r\n};\r\n\r\nint bar(int x);\r\n\r\nA a;\r\n(a.foo)(5);\r\n(bar)(5);\r\n```\r\n\r\nПри этом выражение `(bar)` может быть присвоено переменной – это указатель на функцию.\r\n\r\n```c++\r\nauto ptr1 = (bar); // это создаёт функциональный объект (указатель)\r\nptr1(5); // это вызывает функцию\r\n```\r\n\r\n`(a.foo)` – это замыкание, реализованное средствами языка так, что время его жизни крайне короткое, не уверен, что это даже считается выражением. В работе [1] вводится термин _PMFC (pending member function call)_. Чтобы продлить время жизни этой конструкции, её нужно завернуть в лямбда-функцию.\r\n\r\n``` c++\r\nauto ptr2 = [&a](int x) { return (a.foo)(x); }\r\nptr2(5);\r\n```\r\n\r\nЧем больше обобщений требуется, тем больше шаблонов и `&&`-ов будет содержать лямбда. Многословность можно решить через препроцессор со всеми вытекающими проблемами:\r\n\r\n```c++\r\n#define CLOSURE(x) ([&](Args&& ... args) { return (x)(std::forward(args)...); })\r\n\r\n// эквивалентный код:\r\n(a.foo)(5);\r\nCLOSURE(a.foo)(5);\r\n\r\n// можно разделить на две части:\r\nauto ptr3 = CLOSURE(a.foo);\r\nptr3(5);\r\n```\r\n\r\nПомимо общих проблем макросов, нужно учесть и специфику лямбд...\r\n```c++\r\nA* b;\r\nauto questionable = CLOSURE(b->foo);\r\n++b;\r\nquestionable(5); // наш макрос захватывает по ссылке и мы работаем с изменившимся указателем...\r\n```\r\n\r\nПочему бы тогда не задействовать неявный синтаксис, уже наполовину предоставляемый языком, и возложить создание подходящего функционального объекта на компилятор? Сравните с примером `ptr1` выше.\r\n\r\n``` c++\r\nauto ptr4 = (a.foo); // это создаёт функциональный объект \r\nptr4(5); // это вызывает функцию\r\n```\r\n\r\nДля этого в библиотеке нужен такой класс, либо лямбда:\r\n\r\n```c++\r\ntemplate\r\nclass std::call\r\n{\r\npublic:\r\n constexpr std::call(T& ptr, R (T::*mem)(Args...)) : ptr(ptr), mem(mem) {}\r\n\r\n R operator()(Args&& ... args) const\r\n {\r\n return (ptr.*mem)(std::forward(args)...);\r\n }\r\n\r\nprivate:\r\n T& ptr;\r\n R (T::*const mem)(Args...);\r\n};\r\n```\r\n\r\nи способ научить компилятор перетащить аргументы операторов `.`, `->`, `.*`, `->*` в его/её конструктор:\r\n\r\n```c++\r\n/* (a.foo) */ std::call(a, &std::remove_cvref_t::foo);\r\n/* (a->foo) */ std::call(*(a.operator->()), &std::remove_cvref_t()))>::foo);\r\n/* (a.*ptr) */ std::call(a, ptr);\r\n/* (a->*ptr) */ std::call(*a, ptr); // если оператор не перегружен\r\n```\r\n\r\nВозможный вариант — парсить выражение в скобках как `std::pair`, и уже в таком виде подавать в `std::call` (либо отнаследовать его от `std::pair`).\r\n\r\n**Ссылки:**\r\n1. https://www.aristeia.com/Papers/DDJ_Oct_1999.pdf", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/530/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/530/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/529", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/529/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/529/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/529/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/529", + "id": 1337747781, + "node_id": "I_kwDOFK7cns5PvGlF", + "number": 529, + "title": "`operator->*` для типов стандартной библиотеки, имеющих `operator->`", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2022-08-12T22:16:59Z", + "updated_at": "2022-08-16T20:53:26Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "**Предложение**\r\nОпределить `operator->*` для того, что в стандартной библиотеке умеет в `operator->`.\r\nНавскидку вспоминаю `unique_ptr`, `shared_ptr`, `optional`, итераторы.\r\n\r\n```c++\r\ntemplate\r\nR& operator->*(R T::*member) const\r\n{\r\n return this->operator->()->*member;\r\n}\r\n\r\ntemplate\r\nauto operator->*(R (T::*member)(Args...)) const\r\n{\r\n return [ptr=this->operator->(), member](Args&& ... args) { return (ptr->*member)(std::forward(args)...); };\r\n}\r\n\r\ntemplate\r\nauto operator->*(R (T::*member)(Args...) const) const\r\n{\r\n return [ptr=this->operator->(), member](Args&& ... args) { return (ptr->*member)(std::forward(args)...); };\r\n}\r\n```\r\n\r\nКак я догадываюсь, это не было сделано изначально из-за отсутствия лямбд и вариабельных шаблонов, без них решение весьма громоздко [1].\r\n\r\n**Область применения**\r\nЕсли к разным полям хранимой по smart-pointer/итераторам структуры применяются одни и те же алгоритмы, то хочется убрать повторяющийся код и использовать одну (мета-)функцию, принимающую `pointer-to-member` аргументом.\r\nСхожий пример с методами – мультиплицирующий адаптер [2]:\r\n\r\n```c++\r\nclass Interface\r\n{\r\npublic:\r\n virtual void foo(int x) = 0;\r\n virtual void bar(int y, int z) = 0;\r\n // много других функций\r\n};\r\n\r\nclass Adapter : public Interface\r\n{\r\n std::list> children;\r\n\r\npublic:\r\n void foo(int x) override\r\n {\r\n for (auto& e : children)\r\n e->foo(x);\r\n }\r\n\r\n void bar(int y, int z) override\r\n {\r\n for (auto& e : children)\r\n e->bar(y, z);\r\n }\r\n\r\n // и так далее...\r\n};\r\n\r\n// то же, но немного проще:\r\nclass Adapter2 : public Interface\r\n{\r\n std::list> children;\r\n\r\n template\r\n void adapt(Args&& ... args)\r\n {\r\n for (auto& e : children) {\r\n //(e->*f)(std::forward(args)...); // ошибка компиляции!\r\n (*e.*f)(std::forward(args)...); // а это работает\r\n }\r\n }\r\n\r\npublic:\r\n void foo(int x) override { adapt<&Interface::foo>(x); }\r\n void bar(int y, int z) override { adapt<&Interface::bar>(y, z); }\r\n // и так далее, но уже в два раза меньше кода\r\n};\r\n```\r\n\r\nПрожить с `(*e.*f)` вместо `(e->*f)` можно, но хотелось бы полной симметрии с C-указателями.\r\n\r\n**Ссылки**\r\n1. Имплементация такой перегрузки в C++98 от Scott Meyers: https://www.aristeia.com/Papers/DDJ_Oct_1999.pdf\r\n1. Пример для `unique_ptr`: https://godbolt.org/z/oY6joezca\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/529/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/529/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/528", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/528/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/528/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/528/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/528", + "id": 1324519620, + "node_id": "I_kwDOFK7cns5O8pDE", + "number": 528, + "title": "Добавить проверку на выравнивание в std::start_lifetime_as", + "user": { + "login": "John-Jasper-Doe", + "id": 20399224, + "node_id": "MDQ6VXNlcjIwMzk5MjI0", + "avatar_url": "https://avatars.githubusercontent.com/u/20399224?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/John-Jasper-Doe", + "html_url": "https://github.com/John-Jasper-Doe", + "followers_url": "https://api.github.com/users/John-Jasper-Doe/followers", + "following_url": "https://api.github.com/users/John-Jasper-Doe/following{/other_user}", + "gists_url": "https://api.github.com/users/John-Jasper-Doe/gists{/gist_id}", + "starred_url": "https://api.github.com/users/John-Jasper-Doe/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/John-Jasper-Doe/subscriptions", + "organizations_url": "https://api.github.com/users/John-Jasper-Doe/orgs", + "repos_url": "https://api.github.com/users/John-Jasper-Doe/repos", + "events_url": "https://api.github.com/users/John-Jasper-Doe/events{/privacy}", + "received_events_url": "https://api.github.com/users/John-Jasper-Doe/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-08-01T14:28:40Z", + "updated_at": "2023-02-23T09:54:45Z", + "closed_at": "2023-02-23T09:54:37Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Хотелось иметь возможность получения ошибки/предупреждения на этапе компиляции если структура является выровненной, а реальный размер отличается и нет никаких `#pragm` и `__attribute__`.\r\n\r\nНапример:\r\n```cpp\r\n// Case 1\r\nstruct ProtocolHeader {\r\n unsigned char version;\r\n unsigned char msg_type;\r\n unsigned char chunks_count;\r\n};\r\n...\r\n// sizeof (ProtocolHeader) = 3;\r\nProtocolHeader hdr = std::start_lifetime_as(data_from_net.data()); // OK\r\n...\r\n\r\n// Case 2\r\nstruct ProtocolHeader2 {\r\n unsigned int id; \r\n unsigned char version;\r\n unsigned char msg_type;\r\n unsigned char chunks_count;\r\n};\r\n...\r\n// sizeof (ProtocolHeader2) = 8;\r\nProtocolHeader2 hdr = std::start_lifetime_as(data_from_net.data()); // ERROR: Структура выровнена sizeof (ProtocolHeader2) = 8, размер данных = 7 (или что-то в этом роде...)\r\n...\r\n\r\n// Case 3\r\nstruct ProtocolHeader3 {\r\n unsigned int id; \r\n unsigned char version;\r\n unsigned char msg_type;\r\n unsigned char chunks_count;\r\n} __attribute__ ((__packed__)); \r\n...\r\n// sizeof (ProtocolHeader3) = 7;\r\nProtocolHeader3 hdr = std::start_lifetime_as(data_from_net.data()); // OK\r\n...\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/528/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/528/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/527", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/527/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/527/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/527/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/527", + "id": 1322950314, + "node_id": "I_kwDOFK7cns5O2p6q", + "number": 527, + "title": "добавить std::regex .empty()", + "user": { + "login": "marakew", + "id": 3596295, + "node_id": "MDQ6VXNlcjM1OTYyOTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/3596295?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/marakew", + "html_url": "https://github.com/marakew", + "followers_url": "https://api.github.com/users/marakew/followers", + "following_url": "https://api.github.com/users/marakew/following{/other_user}", + "gists_url": "https://api.github.com/users/marakew/gists{/gist_id}", + "starred_url": "https://api.github.com/users/marakew/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/marakew/subscriptions", + "organizations_url": "https://api.github.com/users/marakew/orgs", + "repos_url": "https://api.github.com/users/marakew/repos", + "events_url": "https://api.github.com/users/marakew/events{/privacy}", + "received_events_url": "https://api.github.com/users/marakew/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2022-07-30T09:47:58Z", + "updated_at": "2022-08-03T10:24:10Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "пните комитет добавить метод empty в regex\r\nпроверка установлен ли regex через assign или через конструктор\r\n\r\nскопипастили весь бустовый, но самый главный метод забыли\r\nпри том что во всех трех gcc/clang/msvc имплементациях regex внутреннее представление соответствует boost::regex\r\nгде машина состояний хранится в shared_ptr\r\n\r\nт.е. мини фикс будет приблизительно такой же как и имплементация в boost::regex\r\nпроверка этого shared_ptr на ноль\r\n\r\nbool empty() const { return !_nfa_state; } \r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/527/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/527/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/526", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/526/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/526/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/526/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/526", + "id": 1322248436, + "node_id": "I_kwDOFK7cns5Oz-j0", + "number": 526, + "title": "добавить возможность использовать CTAD в контексте default member initializer", + "user": { + "login": "sigasigasiga", + "id": 48245894, + "node_id": "MDQ6VXNlcjQ4MjQ1ODk0", + "avatar_url": "https://avatars.githubusercontent.com/u/48245894?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sigasigasiga", + "html_url": "https://github.com/sigasigasiga", + "followers_url": "https://api.github.com/users/sigasigasiga/followers", + "following_url": "https://api.github.com/users/sigasigasiga/following{/other_user}", + "gists_url": "https://api.github.com/users/sigasigasiga/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sigasigasiga/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sigasigasiga/subscriptions", + "organizations_url": "https://api.github.com/users/sigasigasiga/orgs", + "repos_url": "https://api.github.com/users/sigasigasiga/repos", + "events_url": "https://api.github.com/users/sigasigasiga/events{/privacy}", + "received_events_url": "https://api.github.com/users/sigasigasiga/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2022-07-29T13:22:57Z", + "updated_at": "2022-07-29T13:23:17Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "_<Описание вашей идеи>_\r\n\r\nв C++17 была добавлена прекрасная фича -- class template argument deduction (CTAD), которая избавила нас от необходимости явно указывать шаблонные параметры у классов:\r\n\r\n```c++\r\nstd::pair before_cpp17{0, 0};\r\nstd::pair after_cpp17{0, 0};\r\n```\r\n\r\nоднако по какой-то причине эта фича не работает, если использовать её в контексте default member initializer:\r\n\r\n```c++\r\nstruct foo_t\r\n{\r\n std::pair m_{0, 0}; // clang: error: use of class template 'pair' requires template arguments; argument deduction not allowed in non-static struct member\r\n};\r\n```\r\n\r\n_<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>_\r\n\r\nярче всего это изменение будет сиять при необходимости параметризации шаблона класса лямбдой:\r\n\r\n```c++\r\ntemplate\r\nstruct function_holder_t\r\n{\r\n F m_fun;\r\n};\r\n\r\ntemplate function_holder_t(F&&) -> function_holder_t;\r\n\r\nfunction_holder_t g_holder{ []{} }; // works just fine\r\n\r\nstruct foo_t\r\n{\r\n function_holder_t m_holder{ []{} };\r\n};\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/526/reactions", + "total_count": 4, + "+1": 4, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/526/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/525", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/525", + "id": 1319381858, + "node_id": "I_kwDOFK7cns5OpCti", + "number": 525, + "title": "Добавить в switch последовательных case-ов", + "user": { + "login": "kov-serg", + "id": 5946122, + "node_id": "MDQ6VXNlcjU5NDYxMjI=", + "avatar_url": "https://avatars.githubusercontent.com/u/5946122?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kov-serg", + "html_url": "https://github.com/kov-serg", + "followers_url": "https://api.github.com/users/kov-serg/followers", + "following_url": "https://api.github.com/users/kov-serg/following{/other_user}", + "gists_url": "https://api.github.com/users/kov-serg/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kov-serg/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kov-serg/subscriptions", + "organizations_url": "https://api.github.com/users/kov-serg/orgs", + "repos_url": "https://api.github.com/users/kov-serg/repos", + "events_url": "https://api.github.com/users/kov-serg/events{/privacy}", + "received_events_url": "https://api.github.com/users/kov-serg/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 20, + "created_at": "2022-07-27T10:55:28Z", + "updated_at": "2022-11-04T09:47:53Z", + "closed_at": "2022-11-04T09:47:53Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Добавить в switch возможность авто увеличения case-ов как у enum-ов\r\n\r\nПримеры:\r\n```\r\nint A::step() {\r\n switch(this->state++) {\r\n default: return 0;\r\n next_case: fn1(); break;\r\n next_case: fn2(); break;\r\n next_case: fn3(); break;\r\n // ...\r\n next_case: fnN(); break;\r\n }\r\n return 1;\r\n}\r\n```\r\nЧто бы не писать индексы явно:\r\n```\r\nint A::step() {\r\n switch(this->state++) {\r\n default: return 0;\r\n case 0: fn1(); break;\r\n case 1: fn2(); break;\r\n case 2: fn3(); break;\r\n // ...\r\n case N: fnN(); break;\r\n }\r\n return 1;\r\n}\r\n```\r\nТак в случае вставки, удаления или перестановки последовательности шагов не надо будет вручную менять индексы. Плюс реализация тривиальна.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/525/reactions", + "total_count": 10, + "+1": 1, + "-1": 2, + "laugh": 0, + "hooray": 0, + "confused": 7, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/525/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/524", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/524/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/524/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/524/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/524", + "id": 1317855652, + "node_id": "I_kwDOFK7cns5OjOGk", + "number": 524, + "title": "backport import std to C++20", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-07-26T08:03:34Z", + "updated_at": "2023-02-23T09:36:25Z", + "closed_at": "2023-02-23T09:36:24Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "В С++20 уже есть модули и import std использует обычный модуль без доработок из С++20, поэтому нет никаких препятствий использовать import std уже в С++20\r\nЭто позволит гораздо быстрее и легче переходить на модули старым проектам и конечно же ускорит компиляцию уже сейчас, а не через 5 лет\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/524/reactions", + "total_count": 3, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/524/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/523", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/523/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/523/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/523/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/523", + "id": 1302064944, + "node_id": "I_kwDOFK7cns5Nm-8w", + "number": 523, + "title": "Пора уже... std::null", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-07-12T13:27:34Z", + "updated_at": "2022-09-26T01:53:15Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Кажется в С++ нарастает количество типов которые... ну как бы \"ничего\"\r\nС++11 `std::nullptr_t` / `nullptr`\r\nC++17 `std::nullopt_t` / `std::nullopt`\r\nalso C++17 `std::monostate` (тоже обозначает \"ничего\" и умеет сравниваться)\r\nВажно отметить ещё `std::npos` `std::string::npos` и прочее, что на практике является обозначением \"ничего\" для `size_t`\r\nТеоретически был бы выгоден ещё `std::nullany`(для `std::any`), но видимо решили не вводить.\r\nХотят добавить линейную алгебру, там неизбежно появится какой то нуллгеомобъект типа точки (-inf;-inf).\r\nКороче кажется постепенно этих штук становится слишком много\r\nТак что я предлагаю универсальное решение этих проблем + задел на будущее\r\n`std::null_t` тип и значение `std::null`\r\nРеализация:\r\n```C++\r\n\r\n template \r\n concept one_of = (std::same_as || ...);\r\n\r\n struct null_t {\r\n // breakes compilation for every other type(such as void*, if it was operators nullptr_t)\r\n template T>\r\n consteval operator T() const noexcept {\r\n return {};\r\n }\r\n };\r\n\r\n constexpr inline null_t null = {};\r\n\r\n```\r\nК тому же это может стать заменой void для описания возвращения ничего из функции, например для уменьшения количества магии на квадратный метр, чтобы добавить в шаблонном коде к некому T ссылку/создать значение типа\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/523/reactions", + "total_count": 12, + "+1": 12, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/523/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/522", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/522/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/522/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/522/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/522", + "id": 1275792509, + "node_id": "I_kwDOFK7cns5MCwx9", + "number": 522, + "title": "Добавить в язык подержку nullability", + "user": { + "login": "klappdev", + "id": 40568872, + "node_id": "MDQ6VXNlcjQwNTY4ODcy", + "avatar_url": "https://avatars.githubusercontent.com/u/40568872?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/klappdev", + "html_url": "https://github.com/klappdev", + "followers_url": "https://api.github.com/users/klappdev/followers", + "following_url": "https://api.github.com/users/klappdev/following{/other_user}", + "gists_url": "https://api.github.com/users/klappdev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/klappdev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/klappdev/subscriptions", + "organizations_url": "https://api.github.com/users/klappdev/orgs", + "repos_url": "https://api.github.com/users/klappdev/repos", + "events_url": "https://api.github.com/users/klappdev/events{/privacy}", + "received_events_url": "https://api.github.com/users/klappdev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815256097, + "node_id": "MDU6TGFiZWwyODE1MjU2MDk3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%92%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5", + "name": "В работе", + "color": "FBCA04", + "default": false, + "description": "Над идеей идёт активная работа в рамках РГ21" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2022-06-18T13:36:58Z", + "updated_at": "2023-06-17T05:33:00Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Неотъемлемой частью языка являются указатели.\r\nИспользование указателей несет некоторые проблемы, в частности: разименование нулевого указателя, работа с нулевым указателями ссылающиеся на поля объекта, и т.д.\r\nКак результат имеем segmentation fault, и долгие часы дебага.\r\n\r\n```C++\r\n int* ptr = nullptr;\r\n int a = *ptr; // segmentation fault\r\n```\r\nПоэтому всегда нужно проверять, является указатель нулевым или нет. \r\n\r\nЧасто программисты из-за невнимательности или сложной логики кода, могут не все случаи проверить валидности указателей.\r\nКак замена указателям в С++, имеются ссылки, умные указатели.\r\nНо иногда без указателей не обойтись, например использование С-библиотек, new/delete и т.д.\r\n\r\nВ Clang попытались решить проблему с указателями, добавив ключевые слова **_Nonnull, _Nullable**. \r\nАтрибуты nullability позволяют статическому анализатору подсказывать, где указатель используется некорректно.\r\n\r\n```C++\r\nint function(_Nonnull int* ptr) {\r\n int a = *ptr; // warning\r\n}\r\n```\r\n\r\n\r\nНо что если в проекте не используется статический анализатор кода, или Clang компилятор. То потенциальные ошибки останутся в коде. Что не очень хорошо.\r\n\r\nЕще одним решение является реализовать оберточки над указателя - **non_null, nullable**. Если указатель, в какой-то момент не валидный, то можно бросить исключения. И в нас уже есть замечательная библиотека **gsl**. \r\n```C++\r\nint function(gsl::non_null ptr) {\r\n int a = *ptr; // throw exception\r\n}\r\n```\r\nНо почему в библитеке нет gsl::nullable. И еще как минус нельзя расширить обработчик ошибок.\r\nНапример, если в проекте используется Java/C++, то хотелось кидать java-исключения с нативным стектрейсом.\r\nhttps://github.com/klappdev/firearrow/blob/master/app/src/main/cpp/util/nullability/NonNull.hpp\r\nhttps://github.com/klappdev/firearrow/blob/master/app/src/main/cpp/util/nullability/Nullable.hpp\r\n\r\nПредлагаю добавить два класса в стандартную библиотеку - **std::non_null**, **std::nullable**. Если указатель, в какой-то момент не валидный, то можно бросить исключения. \r\n\r\n```C++\r\nint function(std::non_null ptr) {\r\n int a = *ptr; // throw exception\r\n}\r\n\r\nint function(std::nullable ptr) {\r\n if (ptr != nullptr) { \r\n int a = *ptr; // ok\r\n }\r\n}\r\n```\r\nТакже добавить функцию std::set_nullability(). Для того, чтобы можно переопределить дефолтное поведения.\r\nПо аналогии с функцией - std::terminate.\r\n\r\nОчень хочется видеть подобные оберточки в С++.\r\n\r\nПолезные ссылки:\r\n* https://github.com/microsoft/GSL/blob/main/include/gsl/pointers\r\n* https://clang.llvm.org/docs/AttributeReference.html#nonnull\r\n* https://github.com/klappdev/firearrow/blob/master/app/src/main/cpp/util/nullability\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/522/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/522/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/521", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/521/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/521/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/521/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/521", + "id": 1268237139, + "node_id": "I_kwDOFK7cns5Ll8NT", + "number": 521, + "title": "Добавить свойства в C++", + "user": { + "login": "klappdev", + "id": 40568872, + "node_id": "MDQ6VXNlcjQwNTY4ODcy", + "avatar_url": "https://avatars.githubusercontent.com/u/40568872?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/klappdev", + "html_url": "https://github.com/klappdev", + "followers_url": "https://api.github.com/users/klappdev/followers", + "following_url": "https://api.github.com/users/klappdev/following{/other_user}", + "gists_url": "https://api.github.com/users/klappdev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/klappdev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/klappdev/subscriptions", + "organizations_url": "https://api.github.com/users/klappdev/orgs", + "repos_url": "https://api.github.com/users/klappdev/repos", + "events_url": "https://api.github.com/users/klappdev/events{/privacy}", + "received_events_url": "https://api.github.com/users/klappdev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 6, + "created_at": "2022-06-11T11:09:07Z", + "updated_at": "2022-08-01T15:10:35Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "При работе с классами, хорошей практикой, является объявление полей закрытыми. Для чтения значения полей из вне, в классе объявляют геттеры. А для записи объявляют сеттеры.\r\n\r\nВозьмём для примера класс QPoint с фреймворка Qt.\r\n```C++\r\nclass QPoint {\r\npublic:\r\n  // construct, dectructor, other\r\n inline int x() const { return xp; }\r\n inline int y() const { return yp; }\r\n inline void setX(int x) { this.xp = x; }\r\n inline void setY(int y) { this.yp = y; } \r\n \r\nprivate:\r\n int xp;\r\n int yp;\r\n};\r\n```\r\nhttps://code.woboq.org/qt5/qtbase/src/corelib/tools/qpoint.h.html\r\n\r\nПри этом в большинстве случаев, геттеры и сеттеры очень простые. И не хочется писать руками.\r\n\r\nДля того, чтобы каждый раз не писать геттеры, сеттеры, ничего не мешает реализовать оберточки. \r\n```C++\r\ntemplate\r\nclass Property {\r\npublic:\r\n constexpr explicit Property(const T& value) : value(value) {}\r\n\r\n constexpr Property& operator=(const T& newValue) {\r\n this->value = newValue;\r\n return *this;\r\n }\r\n\r\n constexpr operator const T&() const { return value; }\r\nprivate:\r\n T value;\r\n};\r\n\r\nclass QPoint {\r\npublic:\r\n  // construct, dectructor, other\r\n \r\n Property x;\r\n Property y;\r\n};\r\n```\r\nhttps://github.com/klappdev/firearrow/blob/master/app/src/main/cpp/util/property/Property.hpp\r\nhttps://github.com/klappdev/firearrow/blob/master/app/src/main/cpp/util/property/Getter.hpp\r\nhttps://github.com/klappdev/firearrow/blob/master/app/src/main/cpp/util/property/Setter.hpp\r\n\r\nКонцепция свойств(геттеров, сеттеров) существует во многих языках, таких например как Swift, Kotlin, C# и д.р., \r\nна уровне языка.\r\nХочется что б в С++ завезли такую возможность на уровне языка. Например, это могло выглядить как в С#.\r\n\r\n```C++\r\nclass QPoint {\r\npublic:\r\n  // construct, dectructor, other\r\nprivate: \r\n int x { set; get; }; \r\n int y { set; get; };\r\n};\r\n```\r\nПредлагаю добавить два контекстных ключевых слова - **set, get**. Которые были бы ключевыми словами, только при объявлении поля класса.\r\nПо аналогии с обычными методам, можно бы объявлять с разными квалификаторами - &, &&, const, volatile, noexcept.\r\nВ случае если нужно не тривиальный геттер, сеттер, то код мог бы выглядеть следующим образом. \r\n```C++\r\nclass QPoint {\r\npublic:\r\n  // construct, dectructor, other\r\nprivate: \r\n int x { \r\n set(int value) {\r\n std::cout << \"invoke setter - x\" << std::endl; \r\n this->x = value;\r\n }; \r\n get() const {\r\n std::cout << \"invoke getter - x\" << std::endl; \r\n return x;\r\n }; \r\n }; \r\n int y { set; get; };\r\n};\r\n```\r\nПод капотом, компилятор генерировал те самые методы геттеры, сеттеры. \r\nСовременный С++ вносит много новых фич, которые позволяет писать меньше шаблонного кода.\r\nКонцепция свойств(геттеров, сеттеров) как раз позволяет писать меньше кода, и при этом код остается таким же читаемым.\r\nОчень хочется видеть в С++.\r\n\r\nПолезные ссылки:\r\n* https://docs.microsoft.com/ru-ru/dotnet/csharp/properties\r\n* https://kotlinlang.org/docs/properties.html\r\n* https://docs.swift.org/swift-book/LanguageGuide/Properties.html\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/521/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/521/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/520", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/520/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/520/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/520/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/520", + "id": 1267431195, + "node_id": "I_kwDOFK7cns5Li3cb", + "number": 520, + "title": "Сделать break N/ continue N для выхода из/продолжения внешних циклов.", + "user": { + "login": "topin89", + "id": 25770107, + "node_id": "MDQ6VXNlcjI1NzcwMTA3", + "avatar_url": "https://avatars.githubusercontent.com/u/25770107?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/topin89", + "html_url": "https://github.com/topin89", + "followers_url": "https://api.github.com/users/topin89/followers", + "following_url": "https://api.github.com/users/topin89/following{/other_user}", + "gists_url": "https://api.github.com/users/topin89/gists{/gist_id}", + "starred_url": "https://api.github.com/users/topin89/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/topin89/subscriptions", + "organizations_url": "https://api.github.com/users/topin89/orgs", + "repos_url": "https://api.github.com/users/topin89/repos", + "events_url": "https://api.github.com/users/topin89/events{/privacy}", + "received_events_url": "https://api.github.com/users/topin89/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2022-06-10T11:41:26Z", + "updated_at": "2022-06-15T21:02:49Z", + "closed_at": "2022-06-15T21:02:48Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Тема выхода/продолжения из внешних циклов довольно древняя, и разные языки решали её по разному. В C/C++ её чаще всего решают через `goto`\r\n\r\n```c++\r\nfor(int x=0; x < width; ++x){\r\n for(int y=0; x < heigh; ++y){\r\n if(img[x][y] != 0 ){\r\n goto img_processed;\r\n }\r\n }\r\n}\r\nimg_processed:\r\n\r\nfor(int x=0; x < width; ++x){\r\n for(int y=0; x < heigh; ++y){\r\n if(img2[x][y] != 0 ){goto column_processed;}\r\n }\r\ncolumn_processed:\r\n}\r\n```\r\n\r\nА также вынося вложенные циклы в отдельную функцию/лямбду и делая `return` для выхода из вложенных циклов. Основная проблема с `goto` даже не с читаемостью, а с тем, что можно легко забыть про метки наружу цикла и сами метки должны быть уникальными, что неудобно при копипасте (вопрос о пользе и вреде копипасты не рассматриваем).\r\n\r\nВ других языках не лучше, где-то это специальные метки для `break`, как в Java или `break varname` в Visual Basic. Где-то просто никак, например в Python.\r\n\r\nИ есть баш.\r\n\r\n```bash\r\nfor folder in folder1 folder2 folder3; do\r\n for file in $folder/*; do\r\n if [ -c $file ]; then\r\n echo \"found char device $file\"\r\n break 2 # <---\r\n fi\r\n done\r\ndone\r\n```\r\n\r\nАбсолютно простое решение проблемы. Хотим указать, что нам выйти из двух вложенных циклов -- берём и указываем. Заодно решается вопрос, как выйти из цикла внутри `switch`. \r\n\r\nВ нашем случае это выглядело бы так:\r\n\r\n```c++\r\nfor(int x=0; x < width; ++x){\r\n for(int y=0; x < heigh; ++y){\r\n if(img[x][y] != 0 ){\r\n break 2;\r\n }\r\n }\r\n}\r\n\r\nfor(int x=0; x < width; ++x){\r\n for(int y=0; x < heigh; ++y){\r\n if(img2[x][y] != 0 ){continue 2;}\r\n }\r\n}\r\n```\r\n\r\nПримеров применения множество. Выход из циклов внутри `switch`. Выход из while, в котором мы ждём прихода массива и если нужный элемент найден покидаем ожидание. Если вбить в гугле `c++ outer loop break`, найдётся 31 миллион результатов. 4 миллиона в Яндексе.\r\n\r\nПри этом по стандарту после break и continue не может быть никаких символов кроме `;` и пробелов, шансов нарушить обратную совместимость очень мало", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/520/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/520/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/519", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/519/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/519/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/519/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/519", + "id": 1247049429, + "node_id": "I_kwDOFK7cns5KVHbV", + "number": 519, + "title": "std::noncopyable", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-05-24T19:46:04Z", + "updated_at": "2022-06-18T12:45:52Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Надоело копипастить это в каждый свой проект, хочется стандартизировать `std::noncopyable`\r\n\r\nЗа эталон можно взять non copyable из CatBoost - https://github.com/catboost/catboost/blob/master/util/generic/noncopyable.h (можно еще `std::move_only`)\r\n\r\nЕсть еще `boost::noncopyable` - https://github.com/boostorg/core/blob/develop/include/boost/core/noncopyable.hpp\r\n\r\nПоискал, вроде такое еще не предлагали (???) - https://github.com/cplusplus/papers/issues?q=is%3Aissue+is%3Aopen+noncopyable+", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/519/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/519/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/518", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/518/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/518/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/518/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/518", + "id": 1237253492, + "node_id": "I_kwDOFK7cns5Jvv10", + "number": 518, + "title": "атрибут заменяющий реализацию benchmark::DoNotOptimize(..)", + "user": { + "login": "gleb-kov", + "id": 41119563, + "node_id": "MDQ6VXNlcjQxMTE5NTYz", + "avatar_url": "https://avatars.githubusercontent.com/u/41119563?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gleb-kov", + "html_url": "https://github.com/gleb-kov", + "followers_url": "https://api.github.com/users/gleb-kov/followers", + "following_url": "https://api.github.com/users/gleb-kov/following{/other_user}", + "gists_url": "https://api.github.com/users/gleb-kov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gleb-kov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gleb-kov/subscriptions", + "organizations_url": "https://api.github.com/users/gleb-kov/orgs", + "repos_url": "https://api.github.com/users/gleb-kov/repos", + "events_url": "https://api.github.com/users/gleb-kov/events{/privacy}", + "received_events_url": "https://api.github.com/users/gleb-kov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2022-05-16T14:32:29Z", + "updated_at": "2022-05-16T14:32:29Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "_<Описание вашей идеи>_\r\nДля бенчмаркинга используют функции clobber и escape (https://youtu.be/nXaxk27zwlk?t=2441). В актуальном google benchmark это функции Clobber и DoNotOptimize. Если Clobber получил адекватную реализацию с с++11 через atomic_signal_fence, то DoNotOptimize все еще остается compiler-specific asm кодом.\r\n\r\n_<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>_\r\n - Стандартизированный способ, который можно использовать в бенчмарках. Сейчас есть несколько способов реализовать эту функцию.\r\n - Хочется форсировать \"грязные вычисления\" для сайд эффектов, но результат выражения бесполезен\r\n\r\n_<Код c реализацией вашей идеи, если есть>_\r\n- Здесь https://github.com/google/benchmark/commit/7b03df7ff76844a39359e9233f31ca8cdb073313 то как поменялась реализация этой функции несколько лет назад\r\n- https://github.com/catboost/catboost/blob/master/util/system/compiler.h#L660\r\n\r\nПолезные ссылки:\r\n* https://quick-bench.com/ - онлайн бенчмарк, поможет вам продемонстрировать эффективность вашего подхода\r\n* https://godbolt.org/ - онлайн дизассемблер\r\n* https://eel.is/c++draft/ - черновик стандарта C++ с возможностью ссылаться на конкретные параграфы\r\n* https://wg21.link/ - универсальная ссылка на международные proposal или баги в С++, например https://wg21.link/P1000 ссылается на документ P1000, а https://wg21.link/cwg100 на 100 баг в ядре языка\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/518/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/518/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/517", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/517/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/517/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/517/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/517", + "id": 1213297940, + "node_id": "I_kwDOFK7cns5IUXUU", + "number": 517, + "title": "std::lifetime", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2022-04-23T13:18:30Z", + "updated_at": "2022-04-23T19:56:39Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В С++ возникла проблема отслеживания лайфтаймов и особенно сильно она проявляется в корутинах, где недостаточно умный компилятор не может оптимизировать аллокацию.\r\nМоя идея поможет с этими проблемами и вроде довольно изящно.\r\nСуть:\r\nПредставим, что корутина по ссылке захватила в себя объект из скоупа, где создана, а в конце корутины обращается по этой ссылке и вызывает скажем метод.\r\nЕсли эта ссылка висячая, то это уб, значит этого не может быть, а значит корутина гарантированно переживает переменную по ссылке(если это валидный код). А значит можно не аллоцировать память для этой корутины и сделать её на стеке.\r\nГрубо говоря:\r\n```C++\r\n// корутина\r\n task Foo(lifetime_t& life) {\r\n scope_exit { life.end() };\r\n/// ...\r\n co_return;\r\n}\r\n\r\nvoid Bar () {\r\n lifetime_t life;\r\n Foo(life);\r\n}\r\n```\r\nТеперь можно добавить к этому немного поддержки стандартной библиотеки\r\n\r\n```C++\r\nconsteval auto std::current_scope() noexcept -> std::lifetime_t;\r\n\r\nstruct life {\r\n [[no_unique_address]] std::lifetime_t& lifetime; // некая компиляторная магия позволяющая ссылке тут быть пустой\r\n ~life() {\r\n std::die(lifetime);\r\n }\r\n};\r\n```\r\nstd::current_scope действует по аналогии с std::current_location() только на компиляции. Возвращает уникальное значение типа std:::lifetime_t, которое умеет сравниваться(чтобы быть использованным в качестве шаблонного параметра)\r\nТогда представим реализацию функции-корутины, возвращающей std::generator, который точно знает что всегда может быть на стеке\r\nИ специальный std::life, который является пустой обёрткой(не занимающей памяти) над std::lifetime_t, которая в деструкторе обращается по ссылке к объекту типа std::lifetime_t\r\n```C++\r\nstd::generator Foo(std::life = std::current_scope()) {\r\n co_yield 5;\r\n// в конце вызывается деструктор life, а если корутина\r\n// пережила скоуп, то это уб(обращение по невалидной ссылке), а значит аллоцировать не нужно\r\n co_return; \r\n}\r\n```\r\n\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/517/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/517/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/516", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/516/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/516/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/516/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/516", + "id": 1207199779, + "node_id": "I_kwDOFK7cns5H9Ggj", + "number": 516, + "title": "magic_get для структур", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035671, + "node_id": "MDU6TGFiZWwyODE1MDM1Njcx", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/duplicate", + "name": "duplicate", + "color": "cfd3d7", + "default": true, + "description": "This issue or pull request already exists" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-04-18T16:12:14Z", + "updated_at": "2022-08-11T17:47:18Z", + "closed_at": "2022-08-11T17:47:05Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Недавно в стандарт был добавлен structured binding.\r\n\r\nПо умолчанию, мы можем биндить поля структур без дополнительного кода.\r\n\r\nТак же мы можем переопределить поведение по-умолчанию реализовав tuple-like интерфейс для класса или для структуры.\r\n\r\nДосадно, что мы не можем воспользоваться tuple интерфейсом, который компилятор уже делает для нас. Предлагаю сделать доступным автосгенерированный tuple интерфейс.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/516/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/516/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/515", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/515/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/515/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/515/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/515", + "id": 1190737100, + "node_id": "I_kwDOFK7cns5G-TTM", + "number": 515, + "title": "Добавить тернарный оператор целочисленного деления", + "user": { + "login": "exldna", + "id": 73162077, + "node_id": "MDQ6VXNlcjczMTYyMDc3", + "avatar_url": "https://avatars.githubusercontent.com/u/73162077?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/exldna", + "html_url": "https://github.com/exldna", + "followers_url": "https://api.github.com/users/exldna/followers", + "following_url": "https://api.github.com/users/exldna/following{/other_user}", + "gists_url": "https://api.github.com/users/exldna/gists{/gist_id}", + "starred_url": "https://api.github.com/users/exldna/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/exldna/subscriptions", + "organizations_url": "https://api.github.com/users/exldna/orgs", + "repos_url": "https://api.github.com/users/exldna/repos", + "events_url": "https://api.github.com/users/exldna/events{/privacy}", + "received_events_url": "https://api.github.com/users/exldna/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2022-04-02T20:54:21Z", + "updated_at": "2022-04-03T09:36:50Z", + "closed_at": "2022-04-03T08:42:52Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Довольно часто при делении целых чисел надо получить не только их частное, но и остаток деления. \r\nПриходится писать что-то вроде:\r\n\r\n // . . .\r\n int x = a / b;\r\n int y = a % b;\r\n // . . .\r\n\r\nПроцессоры i386+ находят оба значения за одну (довольно сложную, дорогостоящую) инструкцию, но у компиляторов не всегда есть все необходимые данные для разбора таких случаев. В результате может сгенерироваться примерно следующий код:\r\n\r\n ; Оптимизирующий компилятор Microsoft (R) C/C++ версии 19.31.31105 для x86 с флагами /EHs /O2\r\n ; . . .\r\n mov\teax, ecx\r\n cdq\r\n idiv\tesi\r\n mov\tBYTE PTR _buf$[esp+12], al\r\n\r\n mov\teax, ecx\r\n cdq\r\n idiv\tesi\r\n mov\tBYTE PTR _buf$[esp+13], dl\r\n ; . . .\r\n\r\nПроцессор дважды считает одну инструкцию, а программисты пишут две почти одинаковых строчки кода. \r\nОбе проблемы можно решить добавлением нового тернарного оператора. Вот пример возможного синтаксиса:\r\n\r\n int y, x = a / b : y;\r\n\r\nЭто позволит нам писать более простой и понятный код, а компиляторам - быть немного оптимальней.\r\n\r\nисходный код примера:\r\n\r\n # include \r\n\r\n int main() {\r\n int* a = new int{10};\r\n int* b = new int{3};\r\n\r\n int c = *a / *b;\r\n int d = *a % *b;\r\n\r\n char buf[2];\r\n buf[0] = '0' + c;\r\n buf[1] = '0' + d;\r\n \r\n HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);\r\n WriteConsole(stdout, buf, 2, nullptr, NULL);\r\n }\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/515/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/515/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/514", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/514/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/514/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/514/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/514", + "id": 1178419440, + "node_id": "I_kwDOFK7cns5GPUDw", + "number": 514, + "title": "Недостающий инструмент динамического полиморфизма в стандарте", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2022-03-23T17:15:07Z", + "updated_at": "2022-03-23T17:37:13Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Мотивация частично описана тут:\r\nhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0957r6.pdf\r\nИ тут :\r\nhttps://github.com/kelbon/AnyAny\r\nЕсли очень кратко - текущие инструменты динамического полиморфизма недостаточны : \r\nвиртуальные функции и код, который с ними получается, не отражает реальных намерений программиста (бесконечные поинтеры, управление памятью, наследование и проч.), \r\nstd::any практически бесполезен (единственная его польза это деструктор, то есть гарантия что что-то удалится). \r\nstd::variant уже гораздо лучше, но неудобен в использовании, плохо расширяем(если добавляется новый тип приходится менять все места его использования), когда типов много визиторы в реальном коде становятся громадными, большие проблемы с исключениями(valueless_by_exception), а если написать std::visit с двумя визиторами можно раздуть бинарник до гигабайтов(что мягко говоря неочевидно для новичков да и опытных...)\r\n\r\nМоё предложение заполняет нишу, где variant плох, а виртуальные функции ужасны. Там, где реально нужен полиморфный **объект**\r\n\r\nПредставим что нужен класс машины, где есть двигатель и его можно менять на рантайме.\r\nКажется наилучшее выражение мысли в коде это\r\n```C++\r\nstruct Machine {\r\n any_engine engine_;\r\n};\r\n```\r\nИ с моим предложением реализация выглядит так:\r\n\r\n```C++\r\ntemplate\r\nstruct Go {\r\n static int do_invoke(T self, int value) {\r\n self.Go(value);\r\n return value * 4;\r\n }\r\n}\r\n\r\nusing any_engine = any_with; // здесь может передаваться произвольное количество методов\r\n```\r\nВызывать методы можно либо через invoke\\(engine); либо написав в классе метод (и тогда будет выглядеть как обычный класс), см. реализацию и readme.\r\nНа мой личный взгляд интерфейс гораздо удобнее чем у предлагаемого std::proxy, при этом у меня есть строгая гарантия исключений(которой нет в std::proxy) и value семантика, реализация судя по бенчмаркам практически такая же по производительности как и variant\r\nАллокатор и размер SOO буфера регулируемы, можно добавлять любое количество методов, реализовывать передачу self по копии(кстати выше в примере с машиной так и происходит) и многое другое\r\n\r\nРеализация тут:\r\n\r\nhttps://github.com/kelbon/AnyAny\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/514/reactions", + "total_count": 4, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 1 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/514/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/513", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/513/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/513/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/513/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/513", + "id": 1153238355, + "node_id": "I_kwDOFK7cns5EvQVT", + "number": 513, + "title": "Новые математические функции: std::sincos, std::invsqrt, std::rem.", + "user": { + "login": "jin-x", + "id": 16954379, + "node_id": "MDQ6VXNlcjE2OTU0Mzc5", + "avatar_url": "https://avatars.githubusercontent.com/u/16954379?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/jin-x", + "html_url": "https://github.com/jin-x", + "followers_url": "https://api.github.com/users/jin-x/followers", + "following_url": "https://api.github.com/users/jin-x/following{/other_user}", + "gists_url": "https://api.github.com/users/jin-x/gists{/gist_id}", + "starred_url": "https://api.github.com/users/jin-x/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/jin-x/subscriptions", + "organizations_url": "https://api.github.com/users/jin-x/orgs", + "repos_url": "https://api.github.com/users/jin-x/repos", + "events_url": "https://api.github.com/users/jin-x/events{/privacy}", + "received_events_url": "https://api.github.com/users/jin-x/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035680, + "node_id": "MDU6TGFiZWwyODE1MDM1Njgw", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/good%20first%20issue", + "name": "good first issue", + "color": "7057ff", + "default": true, + "description": "Несложная на вид идея. Самое то, чтобы попробовать написать на её proposal и помочь РГ21" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-02-27T12:47:12Z", + "updated_at": "2023-03-25T10:30:13Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Предлагаю добавить несколько математических функций:\r\n\r\n• `void std::sincos(double arg, double& sin, double& cos)`, `std::sincos_t std::sincos(double arg)`, `struct sincos_t { double sin, cos; }` (а также sincosf, sincosl) — вычисление синуса и косинуса одной операцией, поскольку зачастую это можно реализовать более быстрым способом, чем последовательное вычисление sin и cos (аналогично как std::div позволяет получить сразу и частное, и остаток). Также будет полезно добавить функции `std::apsin`, `std::apcos`, `std::apsincos`, `std::aptan`, `std::apatan` и `std::apatan2` для приблизительного вычисления синуса, косинуса, тангенса и арктангенса (во многих случаях точность не так важна, а кол-во итераций при использовании рядов Маклорена, используемых для вычисления тригонометрических функций в SIMD, можно уменьшить).\r\n\r\n• `double std::invsqrt(double arg)` (а также invsqrtf, invsqrtl... или `std::arsqrt` от слов \"approximate reciprocal square root\") — приблизительное вычисление обратного квадратного корня (например, в x86 / x86-64 реализуется через SIMD гораздо быстрее, чем вычисление квадратного корня и деления).\r\n\r\n• `double std::rem(double x, double y)` (а также remf, reml) — остаток от деления со знаком делителя (подобное реализовано во многих языках программирования, однако отсутствует в C++).\r\n\r\n \r\n_Примеров применения масса: **работа с векторами, графика** и пр._\r\n \r\n\r\nТесты `sincos`: https://quick-bench.com/q/4eUkcNZ70coSAcrXZTgruclN7Yw (в SIMD одновременное вычисление может быть осуществлено в 2 раза быстрее, чем последовательное, с использованием 2-х ячеек одного регистра: одной для синуса, другой для косинуса).\r\n\r\nТесты `invsqrt`: https://quick-bench.com/q/8_wm4EZ8VLkoQI2hwYPmKd7QDis.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/513/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/513/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/512", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/512/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/512/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/512/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/512", + "id": 1145791827, + "node_id": "I_kwDOFK7cns5ES2VT", + "number": 512, + "title": "enum_cast<>", + "user": { + "login": "Uriev", + "id": 100137073, + "node_id": "U_kgDOBff4cQ", + "avatar_url": "https://avatars.githubusercontent.com/u/100137073?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Uriev", + "html_url": "https://github.com/Uriev", + "followers_url": "https://api.github.com/users/Uriev/followers", + "following_url": "https://api.github.com/users/Uriev/following{/other_user}", + "gists_url": "https://api.github.com/users/Uriev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Uriev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Uriev/subscriptions", + "organizations_url": "https://api.github.com/users/Uriev/orgs", + "repos_url": "https://api.github.com/users/Uriev/repos", + "events_url": "https://api.github.com/users/Uriev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Uriev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2022-02-21T13:19:38Z", + "updated_at": "2022-02-21T13:19:38Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "This conversion verifies incoming integer value against enum or enum class.\r\nPurpose: Type-safe deserialization.\r\n\r\nIf we had an enum type, that implements some external specification, we would perform a complicated verification at the deserialization stage. There is no guarantee, that all enum values are consecutive, so only one overflow/underflow check + static_cast<> may be insufficient.\r\n\r\nLet's take a look at an example:\r\nenum stdcmd\r\n{\r\n run=0x10,\r\n rerun=0x11,\r\n stop=0x20,\r\n// more values here\r\n dbgcn=0xF1,\r\n dbgdm=0xF2,\r\n};\r\nHere we should use switch-case deserialization or several overflow/underflow checking. Both implementations are clumsy and fragile (if the enum is changeable).\r\n\r\nTherefore enum_cast simplifies the verification:\r\n1. During compile time it checks, if all enum's values are unique,\r\n2. At runtime it verifies, an incoming integer corresponds to the correct enum value, throwing std::bad_cast overwise.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/512/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/512/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/511", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/511/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/511/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/511/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/511", + "id": 1134193485, + "node_id": "I_kwDOFK7cns5DmmtN", + "number": 511, + "title": "Общий интерефейс компайл тайм sized контейнеров", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815246228, + "node_id": "MDU6TGFiZWwyODE1MjQ2MjI4", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++20", + "name": "C++20", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++20" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-02-12T15:38:23Z", + "updated_at": "2022-02-19T10:42:56Z", + "closed_at": "2022-02-19T10:42:56Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "\r\nВ стародавние времена по неизвестной никому причине у `std::array` метод size не сделали `static`. Что конечно ломает ожидания человека, который логически предполагает, что узнать размер массива можно и без объекта такого массива( особенно в шаблонном коде )\r\nДля std:;array есть кривое решение - специализация `std::tuple_size_v`. А вот для std::span и метод `size` не `static` и специализации `tuple_size_v` нет. Зато есть какой то бесполезный `static constexpr size_t extent;`\r\nПредлагаю депрекейтнуть этот extent нахрен, добавить специализацию `tuple_size_v` для `std::span` и \"удалённую\" специализацию для `std::span;`\r\nДобавление static не предлагаю т.к. разоруться представители ABI,\r\nПолучим общий интерфейс для похожих вещей, оправдаются ожидания новичков, которые думают что можно без объекта класса у которого размер записан в типе получить его размер(без заморочек)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/511/reactions", + "total_count": 3, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/511/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/510", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/510/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/510/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/510/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/510", + "id": 1130405689, + "node_id": "I_kwDOFK7cns5DYJ85", + "number": 510, + "title": "Сборщик мусора", + "user": { + "login": "Andreyproger", + "id": 3163176, + "node_id": "MDQ6VXNlcjMxNjMxNzY=", + "avatar_url": "https://avatars.githubusercontent.com/u/3163176?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Andreyproger", + "html_url": "https://github.com/Andreyproger", + "followers_url": "https://api.github.com/users/Andreyproger/followers", + "following_url": "https://api.github.com/users/Andreyproger/following{/other_user}", + "gists_url": "https://api.github.com/users/Andreyproger/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Andreyproger/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Andreyproger/subscriptions", + "organizations_url": "https://api.github.com/users/Andreyproger/orgs", + "repos_url": "https://api.github.com/users/Andreyproger/repos", + "events_url": "https://api.github.com/users/Andreyproger/events{/privacy}", + "received_events_url": "https://api.github.com/users/Andreyproger/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2022-02-10T16:20:01Z", + "updated_at": "2022-04-03T08:46:26Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Сборщик мусора либо помечать участки не используемой памяти, чтобы избежать memory leak. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/510/reactions", + "total_count": 3, + "+1": 0, + "-1": 3, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/510/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/509", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/509/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/509/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/509/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/509", + "id": 1129533567, + "node_id": "I_kwDOFK7cns5DU1B_", + "number": 509, + "title": "std::expected должен позволять выкидывать неизменённое пользовательское исключение", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2022-02-10T06:48:21Z", + "updated_at": "2022-04-03T08:47:00Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "Нужна возможность кастомизации выкидывания исключения. Обсуждение доступно по ссылке https://habr.com/ru/company/yandex/blog/649497/#comment_24051655\r\n\r\nВ идеале, нужна кастомизация, позволяющая превращать коды ошибок в исключения. Черновой интерфейс:\r\n```cpp\r\nstruct throw_bad_expected_acess {\r\n template \r\n [[noreturn]] void operator()(E&& e) const {\r\n throw bad_expected_access(std::forward(e))\r\n }\r\n};\r\n\r\ntemplate class expected;\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/509/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/509/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/508", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/508/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/508/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/508/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/508", + "id": 1128263736, + "node_id": "I_kwDOFK7cns5DP_A4", + "number": 508, + "title": "Добавить в std::runtime_error и std::logic_error (и их наследников) конструктор, который получает std::string_view", + "user": { + "login": "eao197", + "id": 11836621, + "node_id": "MDQ6VXNlcjExODM2NjIx", + "avatar_url": "https://avatars.githubusercontent.com/u/11836621?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/eao197", + "html_url": "https://github.com/eao197", + "followers_url": "https://api.github.com/users/eao197/followers", + "following_url": "https://api.github.com/users/eao197/following{/other_user}", + "gists_url": "https://api.github.com/users/eao197/gists{/gist_id}", + "starred_url": "https://api.github.com/users/eao197/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/eao197/subscriptions", + "organizations_url": "https://api.github.com/users/eao197/orgs", + "repos_url": "https://api.github.com/users/eao197/repos", + "events_url": "https://api.github.com/users/eao197/events{/privacy}", + "received_events_url": "https://api.github.com/users/eao197/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 6, + "created_at": "2022-02-09T09:18:28Z", + "updated_at": "2022-02-12T11:53:13Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Судя по документации на cppreference и по драфту стандарта (раздел 19.2) у [std::runtime_error](https://en.cppreference.com/w/cpp/error/runtime_error) и [std::logic_error](https://en.cppreference.com/w/cpp/error/logic_error) есть конструкторы, которые получают `const std::string&` и `const char *` (при этом подразумевается, что `const char*` -- это строка с 0-символом в конце). Но нет конструктора, который бы получал `std::string_view`.\r\n\r\nПосле добавления в стандарт `std::string_view` выглядит странно, что стандартные классы исключений не могут получать описание ошибки в виде `std::string_view`.\r\n\r\nОтсутствие такого конструктора создает неудобства, например, в таких случаях:\r\n```cpp\r\n// Throws an exception if operation can't be started.\r\nvoid ensure_valid_state_for_operation(std::string_view operation_description) {\r\n if(!check_first_condition()) throw std::runtime_error{operation_description};\r\n if(!check_second_condition()) throw std::runtime_error{operation_description};\r\n ...\r\n}\r\n```\r\nТакой код не скомпилируется. Нужно будет делать преобразование из string_view в string, но при этом мы можем получить две аллокации: первая при создании временного string, вторая -- при создании еще одной копии внутри runtime/logic_error (т.к. string принимается по константной ссылке и содержимое временного string-а не может быть перемещено внутрь runtime/logic_error).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/508/reactions", + "total_count": 3, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/508/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/507", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/507", + "id": 1118345021, + "node_id": "I_kwDOFK7cns5CqJc9", + "number": 507, + "title": "Уточнить условие \"inline-hint\" для inline-функций", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 8, + "created_at": "2022-01-29T22:43:57Z", + "updated_at": "2022-01-30T11:38:01Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Так вышло, что сейчас в C++ ключевое слово `inline` для функций (точнее, само понятие `inline`-функции) наделяет их двумяя абсолютно ортогональными друг другу effective смыслами. Понятно, что один смысл вытек из другого, но все равно это раздельные сущности. Это:\r\n\r\n1. [\\[dcl.inline\\].2](https://eel.is/c++draft/dcl.inline#2): Подсказка компилятору о том, что более предпочтительна подстановка кода из функции в место вызова, чем сам вызов функции. (В компиляторе Clang в LLVM IR этот атрибут у функции называется `inlinehint`)\r\n2. [\\[dcl.inline\\].6](https://eel.is/c++draft/dcl.inline#6): Правило, что у функции может быть несколько _определений_ (_definition_) за программу. Для отсутствия UB это должны быть одинаковые определения - что естественным образом соблюдается, т.к. обычно метод определен в хидере. (В компилятора атрибут у функции называется `linkonce_odr`, для удобства далее `linkonce`)\r\n\r\nИтого условно у функции есть два атрибута - `inlinehint` и `linkonce`.\r\n\r\n**Проблема в том, что:**\r\nСтандарт написан так, что `inlinehint` дается только функциям, где явно написан спецификатор `inline`.\r\n\r\nClang выполняет именно это, т.е. `inlinehint` ставится тогда и только тогда, когда есть спецификатор `inline`.\r\n\r\nТо есть получается вот что: `inline int random() { return 4; }` будет **И** `inlinehint`, **И** `linkonce`.\r\n\r\nА вот методы, которые по Стандарту _implicit inline functions_, как то:\r\n\r\n- инстанциации шаблонов\r\n- default и deleted члены классов, и их неявные методы\r\n- методы, чей _definition_ находится внутри _definition_ класса\r\n- `constexpr`- и `consteval`-функции (на самом деле только `constexpr`, т.к. `consteval` \"испаряется\" и в LLVM IR его тупо нету)\r\n\r\nОни **только** `linkonce`. Надо все равно писать ключевое слово `inline`, чтобы было `linkonce`+`inlinehint`.\r\n\r\nОтсюда возникают разные неприкольные штуки:\r\n1. Стандарт пишет, что такие-то методы являются _implicitly inline_, но по факту разница между `constexpr int foo()` и `inline constexpr int foo()` **есть**, это гига контринтуитивно звучит.\r\n2. Пусть у нас функция \"обычная\" (не входит в список _implicitly inline_), мы хотим чтобы она была `linkonce`, но не хотим чтобы она была `inlinehint` (т.е. чтобы компилятор ее заоптимайзил сам по-нормальному). То мы **не можем** этого сделать, функция по-любому будет `linkonce`+`inlinehint`.\r\n\r\nМетоды починки:\r\n1. **Status quo** (не хотелось бы такого): все остаётся как есть\r\n2. **Малый путь** (я имхо верю в него): `inlinehint` объявляется для всех _inline functions_ независимо от способа, каким они стали _inline functions_ (т.е. неважно был ли у них написан спецификатор `inline` или нет)\r\n3. **Большой путь** (я в него не особо верю): вводится новое ключевое слово `linkonce`, понятие _inline functions_ переименовывается в _linkonce functions_, всё остальное остаётся по-прежнему. Если keyword `inline` наделяет метод атрибутами `inlinehint`+`linkonce`, то keyword `linkonce` мог бы наделять его только атрибутом `linkonce`.\r\n\r\n(По методам надо провести голосование и потом доработать paper в сторону выбора)\r\n\r\n**Ответы на возможные вопросы:**\r\n1. **Компиляторы же давно не обращают внимание на \"подсказки\" от программистов**\r\nЯ тоже так думал, но оказалось что нет, если в 2022 году запустить Clang под флагами без оптимизации LLVM IR, то атрибут `inlinehint` можно увидеть. А в самом LLVM IR он судя по исходникам таки влияет на анализ каких-то костов, т.е. это не дохлый атрибут.\r\n\r\n2. **Почему один атрибут вытекает из другого, если они ортогональны?**\r\nЧтобы компилятор мог в translation unit заинлайнить (`inlinehint`) функцию, TU нужно \"видеть\" исходник этой функции, то есть её тело. В общем случае это невозможно обеспечить, потому что если у нас N штук TU, то будет N определений одной и той же функции и линкер сломается. Поэтому эта функция должна являться `linkonce`, чтобы не нарушился ODR.\r\n\r\nТакая же логика для `constexpr`-функций - TU должен \"видеть\" ее, чтобы вычислить в compile-time, поэтому тут уж удобнее сделать `linkonce` автоматически.\r\n\r\nКонечно, можно было бы подойти с другого пути и объявлять такие функции `static`, но это все равно немного не то - а если внутри `static`-функции есть статические переменные, то они будут займут память не 1 раз, а N раз, и будут не \"расшариваемы\" среди разных TU.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/507/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/507/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/506", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/506/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/506/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/506/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/506", + "id": 1118239110, + "node_id": "I_kwDOFK7cns5CpvmG", + "number": 506, + "title": "Определить `template std::string_view::string_view(const char (&)[N]);`", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035680, + "node_id": "MDU6TGFiZWwyODE1MDM1Njgw", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/good%20first%20issue", + "name": "good first issue", + "color": "7057ff", + "default": true, + "description": "Несложная на вид идея. Самое то, чтобы попробовать написать на её proposal и помочь РГ21" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-01-29T14:46:44Z", + "updated_at": "2022-02-05T11:22:32Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "C-массив можно инициализировать литералом или списком:\r\n```c++\r\nconst char array1[] = \"abcdefgh\";\r\nconst char array2[8] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};\r\n```\r\n\r\nКонструктор `std::string_view` неявно преобразует ссылку на C-массив в `const char*`.\r\nДля `array1` вызовется `strlen` (использовать `N` не будем, т.к. внутри литерала может быть `\\0`).\r\n`array2` же не нуль-терминирован, и вызовет неопределённое поведение.\r\n\r\nПоэтому предлагается определить более безопасный конструктор:\r\n```c++\r\ntemplate\r\ntemplate\r\nconstexpr std::basic_string_view::basic_string_view(const CharT (& array)[N])\r\n : basic_string_view(array, std::find(std::begin(array), std::end(array), CharT{}) - std::begin(array))\r\n{ }\r\n```\r\n\r\nТекущее поведение меняется только там, где оно уже было неопределённым.\r\nЕсли не делегировать конструкторы, а инициализировать поля, то можно добавить `noexcept`.\r\n\r\nМотивационный пример с UB: https://godbolt.org/z/exYY8G997\r\n\r\nP. S. Для общности можно добавить `template std::char_traits::length(const CharT* const, size_t max_length)`. Хотя там уже есть `find`…", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/506/reactions", + "total_count": 4, + "+1": 4, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/506/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/505", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/505/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/505/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/505/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/505", + "id": 1110782742, + "node_id": "I_kwDOFK7cns5CNTMW", + "number": 505, + "title": "Добавить в стандарт специализацию std::formatter для thread_id", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2022-01-21T18:49:48Z", + "updated_at": "2023-02-23T10:37:40Z", + "closed_at": "2023-02-23T10:37:17Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Очевидно, что всё что умеет выводиться в потоки (имеет оператор << для стримов) должно уметь выводиться и в std::format, но на данный момент вот этот код, который по сути делает одно и то же, не компилируется.(формат не умеет работать с этим типом)\r\n```cpp\r\n std::cout << std::this_thread::get_id();\r\n std::cout << std::format(\"{}\", std::this_thread::get_id());\r\n```\r\nВ предложениях в С++23 не увидел этого", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/505/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/505/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/504", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/504", + "id": 1110266279, + "node_id": "I_kwDOFK7cns5CLVGn", + "number": 504, + "title": "std::string_ref как обертка над const char*", + "user": { + "login": "kol65536black", + "id": 6318365, + "node_id": "MDQ6VXNlcjYzMTgzNjU=", + "avatar_url": "https://avatars.githubusercontent.com/u/6318365?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kol65536black", + "html_url": "https://github.com/kol65536black", + "followers_url": "https://api.github.com/users/kol65536black/followers", + "following_url": "https://api.github.com/users/kol65536black/following{/other_user}", + "gists_url": "https://api.github.com/users/kol65536black/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kol65536black/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kol65536black/subscriptions", + "organizations_url": "https://api.github.com/users/kol65536black/orgs", + "repos_url": "https://api.github.com/users/kol65536black/repos", + "events_url": "https://api.github.com/users/kol65536black/events{/privacy}", + "received_events_url": "https://api.github.com/users/kol65536black/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 14, + "created_at": "2022-01-21T09:48:10Z", + "updated_at": "2022-01-29T12:18:28Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Хотелось бы иметь обертку над const char* у которой implicit конструктор от const char*, определены операторы сравнения и ряд других полезных функций. Мне кажется странным, но такого нет в библиотеке до сих пор. Может быть есть на то какие-то причины. Хотелось бы обсудить эту тему.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/504/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/504/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/503", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/503/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/503/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/503/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/503", + "id": 1108046736, + "node_id": "I_kwDOFK7cns5CC3OQ", + "number": 503, + "title": "consteval для конструктора и CTAD", + "user": { + "login": "XRay3D", + "id": 10693876, + "node_id": "MDQ6VXNlcjEwNjkzODc2", + "avatar_url": "https://avatars.githubusercontent.com/u/10693876?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/XRay3D", + "html_url": "https://github.com/XRay3D", + "followers_url": "https://api.github.com/users/XRay3D/followers", + "following_url": "https://api.github.com/users/XRay3D/following{/other_user}", + "gists_url": "https://api.github.com/users/XRay3D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/XRay3D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/XRay3D/subscriptions", + "organizations_url": "https://api.github.com/users/XRay3D/orgs", + "repos_url": "https://api.github.com/users/XRay3D/repos", + "events_url": "https://api.github.com/users/XRay3D/events{/privacy}", + "received_events_url": "https://api.github.com/users/XRay3D/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 4, + "created_at": "2022-01-19T12:32:43Z", + "updated_at": "2022-02-08T06:39:12Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Разрешить consteval конструктор:\r\n```c++\r\ntemplate \r\nstruct integral_constant {\r\n consteval integral_constant (Ty Val) {\r\n ...\r\n }\r\n ...\r\n};\r\n\r\ntemplate \r\nintegral_constant(Ty Val) -> integral_constant;\r\n\r\nstruct bool_constant {\r\n static constexpr bool value;\r\n consteval bool_constant (bool Val = false) : value{Val} {\r\n ...\r\n }\r\n ...\r\n};\r\n```\r\nВозможное использование:\r\n\r\n```c++\r\nconstexpr auto thing{integral_constant(10ULL)};\r\n\r\nvoid some_func(auto param) {\r\n ...\r\n}\r\n//вызов\r\nsome_func(integral_constant(123));\r\nsome_func(thing);\r\nsome_func(bool_constant{});\r\nsome_func(bool_constant{true});\r\n\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/503/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/503/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/502", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/502/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/502/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/502/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/502", + "id": 1105191965, + "node_id": "I_kwDOFK7cns5B3-Qd", + "number": 502, + "title": "Deal with the mess around the \"volatile\" modifier", + "user": { + "login": "AVI-crak", + "id": 35156298, + "node_id": "MDQ6VXNlcjM1MTU2Mjk4", + "avatar_url": "https://avatars.githubusercontent.com/u/35156298?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AVI-crak", + "html_url": "https://github.com/AVI-crak", + "followers_url": "https://api.github.com/users/AVI-crak/followers", + "following_url": "https://api.github.com/users/AVI-crak/following{/other_user}", + "gists_url": "https://api.github.com/users/AVI-crak/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AVI-crak/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AVI-crak/subscriptions", + "organizations_url": "https://api.github.com/users/AVI-crak/orgs", + "repos_url": "https://api.github.com/users/AVI-crak/repos", + "events_url": "https://api.github.com/users/AVI-crak/events{/privacy}", + "received_events_url": "https://api.github.com/users/AVI-crak/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2022-01-16T21:26:33Z", + "updated_at": "2022-01-19T19:15:32Z", + "closed_at": "2022-01-19T19:15:32Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "For x86, \"volatile\" behavior is considered normal. All data is stored on the stack and external memory, any change obliges to rewrite the variables where they are - on the stack and external memory.\r\nFor ARM, it's a mess. Data can be stored in registers, on the stack, in external memory, and in memory at a fixed address. But the intermediate unconditional saving to the stack is still used. This point is very relevant for embedded systems, where the memory size can be 4k (very small chip).\r\n\r\nI propose to change the attributes of the register space of ARM systems to \"fast memory\", at least in the form of a crutch for external variable modifiers. In this case, the place of creation and primary placement of a variable with the \"volatile\" attribute will lose the relevance of unconditional storage on the stack. But it will retain the unconditional execution of any mathematical and logical operations on a variable in the order of writing the program code, until the moment the function is out of scope. The loss of visibility outside the function to store on the stack and in a register is the same, then why pay more?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/502/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/502/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/501", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/501/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/501/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/501/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/501", + "id": 1103608403, + "node_id": "I_kwDOFK7cns5Bx7pT", + "number": 501, + "title": "Добавить возможность вычисления дэфолтных аргументов в месте вызова.", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2022-01-14T13:02:06Z", + "updated_at": "2022-01-14T20:18:32Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Сейчас дефолтные аргументы для функций вычисляются в месте объявления.\r\n\r\nДополнительно к этому механизму я предлагаю добавить механизм для вычисления дефолтных аргуметнов в месте вызова.\r\n\r\nСейчас этот механизм реализуется через макрофункции (что не удобно). Например макрофункция логирования, которая инжектит в С++ функцию логирования контент из локальной области видимости, ( если он есть ), либо из аргументов, либо из членов класса, либо из неймспейса, либо из глобального неймспейса. Как результат, мы знаем кто вызвал функцию логирования, в каком контексте, и тд.\r\n\r\nВообще же горизонты применения этого функционала гораздо шире логирования. \r\nМожно запрещать или разрешать вызов API из определенных неймспейсов или классов (нечто наподобии инкапсуляции для функций). \r\nМожно специализировать поведение функций в зависимости от места вызова (например в singleThread нэймспейсе одно поведение, а в multithread другое, а в классе где есть mutable mutex c определенным именем - третье, а в юнит тестах - четвертое).\r\n\r\nГоворя языком паттернов, можно делать mixin`ы на функциях.\r\n\r\nИнструмент котороый может получится - будет с удивительными возможностями многие из которых еще предстоит открыть. Значительно повысит выразительность кода. И уберёт один из последних рубежей где прочно закрепился препроцессор.\r\n\r\nКрасивый синтаксис (и главное простой и выразительный) я не придумал, он может быть чем то наподобии:\r\n\r\n```\r\nint log( const string &context = declevaluate( getContext() ), const string & line = declevaluate( __LINE__) , const string & var );\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/501/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/501/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/500", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/500", + "id": 1102549844, + "node_id": "I_kwDOFK7cns5Bt5NU", + "number": 500, + "title": "Запретить писать inline для constexpr-функций и переменных", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 9, + "created_at": "2022-01-13T23:12:10Z", + "updated_at": "2022-01-16T23:00:50Z", + "closed_at": "2022-01-16T18:41:49Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "`constexpr`- и `consteval`-методы и constexpr-переменные неявно объявлены `inline`\r\n[[dcl.constexpr]](http://eel.is/c++draft/dcl.constexpr#1.sentence-3)\r\n\r\nЭто логично - если у них есть шанс вычислиться в compile-time, то им можно немного обойти ODR. Потому что вычислить метод, не видя его определения в текущем translation unit, невозможно by desing.\r\n\r\nОднако многие программисты, наверное, либо не знают это, либо добавляют `inline` \"для надежности\".\r\nВ результате **вагон** проектов самой разной крутости имеют кучу `inline constexpr`/`inline consteval`\r\nhttps://github.com/search?p=1&q=inline+constexpr&type=Code\r\n(clang и gcc не выводят warning на это, всем пофигу)\r\n\r\nЕсть возможность \"упростить\" язык, одновременно повышая \"грамотность\" программистов, выводя ошибку о том, что метод уже является `inline`.\r\n\r\n**UPD**: `inline constexpr`-переменные смысл всё же имеют. А методы и static data members - нет.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/500/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/500/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/499", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/499/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/499/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/499/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/499", + "id": 1099920750, + "node_id": "I_kwDOFK7cns5Bj3Vu", + "number": 499, + "title": "make template and typename more optional", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2022-01-12T06:12:03Z", + "updated_at": "2022-01-12T10:10:31Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "_Описание:_\r\nЕсли разрешить на декларации классов/структур писать концепт и это будет означать, что класс и все специализации класса должны соответствовать этому концепту, то мы получим\r\n1. Явный шаблонный интерфейс(а не как раньше неявный)\r\n2. Возможность компилятору понимать какие алиасы/ шаблоны обязаны присутствовать в классе и его специализациях, а значит можно будет не писать typename / template, это позволит сделать нормальный интерфейс тупла(с внутренним гетом), добавить в стандарт базовые инструменты работы с вариадиками(например std::type_list и внутри него шаблоны для работы с паком, например ::containts / expand > и прочее)\r\n3. Улучшение читаемости кода\r\n4. Возможность проверить наличие ошибок на уровне концептов(противоречивых условий в них и ошибки в местах их использующих в шаблонном коде)\r\n\r\n_Примеры_\r\n```cpp\r\ntemplate\r\nstd::ranges::random_access_range struct MyClass {\r\n// много кода, из которого долго понимать что перед нами\r\n};\r\n\r\ntemplate\r\nconcept metafunction = requires (T) { typename T::type };\r\n\r\ntemplate\r\nmetafunction struct type_identity { using type = T; };\r\n\r\n... где то в другом месте ...\r\ntemplate\r\nvoid Foo() {\r\nF::type value; // без typename\r\n}\r\n// или я сделал специализацию класса MyVector и у него итератор\r\n// не соответствует концепту random_access_iterator - ошибка компиляции! Классно же\r\n```\r\n\r\nИли вот другой пример, чего явно не хватает в стандарте - работы с вариадиками(тем более что после добавления в стандарт скорость компиляции подобного кода из-за интринсиков вырастет в сотни раз)\r\n```cpp\r\ntemplate\r\nconcept type_list_interface = requires (T) {\r\n typename T::template get<0>;\r\n { T::template contains } -> std::same_as;\r\n}\r\ntemplate\r\ntype_list_interface struct type_list { ... };\r\n\r\n... где в пользовательском коде ...\r\n\r\ntemplate\r\nauto Foo(Types&&... args) {\r\nif constexpr (type_list::contains) (\r\n return 3;\r\n}\r\n}\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/499/reactions", + "total_count": 3, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/499/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/498", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/498/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/498/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/498/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/498", + "id": 1097276605, + "node_id": "I_kwDOFK7cns5BZxy9", + "number": 498, + "title": "Стандартная библиотека корутин", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2022-01-09T19:07:08Z", + "updated_at": "2022-01-11T10:57:35Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "_Описание_:\r\nНам очевидно нужна поддержка корутин в стандарте. Минимальный набор готовых корутин, инфраструктура вокруг них(utility), концепты, набор \"сделай сам\" для кастомизации под конкретные нужды.\r\n\r\n_Примеры_\r\nСмешной и неэффективный пример, потому что все итак знают, что генераторы полезны\r\n```cpp\r\n\r\ntemplate\r\nauto zip(Ranges&&... rs)->generator()[0])...>> {\r\n for (size_t i = 0; ((i < rs.size()) && ...); ++i)\r\n co_await yield(rs[i]...);\r\n // yield это специальный тип, когда хочется yield значение\r\n // сконструировать прямо тут из многих аргументов\r\n // (иначе это воспринимается как init list)\r\n}\r\n\r\nvoid zip_user {\r\n std::vector vec;\r\n vec.resize(10, 'c');\r\n std::string sz = \"Hello world\";\r\n for (auto [a,b,c] : zip(vec, sz, std::string_view(sz)))\r\n std::format_to(std::ostream_iterator(std::cout), \"{}{}{}\\n\", a, b, c);\r\n}\r\n```\r\nНужны корутины также и для асинхронного кода, конечно же\r\n```cpp\r\nkelbon::logical_thread Multithread(std::atomic& value, std::allocator) {\r\n// В этом примере я игнорирую стоп токен, но вообще можно его использовать,\r\n// хотя всё равно по умолчанию на каждом co_await проверяется запрошен ли стоп\r\n auto my_stop_token = co_await this_coro::stop_token;\r\n co_await jump_on(another_thread);\r\n for (auto i : std::views::iota(0, 100)) ++value; // do my job\r\n}\r\n\r\nvoid Moo() {\r\n std::atomic value;\r\n std::vector workers;\r\n for (int i = 0; i < 10; ++i)\r\n workers.emplace_back(Multithread(value, std::allocator{}));\r\n// здесь вызывается деструктор вектора, который вызывает деструкторы корутин\r\n// и мы дожидаемся выполнения всех логических потоков\r\n}\r\n\r\n```\r\n\r\n_<Код c реализацией вашей идеи, если есть>_\r\nЕсть\r\nhttps://github.com/kelbon/UndefinedBehavior_GoldEdition\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/498/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/498/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/497", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/497/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/497/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/497/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/497", + "id": 1097241238, + "node_id": "I_kwDOFK7cns5BZpKW", + "number": 497, + "title": "std::ranges не должны игнорировать & && перегрузки begin / end", + "user": { + "login": "kelbon", + "id": 58717435, + "node_id": "MDQ6VXNlcjU4NzE3NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/58717435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kelbon", + "html_url": "https://github.com/kelbon", + "followers_url": "https://api.github.com/users/kelbon/followers", + "following_url": "https://api.github.com/users/kelbon/following{/other_user}", + "gists_url": "https://api.github.com/users/kelbon/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kelbon/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kelbon/subscriptions", + "organizations_url": "https://api.github.com/users/kelbon/orgs", + "repos_url": "https://api.github.com/users/kelbon/repos", + "events_url": "https://api.github.com/users/kelbon/events{/privacy}", + "received_events_url": "https://api.github.com/users/kelbon/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2022-01-09T16:32:11Z", + "updated_at": "2022-01-20T07:38:05Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Если в случае range based for loop игнорировать такие перегрузки ещё адекватно, то в случае ranges это приводит к проблемам, например, пусть у меня есть условный генератор - корутина, тогда в в случае && для интеграции с std::ranges я бы мог перегрузить begin для &&,, создав владеющий итератор(владеющий coroutine_handle)\r\nПри этом метод end() является **статическим**, поэтому никаких проблем с вызовом end после вызова перегруженного для && метода нет.\r\n```cpp\r\n// здесь owner - coroutine_handle\r\n auto begin() && {\r\n struct iterator_owner : iterator {\r\n using iterator::iterator;\r\n iterator_owner(iterator_owner&& other) noexcept : owner(std::exchange(other.owner, nullptr)) {}\r\n iterator_owner& operator=(iterator_owner&& other) noexcept { std::swap(owner, other.owner); }\r\n ~iterator_owner() {\r\n if (owner) owner.destroy();\r\n }\r\n };\r\n this->my_handle.resume();\r\n return iterator_owner{{this->release()}};\r\n }\r\n```\r\nТогда пользователь мог бы безопасно писать\r\n```cpp\r\ntemplate \r\nconstexpr bool ::std::ranges::enable_borrowed_range> = true;\r\n\r\nvoid Foo() {\r\n auto make_generator = []() -> kelbon::generator {\r\n for (auto i = 0; i < 100; ++i)\r\n co_yield i;\r\n };\r\n for (auto v : make_generator() | std::views::all)\r\n std::cout << v;\r\n}\r\n```\r\nСейчас произойдёт UB, т.к. внутри ranges не происходит forward ренжа, и выберется не та перегрузка begin, скорее всего рантайм ошибка(в лучшем случае)\r\n\r\nКак я предлагаю это исправить:\r\nИсправить текст стандарта\r\n```cpp\r\n template\r\n requires convertible-to-non-slicing, I> &&\r\n convertible_­to, S>\r\n constexpr subrange(R&& r, make-unsigned-like-t> n)\r\n requires (K == subrange_kind::sized)\r\n : subrange{ranges::begin(r), ranges::end(r), n} {}\r\n```\r\nhttps://eel.is/c++draft/range.subrange#ctor-6.2\r\nhttps://eel.is/c++draft/range.subrange#access-10\r\nДобавив `std::forward`\r\n\r\nЛибо добавить перегрузки с requires, если будет страшно за abi", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/497/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/497/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/496", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/496/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/496/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/496/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/496", + "id": 1096380664, + "node_id": "I_kwDOFK7cns5BWXD4", + "number": 496, + "title": "Compound literals", + "user": { + "login": "NN---", + "id": 580536, + "node_id": "MDQ6VXNlcjU4MDUzNg==", + "avatar_url": "https://avatars.githubusercontent.com/u/580536?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/NN---", + "html_url": "https://github.com/NN---", + "followers_url": "https://api.github.com/users/NN---/followers", + "following_url": "https://api.github.com/users/NN---/following{/other_user}", + "gists_url": "https://api.github.com/users/NN---/gists{/gist_id}", + "starred_url": "https://api.github.com/users/NN---/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/NN---/subscriptions", + "organizations_url": "https://api.github.com/users/NN---/orgs", + "repos_url": "https://api.github.com/users/NN---/repos", + "events_url": "https://api.github.com/users/NN---/events{/privacy}", + "received_events_url": "https://api.github.com/users/NN---/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2022-01-07T14:45:14Z", + "updated_at": "2022-02-10T21:13:26Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "C99 поддерживает создание временного объекта непосредственно при передаче.\r\nБыло бы хорошо иметь поддержку в C++.\r\n\r\n```cpp\r\nint *p = (int[]){2, 4}; // creates an unnamed static array of type int[2]\r\n // initializes the array to the values {2, 4}\r\n // creates pointer p to point at the first element of the array\r\nconst float *pc = (const float []){1e0, 1e1, 1e2}; // read-only compound literal\r\n \r\nint main(void)\r\n{\r\n int n = 2, *p = &n;\r\n p = (int [2]){*p}; // creates an unnamed automatic array of type int[2]\r\n // initializes the first element to the value formerly held in *p\r\n // initializes the second element to zero\r\n // stores the address of the first element in p\r\n \r\n struct point {double x,y;};\r\n void drawline1(struct point from, struct point to);\r\n void drawline2(struct point *from, struct point *to);\r\n drawline1((struct point){.x=1, .y=1}, // creates two structs with block scope \r\n (struct point){.x=3, .y=4}); // and calls drawline1, passing them by value\r\n drawline2(&(struct point){.x=1, .y=1}, // creates two structs with block scope \r\n &(struct point){.x=3, .y=4}); // and calls drawline2, passing their addresses\r\n}\r\n```\r\n\r\nhttps://en.cppreference.com/w/c/language/compound_literal", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/496/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/496/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/495", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/495/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/495/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/495/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/495", + "id": 1091721974, + "node_id": "I_kwDOFK7cns5BElr2", + "number": 495, + "title": "добавить новые std::this_thread::sleep_for/sleep_until с аргументом stop_token", + "user": { + "login": "marakew", + "id": 3596295, + "node_id": "MDQ6VXNlcjM1OTYyOTU=", + "avatar_url": "https://avatars.githubusercontent.com/u/3596295?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/marakew", + "html_url": "https://github.com/marakew", + "followers_url": "https://api.github.com/users/marakew/followers", + "following_url": "https://api.github.com/users/marakew/following{/other_user}", + "gists_url": "https://api.github.com/users/marakew/gists{/gist_id}", + "starred_url": "https://api.github.com/users/marakew/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/marakew/subscriptions", + "organizations_url": "https://api.github.com/users/marakew/orgs", + "repos_url": "https://api.github.com/users/marakew/repos", + "events_url": "https://api.github.com/users/marakew/events{/privacy}", + "received_events_url": "https://api.github.com/users/marakew/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035680, + "node_id": "MDU6TGFiZWwyODE1MDM1Njgw", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/good%20first%20issue", + "name": "good first issue", + "color": "7057ff", + "default": true, + "description": "Несложная на вид идея. Самое то, чтобы попробовать написать на её proposal и помочь РГ21" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2022-01-01T02:50:30Z", + "updated_at": "2022-01-01T07:21:10Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "sub думаю в комментариях не нуждается\r\nс boost::thread слизали все \r\nкроме самого распространенного применения когда с ожиданием boost::this_thread::sleep_for\r\nкоторый можно прервать по с boost::thread::interrupt()\r\nпотом в std::jthread добавили stop_token, а про sleep похоже забыли/забили\r\n\r\nso забит\r\nна вопросы, \"- а как реализовать прерывающийся sleep?\"\r\nсоветами - \"напишите сами, там три четыре строки кода\"\r\n\r\nwtf зачем их писать, когда imho это должно быть в стандарте", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/495/reactions", + "total_count": 3, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/495/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/494", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/494/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/494/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/494/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/494", + "id": 1090769566, + "node_id": "I_kwDOFK7cns5BA9Ke", + "number": 494, + "title": "Сделать слово `requires` контекстно-зависимым", + "user": { + "login": "leha-bot", + "id": 10153298, + "node_id": "MDQ6VXNlcjEwMTUzMjk4", + "avatar_url": "https://avatars.githubusercontent.com/u/10153298?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leha-bot", + "html_url": "https://github.com/leha-bot", + "followers_url": "https://api.github.com/users/leha-bot/followers", + "following_url": "https://api.github.com/users/leha-bot/following{/other_user}", + "gists_url": "https://api.github.com/users/leha-bot/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leha-bot/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leha-bot/subscriptions", + "organizations_url": "https://api.github.com/users/leha-bot/orgs", + "repos_url": "https://api.github.com/users/leha-bot/repos", + "events_url": "https://api.github.com/users/leha-bot/events{/privacy}", + "received_events_url": "https://api.github.com/users/leha-bot/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-12-29T22:04:04Z", + "updated_at": "2021-12-31T17:18:43Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В 20-ку концепты принесли новый ключевик `requires`, который, по идее, используется только в определенных местах (в декларации функции, в описании шаблона, етц - поправьте, список сумбурно привел)\r\n\r\nОднако это приводит к тому, что существующий код ломается, см например ,сюда:\r\n\r\nhttps://github.com/rpm-software-management/createrepo_c/issues/181\r\n\r\n(Где-то это уже поменяли в недрах RPM/libsolv, но это привело к нарушению обратной совместимости и костылям, см например тут: https://github.com/openSUSE/libsolv/pull/477/files )\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/494/reactions", + "total_count": 2, + "+1": 1, + "-1": 1, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/494/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/493", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/493/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/493/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/493/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/493", + "id": 1088741589, + "node_id": "I_kwDOFK7cns5A5ODV", + "number": 493, + "title": "Relax field designators order", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 7, + "created_at": "2021-12-26T10:20:42Z", + "updated_at": "2022-01-14T20:17:38Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В C++20 добавили field designators https://en.cppreference.com/w/cpp/language/aggregate_initialization. \r\n\r\nЭто замечательный функционал который может значительно расширить декларативные возможности C++, и позволит использовать язык в тех контекстах, подобных use-кейсам yml\\json\\css.\r\n\r\nНо есть одна печальная оговорка, которая сводит на нет полезность этой фичи. Инициализаторы должны быть в порядке обьявления. Это приводит к тому, что автор класса диктует дизайн для инициализации, объявление становится \"замороженным\" после публикации интерфейса, и любой рефакторинг связанный с порядком и количеством членов класса становится дорогим и нежелательным.\r\n\r\nСудя по компилятору Clang - https://godbolt.org/z/c9dWTrnKx , то нет проблемы компилировать код с любым порядком инициализаторов ( он это умеет делать в любой версии, но в последней с ворнингом ). Компиляторы gcc msvc - отказываются.\r\n\r\n\r\n```\r\nstruct point \r\n{\r\n int x; // << хочу рефакторить порядок объявления членов класса, без изменения клиентского кода\r\n int y;\r\n};\r\n\r\nint main() {\r\n point a = { \r\n .y=2, // << Хочу дизайнить инициализацию в любом порядке, для выражения смысла локального контекста\r\n .x=4,\r\n };\r\n\r\n cout << a.x << \" \" << a.y << endl; \r\n}\r\n```\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/493/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/493/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/492", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/492/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/492/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/492/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/492", + "id": 1085950340, + "node_id": "I_kwDOFK7cns5AukmE", + "number": 492, + "title": "Запретить возврат ссылок на временные объекты", + "user": { + "login": "b2soft", + "id": 6034932, + "node_id": "MDQ6VXNlcjYwMzQ5MzI=", + "avatar_url": "https://avatars.githubusercontent.com/u/6034932?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/b2soft", + "html_url": "https://github.com/b2soft", + "followers_url": "https://api.github.com/users/b2soft/followers", + "following_url": "https://api.github.com/users/b2soft/following{/other_user}", + "gists_url": "https://api.github.com/users/b2soft/gists{/gist_id}", + "starred_url": "https://api.github.com/users/b2soft/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/b2soft/subscriptions", + "organizations_url": "https://api.github.com/users/b2soft/orgs", + "repos_url": "https://api.github.com/users/b2soft/repos", + "events_url": "https://api.github.com/users/b2soft/events{/privacy}", + "received_events_url": "https://api.github.com/users/b2soft/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 7, + "created_at": "2021-12-21T15:27:16Z", + "updated_at": "2022-01-09T16:21:00Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "На данный момент возвращать ссылку на временный объект является UB. Можно считать ill-formed код, если функция возвращает ссылку (без учета cv-квалифаеров) и в return statement указан возврат локальной/рвалуе переменной.\r\n```\r\nint& GetRef()\r\n{\r\n int x = 42;\r\n return x; // Хорошо бы тут Compilation Error returning reference to local variable\r\n}\r\n```\r\n\r\nПозволит увидеть подобные ошибки на этапе компиляции, вместо UB на рантайме. Следует отметить, что в компиляторе MSVC подобный код еще и работает нормально, что создает ложное впечатление о \"правильности\" кода и его переносимости (GCC будет писать ворнинг -Wreturn-local-addr на такой возврат). Также, механизм определения подобного кода существует (ворнинг в GCC), но не у всех включен + не все включают Treat Warning as Errors. А ворнинг достаточно критичный и не всегда заметный, по моему мнению.\r\nЯ тяжело себе представляю, в каком случае возврат ссылки на локальную переменную вообще является корректным использованием механизма ссылок.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/492/reactions", + "total_count": 5, + "+1": 5, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/492/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/491", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/491/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/491/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/491/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/491", + "id": 1083835961, + "node_id": "I_kwDOFK7cns5AmgY5", + "number": 491, + "title": "Уточнить поведение `std::forward_list::merge`", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-12-18T13:43:49Z", + "updated_at": "2022-01-06T18:27:56Z", + "closed_at": "2022-01-05T10:39:22Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Для двусвязного списка `std::list` в [n4901](https://github.com/cplusplus/draft/releases/tag/n4901) в описании метода `merge` есть такая ремарка:\r\n\r\n> _Effects_: If **`addressof(x) == this`**, does nothing;\r\n\r\nДля односвязного списка `std::forward_list` об этом случае ничего не сказано.\r\nИз-за этого поведение имплементаций различно:\r\n\r\n* libstdc++ [проверок не делает](https://github.com/gcc-mirror/gcc/blob/cc032ec1ecb34b006f42e170ccb9d76aa42fd8eb/libstdc%2B%2B-v3/include/bits/forward_list.tcc#L364-L384), улетает в бесконечный цикл\r\n* libc++ делает [проверку](\r\nhttps://github.com/llvm/llvm-project/blob/ff94bd1bc92efb2a116fb2963d0425a529d3be89/libcxx/include/forward_list#L1584-L1596)\r\n* то же верно и для [MS STL](\r\nhttps://github.com/microsoft/STL/blob/303df3dae6f5ed9fe4f1c35257f663af8355584a/stl/inc/forward_list#L1234-L1241)\r\n\r\nПоэтому предлагается:\r\n * либо явно зафиксировать неопределённое поведение\r\n * либо вставить вышеупомянутую ремарку и для `std::forward_list::merge` (что предпочтительнее).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/491/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/491/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/490", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/490/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/490/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/490/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/490", + "id": 1074256938, + "node_id": "I_kwDOFK7cns5AB9wq", + "number": 490, + "title": "Ослабить требование, что элемент span-а должен иметь complete type", + "user": { + "login": "AndreyG", + "id": 235190, + "node_id": "MDQ6VXNlcjIzNTE5MA==", + "avatar_url": "https://avatars.githubusercontent.com/u/235190?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AndreyG", + "html_url": "https://github.com/AndreyG", + "followers_url": "https://api.github.com/users/AndreyG/followers", + "following_url": "https://api.github.com/users/AndreyG/following{/other_user}", + "gists_url": "https://api.github.com/users/AndreyG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AndreyG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AndreyG/subscriptions", + "organizations_url": "https://api.github.com/users/AndreyG/orgs", + "repos_url": "https://api.github.com/users/AndreyG/repos", + "events_url": "https://api.github.com/users/AndreyG/events{/privacy}", + "received_events_url": "https://api.github.com/users/AndreyG/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-12-08T10:33:57Z", + "updated_at": "2023-02-24T15:02:55Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Собственно, идея в заголовке. Черновик (очень-очень сырой) proposal-а содержит [мотивацию](https://github.com/AndreyG/cpp-papers/blob/main/span-of-incomplete-element-type.md#motivation-and-scope), так что просто повторю ее здесь.\r\nСейчас (в C++20) такой естественный код не валиден:\r\n```cpp\r\nclass Element;\r\n\r\nclass Storage {\r\n ...\r\n span get_elements();\r\n};\r\n\r\nextern void process(span);\r\n\r\nvoid do_something(Storage& storage) {\r\n process(storage.get_elements());\r\n}\r\n```\r\nхотя с точки зрения здравого смысла `span` должен быть эквивалентен `pair`, а значит фундаментальной причины, запрещать код выше, не существует.\r\n\r\nПри этом понятно, что для большинства методов `span`-а нужно чтобы `ElementType` был complete. Это не проблема, прецедент уже есть -- `vector` [разрешает](https://eel.is/c++draft/vector#overview-4) инстанцировать класс incomplete типом, но требует, чтобы тип элемента стал complete перед инстанциацией всех member-ов `vector`-а:\r\n>An incomplete type T may be used when instantiating vector if the allocator meets the allocator completeness requirements. T shall be complete before any member of the resulting specialization of vector is referenced.\r\n\r\n Для `span`-а хочется ослабить требования до *почти* таких же, но copy/move-операции для `span`-а (они тривиальные) необходимо также разрешить даже когда тип элемента incomplete.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/490/reactions", + "total_count": 6, + "+1": 6, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/490/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/489", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/489/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/489/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/489/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/489", + "id": 1071974000, + "node_id": "I_kwDOFK7cns4_5QZw", + "number": 489, + "title": "Добавить для std::string метод count()", + "user": { + "login": "IllidanSR", + "id": 24667137, + "node_id": "MDQ6VXNlcjI0NjY3MTM3", + "avatar_url": "https://avatars.githubusercontent.com/u/24667137?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/IllidanSR", + "html_url": "https://github.com/IllidanSR", + "followers_url": "https://api.github.com/users/IllidanSR/followers", + "following_url": "https://api.github.com/users/IllidanSR/following{/other_user}", + "gists_url": "https://api.github.com/users/IllidanSR/gists{/gist_id}", + "starred_url": "https://api.github.com/users/IllidanSR/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/IllidanSR/subscriptions", + "organizations_url": "https://api.github.com/users/IllidanSR/orgs", + "repos_url": "https://api.github.com/users/IllidanSR/repos", + "events_url": "https://api.github.com/users/IllidanSR/events{/privacy}", + "received_events_url": "https://api.github.com/users/IllidanSR/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-12-06T10:20:02Z", + "updated_at": "2021-12-27T14:11:36Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Часто бывает нужно проверить есть ли в строке определённая подстрока, вернув количество вхождений. Во многих языках для строк существует метод `.count(patter)` возвращающий количество вхождений подстроки в строке. В C++ есть std::count, но он работает только с char в качестве паттерна, что выглядит не совсем подходящим.\r\nПредложение: добавить в класс string метод count принимающий в качестве аргумента паттерн поиска и возвращающий количество вхождений паттерна в строку", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/489/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/489/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/488", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/488/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/488/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/488/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/488", + "id": 1071235321, + "node_id": "I_kwDOFK7cns4_2cD5", + "number": 488, + "title": "Сохранение Variadic Template через using", + "user": { + "login": "kin4stat", + "id": 26118089, + "node_id": "MDQ6VXNlcjI2MTE4MDg5", + "avatar_url": "https://avatars.githubusercontent.com/u/26118089?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kin4stat", + "html_url": "https://github.com/kin4stat", + "followers_url": "https://api.github.com/users/kin4stat/followers", + "following_url": "https://api.github.com/users/kin4stat/following{/other_user}", + "gists_url": "https://api.github.com/users/kin4stat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kin4stat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kin4stat/subscriptions", + "organizations_url": "https://api.github.com/users/kin4stat/orgs", + "repos_url": "https://api.github.com/users/kin4stat/repos", + "events_url": "https://api.github.com/users/kin4stat/events{/privacy}", + "received_events_url": "https://api.github.com/users/kin4stat/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2021-12-04T15:42:15Z", + "updated_at": "2021-12-07T08:13:26Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Сделать возможным сохранять Variadic Template через using.\r\n\r\nНапример\r\n```cpp\r\ntemplate \r\nstruct function_traits;\r\n\r\ntemplate \r\nstruct function_traits {\r\n static constexpr auto args_count = sizeof...(Args);\r\n static constexpr auto function_convention = cconv::cthiscall;\r\n using args… = Class*, Args...;\r\n using return_type = Ret;\r\n};\r\n\r\ntemplate \r\nstruct function_traits {\r\n static constexpr auto args_count = sizeof...(Args);\r\n static constexpr auto convention = cconv::ccdecl;\r\n using args... = Args...;\r\n using return_type = Ret;\r\n};\r\ntemplate \r\nstruct function_traits {\r\n static constexpr auto args_count = sizeof...(Args);\r\n static constexpr auto convention = cconv::ccdecl;\r\n using args… = Args...;\r\n using return_type = Ret;\r\n};\r\n\r\ntemplate\r\nclass Foo{\r\n using function = function_traits;\r\n using Args... = typename function::args;\r\n using Ret = typename function::return_type;\r\n}\r\n````\r\n\r\n\r\nВ текущих реалиях мы вынуждены сохранять variadic template в std::tuple(либо в своей обертке), что не всегда удобно. Например, чтобы распаковать аргументы обратно в шаблон, нам придется писать еще одну спецификацию под std::tuple\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/488/reactions", + "total_count": 11, + "+1": 11, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/488/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/487", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/487", + "id": 1065737051, + "node_id": "I_kwDOFK7cns4_hdtb", + "number": 487, + "title": "Итератор на последний элемент контейнера(до end())", + "user": { + "login": "simulacrus", + "id": 79246839, + "node_id": "MDQ6VXNlcjc5MjQ2ODM5", + "avatar_url": "https://avatars.githubusercontent.com/u/79246839?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/simulacrus", + "html_url": "https://github.com/simulacrus", + "followers_url": "https://api.github.com/users/simulacrus/followers", + "following_url": "https://api.github.com/users/simulacrus/following{/other_user}", + "gists_url": "https://api.github.com/users/simulacrus/gists{/gist_id}", + "starred_url": "https://api.github.com/users/simulacrus/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/simulacrus/subscriptions", + "organizations_url": "https://api.github.com/users/simulacrus/orgs", + "repos_url": "https://api.github.com/users/simulacrus/repos", + "events_url": "https://api.github.com/users/simulacrus/events{/privacy}", + "received_events_url": "https://api.github.com/users/simulacrus/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 30, + "created_at": "2021-11-29T08:18:40Z", + "updated_at": "2021-12-11T13:51:32Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Итератор на последний элемент до end()\r\n\r\nТаким образом:\r\n1. В forward_list появляется возможность вставить элемент в конец, не итерируясь по всем элементам\r\n\r\nПоявится новый метод с названием: prev_end() или bend() или before_end()\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/487/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/487/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/486", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/486/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/486/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/486/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/486", + "id": 1052271731, + "node_id": "I_kwDOFK7cns4-uGRz", + "number": 486, + "title": "Возможность создать POD-структуры, для которых тип определяется расположением элементов, concept structs", + "user": { + "login": "topin89", + "id": 25770107, + "node_id": "MDQ6VXNlcjI1NzcwMTA3", + "avatar_url": "https://avatars.githubusercontent.com/u/25770107?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/topin89", + "html_url": "https://github.com/topin89", + "followers_url": "https://api.github.com/users/topin89/followers", + "following_url": "https://api.github.com/users/topin89/following{/other_user}", + "gists_url": "https://api.github.com/users/topin89/gists{/gist_id}", + "starred_url": "https://api.github.com/users/topin89/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/topin89/subscriptions", + "organizations_url": "https://api.github.com/users/topin89/orgs", + "repos_url": "https://api.github.com/users/topin89/repos", + "events_url": "https://api.github.com/users/topin89/events{/privacy}", + "received_events_url": "https://api.github.com/users/topin89/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-11-12T18:21:33Z", + "updated_at": "2021-12-26T11:46:56Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Идея является альтернативой/дополнением к https://github.com/cpp-ru/ideas/issues/485\r\n\r\n## Сама идея\r\nСделать возможным, чтобы часть POD-типов была одинаковой не когда полностью совпадают имена типов и членов типа, а только когда совпадает расположение каждого типа внутри. Пример\r\n\r\n```c++\r\nconcept struct Coords{\r\n float x; //имена не играют роли\r\n float y;\r\n \r\n float len() { return std::hypot(x,y); }\r\n};\r\n\r\nconcept struct xy{\r\n float X;\r\n float Y;\r\n \r\n float len_sq() { return x*x + y*y; }\r\n};\r\n\r\nstd::vector a{ {1,2}, {3,4}, {5,6} };\r\nstd::vector b = std::move(a); // Должно компилироваться\r\n```\r\n\r\nПоскольку есть тонны написанного кода, в который новомодные concept struct никто не добавит, может быть, стоит явно сказать компилятору про совпадения типов\r\n\r\n```c++\r\nstruct Coords{\r\n float x; //имена не играют роли\r\n float y;\r\n \r\n float len() { return std::hypot(x,y); }\r\n};\r\n\r\nstruct xy{\r\n float X;\r\n float Y;\r\n \r\n float len_sq() { return x*x + y*y; }\r\n};\r\n\r\nconcept struct coords = {Coords, xy}; // не знаю, как не использовать новые ключевые слова\r\n\r\n```\r\n\r\n## Применение\r\nОдин в один с https://github.com/cpp-ru/ideas/issues/485\r\nСуществует достаточно много разных структур координат или rgb-цвета и других подобных, с одинаковым расположением элементов но формально разными типами. И хотя для простых указателей на них ещё можно делать reinterpret_cast и надеяться на лучшее, для вещей вроде `vector>` фокус уже не прокатывает.\r\n\r\n## Возможные проблемы\r\n\r\nФормальное определение одинаковости. Особенно с учётом всех константно-волатильных указателей. Вряд ли смогу сформулировать сам.\r\n\r\nВозможно, тоже будут какие-то проблемы со строгим разыменованием, но опять же, не уверен.\r\n\r\nОпределённо прибавиться работы блокам проверки одинаковости типов, не представляю сколько там её вывалиться. Как вариант, просто объявить любое несовпадение UB и внутри пусть компилятор будет уверен, что одно точно алиас другого до того дня, когда проверки реально введут.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/486/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/486/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/485", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/485/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/485/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/485/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/485", + "id": 1052195221, + "node_id": "I_kwDOFK7cns4-tzmV", + "number": 485, + "title": "Что-то вроде dealiasing_cast(T2*) для POD-массивов с одинаковой компоновкой (layout'ом)", + "user": { + "login": "topin89", + "id": 25770107, + "node_id": "MDQ6VXNlcjI1NzcwMTA3", + "avatar_url": "https://avatars.githubusercontent.com/u/25770107?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/topin89", + "html_url": "https://github.com/topin89", + "followers_url": "https://api.github.com/users/topin89/followers", + "following_url": "https://api.github.com/users/topin89/following{/other_user}", + "gists_url": "https://api.github.com/users/topin89/gists{/gist_id}", + "starred_url": "https://api.github.com/users/topin89/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/topin89/subscriptions", + "organizations_url": "https://api.github.com/users/topin89/orgs", + "repos_url": "https://api.github.com/users/topin89/repos", + "events_url": "https://api.github.com/users/topin89/events{/privacy}", + "received_events_url": "https://api.github.com/users/topin89/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 6, + "created_at": "2021-11-12T17:23:04Z", + "updated_at": "2022-08-28T04:12:53Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "## Сама идея\r\n\r\nХочется иметь возможность явно говорить компилятору, что указатель на структуру\r\n\r\n```c++\r\nstruct xy{\r\n int x;\r\n int y;\r\n};\r\n```\r\n\r\nможно считать указателям на эту:\r\n\r\n```c++\r\nstruct Coords{\r\n int column;\r\n int row;\r\n};\r\n```\r\n\r\n## Применение\r\nСтруктуры вроде `lib1::Color` или `lib2::Coords` применяются во многих библиотеках, и как правило в них используются одни и те же типы, расположение и часто названия переменных. Это одни и те же структуры, и это одни и те же массивы структур. Но `reinterpret_cast(xy_pointer)` невозможен без нарушения Strict Aliasing. Следовательно, если результат одной библиотеки нужно передать как аргумент в другую, нужно сильно извернуться.\r\n\r\nЭто или копирование всего массива, или, если библиотека поддерживает итераторы, написание итератора-конвертера. Или забить и писать `reinterpret_cast` и надеятся на лучшее. В конце концов, в clang'е прокатывает даже\r\n\r\n```c++\r\nstd::vector a;\r\nstd::vector &b = *reinterpret_cast< std::vector* >(&a);\r\n```\r\nКонечно, кроме случаев, когда не прокатывает.\r\n\r\nЕсли библиотека поддерживает std::span на вход, было бы возможно сделать\r\n\r\n```\r\nstd::span a{...};\r\nstd::span b;\r\nstd::memcpy(a, b, sizeof(A));\r\n```\r\n\r\nно опять же, в момент взятия значения из B* Где-то в потрохах span'а, будет нарушения строгости и неопределённое поведение.\r\n\r\n## Ожидаемые проблемы\r\n\r\nСамо правило строгого разыменования взялось не от хорошей жизни. Тревис Доунс [хорошо описал](https://travisdowns.github.io/blog/2019/08/26/vector-inc.html), а в PVS-Studio [хорошо перевели](https://habr.com/ru/company/pvs-studio/blog/475636/), как отсутствие подобного ограничения влияет на банальный обход по вектору char'ов. И, если я правильно понял, сама возможность подобного преобразования может порушить часть оптимизаций.\r\n\r\nДумаю, это можно обойти через std::launder (если я правильно понял механизм отмывания памяти) или разрешив только преобразование к указателям на константы.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/485/reactions", + "total_count": 1, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 1, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/485/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/484", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/484/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/484/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/484/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/484", + "id": 1044074496, + "node_id": "I_kwDOFK7cns4-O1AA", + "number": 484, + "title": "`std::is_default_destructible` и друзья", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-11-03T20:17:39Z", + "updated_at": "2021-11-05T21:10:37Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Предлагается ввести следующие _type traits_:\r\n\r\n```c++\r\nnamespace std {\r\n template struct is_default_destructible;\r\n template struct is_default_copy_constructible;\r\n template struct is_default_move_constructible;\r\n template struct is_default_copy_assignable;\r\n template struct is_default_move_assignable;\r\n} // namespace std\r\n```\r\n\r\nЭти структуры предоставляют `::value == true` тогда и только тогда, когда соответствующая функция определяется компилятором:\r\n\r\n- явно посредством синтаксиса `= default;`\r\n- неявно при отсутствии какой-либо декларации.\r\n\r\n`is_default_XXX` — более строгое условие, чем `is_XXX`, но менее строгое, чем `is_trivially_XXX`.\r\n\r\n## Примеры\r\n\r\n```c++\r\nstruct A {\r\n int a;\r\n};\r\n\r\nstatic_assert(std::is_copy_constructible::value);\r\nstatic_assert(std::is_default_copy_constructible::value);\r\nstatic_assert(std::is_trivially_copy_constructible::value);\r\n\r\nstruct B {\r\n std::string b;\r\n};\r\n\r\nstatic_assert(std::is_copy_constructible::value);\r\nstatic_assert(std::is_default_copy_constructible::value);\r\nstatic_assert(std::is_trivially_copy_constructible::value == false);\r\n\r\nstruct C {\r\n std::string c;\r\n C(const C& rhs) : c(rhs.c + \"_copy\") { }\r\n};\r\n\r\nstatic_assert(std::is_copy_constructible::value);\r\nstatic_assert(std::is_default_copy_constructible::value == false);\r\nstatic_assert(std::is_trivially_copy_constructible::value == false);\r\n\r\nstruct D {\r\n std::unique_ptr d;\r\n};\r\n\r\nstatic_assert(std::is_copy_constructible::value == false);\r\nstatic_assert(std::is_default_copy_constructible::value == false);\r\nstatic_assert(std::is_trivially_copy_constructible::value == false);\r\n```\r\n\r\n## Мотивация\r\n\r\nНаличие свойства `is_default_...` говорит, что объект этого типа может быть безопасно создан/скопирован/перемещён/уничтожен применением операции к каждому из полей, при этом нет ограничений на каждое поле.\r\nТакие _type traits_ обобщают работу с агрегатами, в частности, их преобразование в кортежи и обратно через Boost.PFR, и преобразование в менее стандартные структуры данных (например, SoA).\r\n\r\nНа текущий момент С++ имеет _type trait_ `is_aggregate`, имеющий похожий функционал.\r\nОднако, соответствующим ему типам позволено иметь явно определённые операторы присваивания и деструкторы:\r\n\r\n```c++\r\nstruct Aggregate {\r\n std::string a;\r\n std::string b;\r\n std::string c;\r\n Aggregate& operator=(const Aggregate& rhs) { std::tie(a, b, c) = std::tie(c, a, b); return *this; }\r\n Aggregate& operator=(Aggregate&& rhs) { std::tie(a, b, c) = std::tie(b, c, a); return *this; }\r\n ~Aggregate() { std::cout << \"Destructor\\n\"; }\r\n};\r\n\r\nstatic_assert(std::is_aggregate_v);\r\n\r\nstatic_assert(std::is_copy_assignable::value);\r\nstatic_assert(std::is_default_copy_assignable::value == false);\r\nstatic_assert(std::is_trivially_copy_assignable::value == false);\r\n```\r\n\r\n## Замечания\r\n\r\n### Декларация и определение\r\n\r\nОтметим, что для следующего кода установить истинность _type trait_ невозможно:\r\n```c++\r\n// a.h\r\nstruct DontKnow {\r\n ~DontKnow();\r\n};\r\n\r\nstatic_assert(std::is_default_destructible::value == false);\r\n\r\n// a.cpp\r\nDontKnow::~DontKnow() = default;\r\n```\r\n\r\n### Короткая форма\r\n\r\nВ духе C++17 вводятся короткие формы:\r\n```c++\r\nnamespace std {\r\n template bool is_default_destructible_v = is_default_destructible::value;\r\n template bool is_default_copy_constructible_v = is_default_copy_constructible::value;\r\n template bool is_default_move_constructible_v = is_default_move_constructible::value;\r\n template bool is_default_copy_assignable_v = is_default_copy_assignable::value;\r\n template bool is_default_move_assignable_v = is_default_move_assignable::value;\r\n} // namespace std\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/484/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/484/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/483", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/483/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/483/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/483/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/483", + "id": 1039524838, + "node_id": "I_kwDOFK7cns499ePm", + "number": 483, + "title": "Операторы ввода/вывода для miliseconds, seconds, etc.", + "user": { + "login": "blacktea", + "id": 42189825, + "node_id": "MDQ6VXNlcjQyMTg5ODI1", + "avatar_url": "https://avatars.githubusercontent.com/u/42189825?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/blacktea", + "html_url": "https://github.com/blacktea", + "followers_url": "https://api.github.com/users/blacktea/followers", + "following_url": "https://api.github.com/users/blacktea/following{/other_user}", + "gists_url": "https://api.github.com/users/blacktea/gists{/gist_id}", + "starred_url": "https://api.github.com/users/blacktea/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/blacktea/subscriptions", + "organizations_url": "https://api.github.com/users/blacktea/orgs", + "repos_url": "https://api.github.com/users/blacktea/repos", + "events_url": "https://api.github.com/users/blacktea/events{/privacy}", + "received_events_url": "https://api.github.com/users/blacktea/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2021-10-29T12:39:14Z", + "updated_at": "2021-10-29T12:39:14Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Предлагаю добавить операторы ввода/вывода(operator>>, operator<<) для std::chrono::duration.\r\nЭто будет удобно считывать из потока значения периода. Так же избавляет от создания временной переменой.\r\n\r\nНапример, необходимо считать из стандартного ввода продолжительность чего либо измеряемое в секундах.\r\n\r\n```\r\nint period;\r\nstd::cin >> period; \r\nstd::chrono::seconds periodSecs{ period };\r\n```\r\nКак видно, приходится создавать доп. переменную `period` для создания duration.\r\n\r\nС выводом дела обстоят чуть проще, но все равно нужно вызывать count(). Вместо этого можно было писать:\r\n\r\n```\r\nstd::chrono::seconds periodSecs{ 5 };\r\nstd::cout << periodSecs;\r\n```\r\n\r\nКажется, добавление операторов не ломает какой либо код.\r\n\r\nПолезные ссылки:\r\n* https://en.cppreference.com/w/cpp/chrono/duration\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/483/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/483/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/482", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/482/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/482/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/482/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/482", + "id": 1034487425, + "node_id": "I_kwDOFK7cns49qQaB", + "number": 482, + "title": "Рефлексия над pointer-to-member на этапе компиляции", + "user": { + "login": "pavelkryukov", + "id": 11466405, + "node_id": "MDQ6VXNlcjExNDY2NDA1", + "avatar_url": "https://avatars.githubusercontent.com/u/11466405?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pavelkryukov", + "html_url": "https://github.com/pavelkryukov", + "followers_url": "https://api.github.com/users/pavelkryukov/followers", + "following_url": "https://api.github.com/users/pavelkryukov/following{/other_user}", + "gists_url": "https://api.github.com/users/pavelkryukov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pavelkryukov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pavelkryukov/subscriptions", + "organizations_url": "https://api.github.com/users/pavelkryukov/orgs", + "repos_url": "https://api.github.com/users/pavelkryukov/repos", + "events_url": "https://api.github.com/users/pavelkryukov/events{/privacy}", + "received_events_url": "https://api.github.com/users/pavelkryukov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 4, + "created_at": "2021-10-24T18:49:24Z", + "updated_at": "2022-02-10T22:04:43Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "У поля структуры есть три базовых представления:\r\n- порядковый номер в структуре (индекс)\r\n- смещение относительно начала структуры (`offsetof`)\r\n- pointer-to-member\r\n\r\nПреобразование между тремя представлениями сделать сложно. Между первым и вторым конвертирует [Type Loophole](https://github.com/alexpolt/luple), но у этого трюка есть много ограничений, низкая скорость компиляции и т. д. Третье подключить можно, но с ещё большими ухищрениями (https://github.com/boostorg/pfr/issues/60).\r\n\r\nПри этом последнее представление и наиболее полно, и наиболее надёжно реализовано в C++ (и С).\r\nПредлагается считать его основным, и попросить компилятор объявить переменные, через которые определяются все преобразования:\r\n\r\n```c++\r\nnamespace ptm { // pointer-to-member\r\n\r\ntemplate\r\nconstexpr size_t number_of_members = $$$;\r\n\r\ntemplate\r\nconstexpr size_t index_of_member = $$$;\r\n\r\ntemplate\r\nstruct type_of_member { using type = $$$; };\r\n\r\ntemplate::type>\r\nstruct type_of_pointer_to_member { using type = R T::*; }\r\n\r\ntemplate\r\nconstexpr type_of_pointer_to_member pointer_to_member = $$$;\r\n\r\n} // namespace ptm\r\n\r\n```\r\n\r\nВ результате имплементация [Boost.PFR](https://github.com/boostorg/pfr) сильно сократится:\r\n\r\n```c++\r\n\r\nnamespace details {\r\n\r\ntemplate\r\nauto structure_tie(T& object, std::index_sequence)\r\n{\r\n return std::tie(*(object.*ptm::pointer_to_member)...);\r\n}\r\n\r\n} // namespace details\r\n\r\ntemplate\r\nauto structure_tie(T& object)\r\n{\r\n return details::structure_tie(object, std::make_index_sequence>{});\r\n}\r\n\r\n```\r\n\r\nОтсюда же порождается имплементация #468:\r\n\r\n```c++\r\nnamespace details {\r\n\r\ntemplate\r\nconstexpr auto tuple_of_memptrs(std::index_sequence)\r\n{\r\n return std::tuple(ptm::pointer_to_member)...);\r\n}\r\n\r\n} // namespace details\r\n\r\ntemplate\r\nconstexpr auto tuple_of_memptrs()\r\n{\r\n return details::tuple_of_memptrs(std::make_index_sequence>());\r\n}\r\n\r\n```\r\n\r\nНе самым оптимальным образом, но порождается [PR0908](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0908r0.html)\r\n\r\n```c++\r\n\r\nnamespace details {\r\n\r\ntemplate\r\nconstexpr auto offsetof_impl(R T::* member)\r\n{\r\n static_assert(I < ptm::number_of_members);\r\n if constexpr (!std::is_same_v>)\r\n return offsetof_impl(member);\r\n else if (ptm::pointer_to_member != member)\r\n return offsetof_impl(member);\r\n else\r\n return offsetof(T, ptm::pointer_to_member);\r\n}\r\n\r\n} // namespace details\r\n\r\ntemplate\r\nauto offsetof_dynamic(R T::* member)\r\n{\r\n return details::offsetof_impl<0>(member);\r\n}\r\n\r\n```\r\n\r\n`index_of_member` может быть использован для метапрограммирования нестандартного расположения полей (SoA, упаковка и т. д.)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/482/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/482/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/481", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/481/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/481/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/481/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/481", + "id": 1014598231, + "node_id": "I_kwDOFK7cns48eYpX", + "number": 481, + "title": "Управление квалификаторами методов", + "user": { + "login": "infy-infy", + "id": 42450030, + "node_id": "MDQ6VXNlcjQyNDUwMDMw", + "avatar_url": "https://avatars.githubusercontent.com/u/42450030?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/infy-infy", + "html_url": "https://github.com/infy-infy", + "followers_url": "https://api.github.com/users/infy-infy/followers", + "following_url": "https://api.github.com/users/infy-infy/following{/other_user}", + "gists_url": "https://api.github.com/users/infy-infy/gists{/gist_id}", + "starred_url": "https://api.github.com/users/infy-infy/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/infy-infy/subscriptions", + "organizations_url": "https://api.github.com/users/infy-infy/orgs", + "repos_url": "https://api.github.com/users/infy-infy/repos", + "events_url": "https://api.github.com/users/infy-infy/events{/privacy}", + "received_events_url": "https://api.github.com/users/infy-infy/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2021-10-03T23:48:08Z", + "updated_at": "2021-10-17T18:56:26Z", + "closed_at": "2021-10-17T18:56:26Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "1. Предлагаю введение нового ключевого слова **declqual** для вычисления квалификаторов метода. `declqual(T)` должен \"возвращать\" квалификаторы, принимая на вход тип. Рассмотрим механику работы на следующем примере:\r\n\r\n```\r\ntemplate\r\nclass Wrapper\r\n{\r\npublic:\r\n T get() declqual(T) { return _value;}\r\nprivate:\r\n T _value;\r\n};\r\n```\r\n\r\nВ данном случае, если T не является ссылкой или является lvalue ссылкой, то квалификатор метода будет `&`. Если T это константная ссылка (строго говоря, тип `const T&` или `const T&&` это ссылка на константный тип, но все привыкли говорить \"константная ссылка\"), то квалификаторы будут, соответственно, `const &` или `const &&.` Если T это rvalue ссылка, то квалификатор будет `&&`.\r\n\r\n2. Выражение `declqual(auto)` будет создавать все варианты квалификаторов по мере того, как компилятор будет натыкаться на очередной вариант использования. На самом деле, юзкейс этого выражения и является основным мотиватором этой идеи: с помощью этого выражения можно будет избавиться от дублирования кода или использования уродливого const_cast в геттерах. Например:\r\n\r\nРаньше:\r\n```\r\nclass Wrapper\r\n{\r\npublic:\r\nauto& get_by_key(std::string_view k, SomeType& def) const {\r\n if (auto it = _map.find(k); it != _map.end()) {\r\n return it->second;\r\n }\r\n return def;\r\n}\r\n\r\n// Non-const version 1: code duplicate\r\nauto& get_by_key(std::string_view k, SomeType& def) {\r\n if (auto it = _map.find(k); it != _map.end()) {\r\n return it->second;\r\n }\r\n return def;\r\n}\r\n\r\n// Non-const version 2: ugly const casts\r\nauto& get_by_key(std::string_view k, SomeType& def) {\r\n auto& result = const_cast(this)->getByKey(k, def);\r\n return const_cast(result);\r\n}\r\nprivate:\r\n std::map> _map;\r\n};\r\n```\r\nСтало\r\n```\r\nclass Wrapper\r\n{\r\npublic:\r\nauto& get_by_key(std::string_view k, SomeType& def) declqual(auto) & {\r\n if (auto it = _map.find(k); it != _map.end()) {\r\n return it->second;\r\n }\r\n return def;\r\n}\r\nprivate:\r\n std::map> _map;\r\n};\r\n```\r\n\r\nКак можно заметить, в последнем примере стоит `&` после выражения: я предлагаю оставлять возможность сокращать количество вариаций за счет явного указания квалификаторов после выражение `declqual`. В примере выше это означает, что `get_by_key` может иметь квалификаторы только `const&` или `&` (ну и формально, конечно, варианты с `volatile`). Явное указание может производится либо непосредственной подстановкой руками, либо с помощью того же `declqual`. Например:\r\n\r\n```\r\ntemplate\r\nclass Wrapper\r\n{\r\npublic:\r\n // instead of conditional_t there could be some magical trait that removes cv qualifiers from references\r\n T get() declqual(auto) declqual(std::conditional_t, int&&, int&>) { return _value;}\r\nprivate:\r\n T _value;\r\n};\r\n```\r\nВ данном случае второй declqual говорит о том, что ссылочный квалификатор get() может быть либо && (если T - это rvalue ссылка), либо & (когда тип lvalue ссылка или не ссылка). Поэтому declqual(auto) может варьировать только cv квалификаторы для конкретного класса.\r\n\r\nобъявление `T get() declqual(auto) const volatile &` не должно считаться ошибкой, т.к. в такое может \"вычислиться\" declqual(...) в шаблонном коде. Тогда declqual(auto) тут не будет иметь никакого эффекта, т.к. все квалификаторы указаны явно.\r\n\r\nОднако этого может оказаться недостаточно, если мы хотим явно запрещать cv квалификаторы. По аналогии с consteval предлагаю ввести подобную запись:\r\n`T get() declqual(auto) !volatile &` - это означает, что варьироваться может только const квалификатор, а volatile всегда отсутствует. Разумеется, разрешить подобное только при использовании declqual(auto), чтобы нельзя было обычные методы помечать как !const или !volatile. \r\n\r\nЯ вижу данный инструментарий логичным продолжением функциональности explicit(bool), которая убивает сразу двух зайцев - во-первых, дает возможность управлять квалификаторами методов из шаблонного кода, во-вторых - избавляет язык от проблемы геттеров. \r\nОднако нужно придумать более мощные примеры полезного использования declqual(T), текущие демонстрируют только принцип работы. ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/481/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/481/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/480", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/480/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/480/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/480/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/480", + "id": 1007870288, + "node_id": "I_kwDOFK7cns48EuFQ", + "number": 480, + "title": "Разбить stl классы по headers", + "user": { + "login": "olegpublicprofile", + "id": 74463792, + "node_id": "MDQ6VXNlcjc0NDYzNzky", + "avatar_url": "https://avatars.githubusercontent.com/u/74463792?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/olegpublicprofile", + "html_url": "https://github.com/olegpublicprofile", + "followers_url": "https://api.github.com/users/olegpublicprofile/followers", + "following_url": "https://api.github.com/users/olegpublicprofile/following{/other_user}", + "gists_url": "https://api.github.com/users/olegpublicprofile/gists{/gist_id}", + "starred_url": "https://api.github.com/users/olegpublicprofile/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/olegpublicprofile/subscriptions", + "organizations_url": "https://api.github.com/users/olegpublicprofile/orgs", + "repos_url": "https://api.github.com/users/olegpublicprofile/repos", + "events_url": "https://api.github.com/users/olegpublicprofile/events{/privacy}", + "received_events_url": "https://api.github.com/users/olegpublicprofile/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-09-27T08:45:52Z", + "updated_at": "2021-09-27T14:16:06Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Вместо того, что бы каждый раз искать какой header нужно подключить нужно открывать С++ документацию и смотреть в каком header находится STL класс. Пример Qt библиотека, там каждый класс в отдельном header и легко понять какой header нужно добавить в include\r\n\r\nНапример :\r\n\r\n- Старый код:\r\n\r\n```cpp\r\n#include \r\n\r\nint main()\r\n{\r\n\tstd::pair pair;\r\n\treturn 0;\r\n}\r\n```\r\n\r\n- Новый код:\r\n\r\n```cpp\r\n#include \r\n\r\nint main()\r\n{\r\n\tstd::pair pair;\r\n\treturn 0;\r\n}\r\n```\r\n\r\nВозможная реализация: https://github.com/olegpublicprofile/stdeasy\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/480/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/480/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/479", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/479/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/479/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/479/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/479", + "id": 999704106, + "node_id": "I_kwDOFK7cns47lkYq", + "number": 479, + "title": "constexpr- и consteval-классы", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815551289, + "node_id": "MDU6TGFiZWwyODE1NTUxMjg5", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%20%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D0%BE%D0%BC", + "name": "Помощь советом", + "color": "FEF2C0", + "default": false, + "description": "Идея прорабатывается другими участниками международного коммитета" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-09-17T20:38:33Z", + "updated_at": "2021-09-23T04:54:00Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Посмотрите на любую библиотеку, в которой showcase возможностей constexpr-а:\r\n[frozen](https://github.com/serge-sans-paille/frozen/blob/master/include/frozen/set.h)\r\n[constexpr_all_the_things](https://github.com/lefticus/constexpr_all_the_things/blob/master/src/include/cx_vector.h)\r\n\r\nВозникает стойкое ощущение, что классам/структурам не хватает объявления \"пометь все мои функции как constexpr\" или (начиная с С++20) \"как consteval\". Это может быть важно с модой на constexpr в последнее время.\r\n\r\nПредлагаю иметь возможность объявлять constexpr- и consteval-классы, чтобы запись\r\n```cpp\r\nconstexpr class conststr { // <<< пометка класса constexpr\r\n const char* p;\r\n std::size_t sz;\r\npublic:\r\n template\r\n conststr(const char(&a)[N]): p(a), sz(N - 1) {}\r\n \r\n char operator[](std::size_t n) const\r\n {\r\n return n < sz ? p[n] : throw std::out_of_range(\"\");\r\n }\r\n std::size_t size() const { return sz; }\r\n};\r\n```\r\nбыла эквивалентна\r\n```cpp\r\nclass conststr {\r\n const char* p;\r\n std::size_t sz;\r\npublic:\r\n template\r\n constexpr conststr(const char(&a)[N]): p(a), sz(N - 1) {} // <<< пометка метода constexpr\r\n \r\n constexpr char operator[](std::size_t n) const // <<< пометка метода constexpr\r\n {\r\n return n < sz ? p[n] : throw std::out_of_range(\"\");\r\n }\r\n constexpr std::size_t size() const { return sz; } // <<< пометка метода constexpr\r\n};\r\n```\r\nАналогично можно ввести объявление `consteval class conststr`, которое будет семантически отличаться.\r\n\r\nP. S. Надеюсь, эта идея не слишком очевидна, чтобы ее не предложил кто-то другой =)\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/479/reactions", + "total_count": 3, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/479/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/478", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/478/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/478/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/478/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/478", + "id": 997555410, + "node_id": "I_kwDOFK7cns47dXzS", + "number": 478, + "title": "Краткий синтаксис для ограничения шаблонных шаблонных аргументов концептами", + "user": { + "login": "Mrkol", + "id": 2286419, + "node_id": "MDQ6VXNlcjIyODY0MTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/2286419?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Mrkol", + "html_url": "https://github.com/Mrkol", + "followers_url": "https://api.github.com/users/Mrkol/followers", + "following_url": "https://api.github.com/users/Mrkol/following{/other_user}", + "gists_url": "https://api.github.com/users/Mrkol/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Mrkol/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Mrkol/subscriptions", + "organizations_url": "https://api.github.com/users/Mrkol/orgs", + "repos_url": "https://api.github.com/users/Mrkol/repos", + "events_url": "https://api.github.com/users/Mrkol/events{/privacy}", + "received_events_url": "https://api.github.com/users/Mrkol/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2021-09-15T22:00:36Z", + "updated_at": "2021-09-15T22:05:06Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Так сейчас можно:\r\n```cpp\r\ntemplate\r\nconcept DerivedFrom = std::derived_from;\r\n\r\ntemplate T>\r\nvoid foo(T t) { ... }\r\n```\r\nА вот так нельзя:\r\n```cpp\r\ntemplate class Template, class... Ts>\r\nconcept Instantiatible = requires { typename Template; };\r\n\r\n// ошибка: краткий синтаксис работает только с концептами над типами\r\ntemplate Template>\r\nvoid foo(Template t) { ... }\r\n```\r\nПример конечно тривиальный, но \"в жизни\" это тоже бывает полезно. При параметризации кода по контейнеру для данных часто нужен любой контейнер, обладающий какими-то свойствами (например любой упорядоченный ассоциативный контейнер). Ещё один юзкейс -- [policy based design](https://en.wikipedia.org/wiki/Modern_C%2B%2B_Design#Policy-based_design), где политики обычно являются шаблонами, удовлетворяющими каким-либо свойствам. В обоих случаях приятнее сразу писать какой именно шаблон нужен, а не дописывать всё повторно в requires-clause.\r\nС ходу в голову не приходит хороших причин, почему для типов этот сахар поддерживается, а для других сущностей -- нет.\r\n\r\nАналогичная ситуация наблюдается и с нетиповыми шаблонными аргументами вроде целых чисел, однако не уверен, что их поддержка имеет практический смысл.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/478/reactions", + "total_count": 5, + "+1": 5, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/478/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/477", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/477/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/477/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/477/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/477", + "id": 988604358, + "node_id": "MDU6SXNzdWU5ODg2MDQzNTg=", + "number": 477, + "title": "API для ресурсов в С++", + "user": { + "login": "Izaron", + "id": 5406399, + "node_id": "MDQ6VXNlcjU0MDYzOTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/5406399?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Izaron", + "html_url": "https://github.com/Izaron", + "followers_url": "https://api.github.com/users/Izaron/followers", + "following_url": "https://api.github.com/users/Izaron/following{/other_user}", + "gists_url": "https://api.github.com/users/Izaron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Izaron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Izaron/subscriptions", + "organizations_url": "https://api.github.com/users/Izaron/orgs", + "repos_url": "https://api.github.com/users/Izaron/repos", + "events_url": "https://api.github.com/users/Izaron/events{/privacy}", + "received_events_url": "https://api.github.com/users/Izaron/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815551289, + "node_id": "MDU6TGFiZWwyODE1NTUxMjg5", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%20%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D0%BE%D0%BC", + "name": "Помощь советом", + "color": "FEF2C0", + "default": false, + "description": "Идея прорабатывается другими участниками международного коммитета" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2021-09-05T21:40:19Z", + "updated_at": "2022-02-19T10:52:58Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "### API ресурсов\r\n\r\nИдея в том, чтобы реализовать в C++ понятие \"ресурсов\" (или \"архива\"). API для них будет в условном `std::resources` или `std::archive`.\r\n\r\n\"Ресурс\" - это файл любого расширения (изображения, звук, текст, видео, 3d-модельки, ..., набор байт), который с использованием нового API можно было бы \"вшить\" в исполняемый бинарник приложения (и не только туда, но об этом позже), и не загружать его \"руками\" после старта приложения, откуда-то из внешней директории.\r\n\r\nAPI разбивается на 2 части:\r\n\r\n1. Указание файлов для \"ресурсов\" и настроек по их хранению - compile-time.\r\n2. Обращение к этим файлам - run-time.\r\n\r\nУсловный пример кода по частям:\r\n\r\n1. В неком из `.cpp`-файлов проекта определяется статический объект апишки, который constexpr-ово инициализируется, и куда мы указываем все директории/файлы для зашивания, кодек их сжатия (более мощный уменьшит бинарь, но будет чуть медленнее), и т.д.:\r\n```\r\nstatic constinit const auto resources_holder = std::resources\r\n ::load_resources({\"images/\", \"models/\", \"license/MIT.txt\"});\r\n```\r\n2. В рантайме можно обращаться к файлам:\r\n```\r\nconst std::span logo = resources_holder.get_resource(\"images/logo.png\");\r\n```\r\n\r\n### Техническая реализация (кратко, отбросив мелочи)\r\nЕсли говорить про большинство Unix-ов: для объектных файлов и бинарей используется формат [ELF](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format).\r\nДля хранения ресурсов подходит секция `.rodata`. Эту секцию загрузчик во время старта приложения загружает в read-only режиме и держит в RAM.\r\n\r\nЗначит, в процессе компиляции перед линковкой, объектный файл того `.cpp`, где создается объект из 1 пункта, должен в `.rodata` содержать массив байт - загруженные ресурсы. Отсюда следует, что динамические и статические библиотеки могут являться носителями ресурсов наравне с бинарями.\r\n\r\n### Польза\r\n\r\nБолее быстрый запуск приложений, которые читают всякие файлы при старте. Более cache-friendly по сравнению с файлами, которых загрузили куда попало в кучу. Меньше головной боли для небольших приложений, которые имеют внешние ресурсы.\r\n\r\nML-приложения могут проще обращаться к своим моделькам из RAM.\r\n\r\nОсобенно неплохо будет для игр, где обычно много ресурсов (кроме тех, где они весят суммарно 100гб и то загружаются, то выгружаются из RAM).", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/477/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/477/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/476", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/476/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/476/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/476/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/476", + "id": 978137135, + "node_id": "MDU6SXNzdWU5NzgxMzcxMzU=", + "number": 476, + "title": "Запретить удаление incomplete классов", + "user": { + "login": "sergii-rybin-tfs", + "id": 80316799, + "node_id": "MDQ6VXNlcjgwMzE2Nzk5", + "avatar_url": "https://avatars.githubusercontent.com/u/80316799?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sergii-rybin-tfs", + "html_url": "https://github.com/sergii-rybin-tfs", + "followers_url": "https://api.github.com/users/sergii-rybin-tfs/followers", + "following_url": "https://api.github.com/users/sergii-rybin-tfs/following{/other_user}", + "gists_url": "https://api.github.com/users/sergii-rybin-tfs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sergii-rybin-tfs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sergii-rybin-tfs/subscriptions", + "organizations_url": "https://api.github.com/users/sergii-rybin-tfs/orgs", + "repos_url": "https://api.github.com/users/sergii-rybin-tfs/repos", + "events_url": "https://api.github.com/users/sergii-rybin-tfs/events{/privacy}", + "received_events_url": "https://api.github.com/users/sergii-rybin-tfs/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 4, + "created_at": "2021-08-24T14:04:07Z", + "updated_at": "2021-12-26T12:48:42Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "_Запретить удаление incomplete классов_\r\n\r\nClang & G++ выдают варнинг о UB.\r\nVisual Studio компилирует такой код без варнингов.\r\n\r\nСамо поведение компилятора в этой ситуации ставит в тупик большинство специалистов, и часто является нежелательным (из за утечки памяти и ресурсов в агрегатах). А сама ошибка весьма распространена при попытках реализовать pimpl и подобные паттерны (А так же при изменении порядка инклудов).\r\n\r\nБез этой функции, язык будет более предсказуемым и безопасным.\r\n\r\nПолезные ссылки:\r\n* https://en.cppreference.com/w/cpp/language/delete\r\n* https://godbolt.org/z/xKeG3Y1xb\r\n* https://stackoverflow.com/questions/4325154/delete-objects-of-incomplete-type\r\n* https://wiki.sei.cmu.edu/confluence/display/cplusplus/EXP57-CPP.+Do+not+cast+or+delete+pointers+to+incomplete+classes\r\n\r\nПример кода:\r\n\r\n```C++\r\nclass a;\r\na* val;\r\nvoid foo()\r\n{\r\n delete val;\r\n}\r\n\r\nclass a{\r\n ~a() = delete;\r\n};\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/476/reactions", + "total_count": 6, + "+1": 6, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/476/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/475", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/475/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/475/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/475/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/475", + "id": 972050809, + "node_id": "MDU6SXNzdWU5NzIwNTA4MDk=", + "number": 475, + "title": "Убрать некоторые перегрузки для `std::array` с нулевым размером", + "user": { + "login": "unterumarmung", + "id": 39276703, + "node_id": "MDQ6VXNlcjM5Mjc2NzAz", + "avatar_url": "https://avatars.githubusercontent.com/u/39276703?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/unterumarmung", + "html_url": "https://github.com/unterumarmung", + "followers_url": "https://api.github.com/users/unterumarmung/followers", + "following_url": "https://api.github.com/users/unterumarmung/following{/other_user}", + "gists_url": "https://api.github.com/users/unterumarmung/gists{/gist_id}", + "starred_url": "https://api.github.com/users/unterumarmung/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/unterumarmung/subscriptions", + "organizations_url": "https://api.github.com/users/unterumarmung/orgs", + "repos_url": "https://api.github.com/users/unterumarmung/repos", + "events_url": "https://api.github.com/users/unterumarmung/events{/privacy}", + "received_events_url": "https://api.github.com/users/unterumarmung/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 7, + "created_at": "2021-08-16T19:51:34Z", + "updated_at": "2021-09-05T19:54:48Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В текущем варианте функции `front`, `back`, `operator[]` имеют неопределенное поведение, если `array.size() == 0`.\r\nДанное решение видимо было сделано, чтобы специализации `std::array` удовлетворяли требованию [`SequenceContainer`](https://en.cppreference.com/w/cpp/named_req/SequenceContainer). Но точно ли массив нулевого размера является sequence container? Тем более, на cppreference указано, что для `std::array` есть исключения.\r\n\r\nУдаление перегрузок данных перегрузок имеет два преимущества:\r\n* Убирается UB там, где это легко и удобно заменяется ошибкой компиляции, как для реализаций стандартной библиотеки, так и для её пользователей.\r\n* Данные функции можно сделать `noexcept`, так как в них больше нет UB.\r\n\r\nНедостаток один:\r\n* Специализации `std::array` перестают удовлетворять требованию `SequenceContainer`. Кажется, это не является большой потерей.\r\n\r\nПсевдокод реализации:\r\n\r\n```cpp\r\ntemplate \r\nstruct array\r\n{\r\n...\r\n reference front() noexcept requires N != 0;\r\n const_reference front() const noexcept requires N != 0;\r\n reference back() noexcept requires N != 0;\r\n const_reference back() const noexcept requires N != 0;\r\n reference operator[](size_type pos) noexcept requires N != 0;\r\n const_reference operator[](size_type pos) const noexcept requires N != 0;\r\n...\r\n};\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/475/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/475/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/474", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/474", + "id": 969717622, + "node_id": "MDU6SXNzdWU5Njk3MTc2MjI=", + "number": 474, + "title": "Упрощение синтаксиса захвата лямбда функций ", + "user": { + "login": "AI-Decay", + "id": 55590011, + "node_id": "MDQ6VXNlcjU1NTkwMDEx", + "avatar_url": "https://avatars.githubusercontent.com/u/55590011?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/AI-Decay", + "html_url": "https://github.com/AI-Decay", + "followers_url": "https://api.github.com/users/AI-Decay/followers", + "following_url": "https://api.github.com/users/AI-Decay/following{/other_user}", + "gists_url": "https://api.github.com/users/AI-Decay/gists{/gist_id}", + "starred_url": "https://api.github.com/users/AI-Decay/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AI-Decay/subscriptions", + "organizations_url": "https://api.github.com/users/AI-Decay/orgs", + "repos_url": "https://api.github.com/users/AI-Decay/repos", + "events_url": "https://api.github.com/users/AI-Decay/events{/privacy}", + "received_events_url": "https://api.github.com/users/AI-Decay/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 12, + "created_at": "2021-08-12T23:00:11Z", + "updated_at": "2021-10-03T23:14:49Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Описание идеи\r\n\r\nВ С++ мы имеем:\r\n```\r\nint variable = 0; \r\nauto a = [variable]() {} - Захват по значению\r\nauto a = [&variable]() {} - Захват по ссылке \r\nauto a = [variable = std::move(variable)]() {} - Но для захвата с перемещением \r\nнеобходимо использовать синтаксис с переименованием \r\n```\r\n\r\nПредлагаю для простоты и однородности использовать подобный синтаксис:\r\n`auto a = [&&variable]() {} // тождественно равно auto a = [variable = std::move(variable)]() {}\r\n`\r\n\r\n\r\nПример использования:\r\n```\r\n\r\nint main() {\r\n\r\n auto enableButtons = [](bool enabled) {\r\n\r\n };\r\n\r\n auto callback = [&&enableButtons]() {\r\n enableButtons(true);\r\n };\r\n\r\n return 0;\r\n}\r\n```\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/474/reactions", + "total_count": 3, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/474/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/473", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/473/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/473/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/473/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/473", + "id": 963503212, + "node_id": "MDU6SXNzdWU5NjM1MDMyMTI=", + "number": 473, + "title": "Модуляризация Стандартной библиотеки: сделать стандартный модуль для стектрейса", + "user": { + "login": "leha-bot", + "id": 10153298, + "node_id": "MDQ6VXNlcjEwMTUzMjk4", + "avatar_url": "https://avatars.githubusercontent.com/u/10153298?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leha-bot", + "html_url": "https://github.com/leha-bot", + "followers_url": "https://api.github.com/users/leha-bot/followers", + "following_url": "https://api.github.com/users/leha-bot/following{/other_user}", + "gists_url": "https://api.github.com/users/leha-bot/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leha-bot/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leha-bot/subscriptions", + "organizations_url": "https://api.github.com/users/leha-bot/orgs", + "repos_url": "https://api.github.com/users/leha-bot/repos", + "events_url": "https://api.github.com/users/leha-bot/events{/privacy}", + "received_events_url": "https://api.github.com/users/leha-bot/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2021-08-08T19:51:55Z", + "updated_at": "2021-08-08T19:51:55Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "# Описание идеи\r\nВ рамках глобальной цели, поставленной Комитетом по модуляризации и по принципу \"не платишь за то, что не надо\" предлагаю сделать стандартное имя модуля для стектрейса как `std.stacktrace`.\r\n\r\nЭто поможет тем, кому будет слишком тяжело таскать информацию о стектрейсе, и реализаторам Стандартной Библиотеки, т.к. они могут инкапсулировать реализации получения стектрейса в \"Разделы Модулей\", например, `std.stacktrace:libunwind` - реализация получения стектрейса с помощью `libunwind`,\r\n`std.stacktrace:noop` - реализация-заглушка.\r\n\r\n\r\n# Код с реализацией идеи\r\n\r\nБудет тут: github.com/leha-bot/STL , ветка `feature/stacktrace`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/473/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/473/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/472", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/472/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/472/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/472/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/472", + "id": 963287704, + "node_id": "MDU6SXNzdWU5NjMyODc3MDQ=", + "number": 472, + "title": "Сохранение/переключения контекста выполнения", + "user": { + "login": "night-beast", + "id": 26147018, + "node_id": "MDQ6VXNlcjI2MTQ3MDE4", + "avatar_url": "https://avatars.githubusercontent.com/u/26147018?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/night-beast", + "html_url": "https://github.com/night-beast", + "followers_url": "https://api.github.com/users/night-beast/followers", + "following_url": "https://api.github.com/users/night-beast/following{/other_user}", + "gists_url": "https://api.github.com/users/night-beast/gists{/gist_id}", + "starred_url": "https://api.github.com/users/night-beast/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/night-beast/subscriptions", + "organizations_url": "https://api.github.com/users/night-beast/orgs", + "repos_url": "https://api.github.com/users/night-beast/repos", + "events_url": "https://api.github.com/users/night-beast/events{/privacy}", + "received_events_url": "https://api.github.com/users/night-beast/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815551289, + "node_id": "MDU6TGFiZWwyODE1NTUxMjg5", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%20%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D0%BE%D0%BC", + "name": "Помощь советом", + "color": "FEF2C0", + "default": false, + "description": "Идея прорабатывается другими участниками международного коммитета" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2021-08-07T19:13:08Z", + "updated_at": "2023-06-17T05:35:43Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Для реализации stackful корутин нужно иметь возможность сохранять/переключать контекст выполнения.\r\n\r\nВ POSIX для этого были функции makecontext/swapcontext но на текущий момент они deprecated\r\nЕсть реализация под Unix https://github.com/kaniini/libucontext, а так же платформонезависимая реализация в Boost.context\r\n\r\nХотелось бы иметь такую базовую вещь в стандарте\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/472/reactions", + "total_count": 4, + "+1": 4, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/472/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/471", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/471/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/471/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/471/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/471", + "id": 957555686, + "node_id": "MDU6SXNzdWU5NTc1NTU2ODY=", + "number": 471, + "title": "Концепты в объявлении класса ", + "user": { + "login": "kol65536black", + "id": 6318365, + "node_id": "MDQ6VXNlcjYzMTgzNjU=", + "avatar_url": "https://avatars.githubusercontent.com/u/6318365?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kol65536black", + "html_url": "https://github.com/kol65536black", + "followers_url": "https://api.github.com/users/kol65536black/followers", + "following_url": "https://api.github.com/users/kol65536black/following{/other_user}", + "gists_url": "https://api.github.com/users/kol65536black/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kol65536black/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kol65536black/subscriptions", + "organizations_url": "https://api.github.com/users/kol65536black/orgs", + "repos_url": "https://api.github.com/users/kol65536black/repos", + "events_url": "https://api.github.com/users/kol65536black/events{/privacy}", + "received_events_url": "https://api.github.com/users/kol65536black/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815246228, + "node_id": "MDU6TGFiZWwyODE1MjQ2MjI4", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++20", + "name": "C++20", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++20" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-08-01T18:23:11Z", + "updated_at": "2021-08-01T21:29:27Z", + "closed_at": "2021-08-01T19:04:48Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Есть предложение добавить возможность прописывать концепты в месте где прописываем наследование.\r\n```c++\r\nclass SomeClass : public SomeParent1, SomeConcept1, SomeConcept2\r\n```\r\nПри этом подразумевается, что компилятор должен проверить класс требованиям концепта. Если не соответствует концепту, то код не компилируется.\r\n\r\nТак же думаю, был бы полезен способ описывать концепт в стиле трейтов или тайпклассов. Т.е. указать, что должны быть функции или поля с определенными именами.\r\nПример:\r\n```c++\r\ntemplate\r\nconcept class SomeConcept1\r\n{\r\npublic:\r\n void add(T& item); //требование, что класс должен иметь метод с названием add с соответствующей сигнатурой\r\n void remove(T& item); //требование, что класс должен иметь метод с названием remove с соответствующей сигнатурой\r\n};\r\n```\r\n\r\n\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/471/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/471/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/470", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/470/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/470/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/470/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/470", + "id": 952254058, + "node_id": "MDU6SXNzdWU5NTIyNTQwNTg=", + "number": 470, + "title": "Float16 как builtin тип", + "user": { + "login": "ilnurkh", + "id": 22670232, + "node_id": "MDQ6VXNlcjIyNjcwMjMy", + "avatar_url": "https://avatars.githubusercontent.com/u/22670232?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/ilnurkh", + "html_url": "https://github.com/ilnurkh", + "followers_url": "https://api.github.com/users/ilnurkh/followers", + "following_url": "https://api.github.com/users/ilnurkh/following{/other_user}", + "gists_url": "https://api.github.com/users/ilnurkh/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ilnurkh/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ilnurkh/subscriptions", + "organizations_url": "https://api.github.com/users/ilnurkh/orgs", + "repos_url": "https://api.github.com/users/ilnurkh/repos", + "events_url": "https://api.github.com/users/ilnurkh/events{/privacy}", + "received_events_url": "https://api.github.com/users/ilnurkh/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 5, + "created_at": "2021-07-25T11:27:06Z", + "updated_at": "2022-08-11T11:42:14Z", + "closed_at": "2022-08-11T11:38:28Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "_<Описание вашей идеи>_\r\nСделать поддержку этого типа в языке.\r\nОтдельно стоит прописать неоднозначность операций. (можно поднимать до fp32 и после операции опускать назад, а можно так не делеть. Можно делать так для цепочки операций, а можно делать усечение после каждой). В общем сложностей много, надо начать с этим как-то работать.\r\n\r\n_<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>_\r\nВесь нейроночный ml на нём. Пора уже и поддержать\r\n\r\n_<Код c реализацией вашей идеи, если есть>_\r\nhttps://github.com/catboost/catboost/tree/master/library/cpp/float16\r\n\r\nПолезные ссылки:\r\n* https://quick-bench.com/ - онлайн бенчмарк, поможет вам продемонстрировать эффективность вашего подхода\r\n* https://godbolt.org/ - онлайн дизассемблер\r\n* https://eel.is/c++draft/ - черновик стандарта C++ с возможностью ссылаться на конкретные параграфы\r\n* https://wg21.link/ - универсальная ссылка на международные proposal или баги в С++, например https://wg21.link/P1000 ссылается на документ P1000, а https://wg21.link/cwg100 на 100 баг в ядре языка\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/470/reactions", + "total_count": 5, + "+1": 5, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/470/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/469", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/469/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/469/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/469/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/469", + "id": 952246981, + "node_id": "MDU6SXNzdWU5NTIyNDY5ODE=", + "number": 469, + "title": "Поддержка run-time-cpu-dispatch", + "user": { + "login": "ilnurkh", + "id": 22670232, + "node_id": "MDQ6VXNlcjIyNjcwMjMy", + "avatar_url": "https://avatars.githubusercontent.com/u/22670232?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/ilnurkh", + "html_url": "https://github.com/ilnurkh", + "followers_url": "https://api.github.com/users/ilnurkh/followers", + "following_url": "https://api.github.com/users/ilnurkh/following{/other_user}", + "gists_url": "https://api.github.com/users/ilnurkh/gists{/gist_id}", + "starred_url": "https://api.github.com/users/ilnurkh/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ilnurkh/subscriptions", + "organizations_url": "https://api.github.com/users/ilnurkh/orgs", + "repos_url": "https://api.github.com/users/ilnurkh/repos", + "events_url": "https://api.github.com/users/ilnurkh/events{/privacy}", + "received_events_url": "https://api.github.com/users/ilnurkh/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2021-07-25T10:44:23Z", + "updated_at": "2021-07-25T10:44:23Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "_<Описание вашей идеи>_\r\nЕсть проблема - что сложно делать несколько реализаций (напирмер под sse-vs-avx) одной и той же функции.\r\nБыло бы здорово уметь сказать комплияторо-линковщику:\r\n1. есть определяемая на старте функция\r\n2. вот список реализаций\r\n3. вот эта функция на старте (либо лениво?) выберет конечную реализацию\r\n\r\nГлавное что хочется - чтобы вызывающий код вызывал фиксированный символ, а указатель туда бы подставился прозрачно. Цель - минимизация расходов на runtim-cpu-dispatching\r\n\r\nЗаодно это поднимает вопрос чтобы в стандарте появились какие-нибудь std::cpu::have_avx512() а так constexpr варианты, а также функции или макросы std::cpu::can_have_avx512() (означает что запуск возможен на платформе с этим флагом), при std::cpu::can_have_avx512() == false гарантируется что ни один translation-unit не будет собран с -mavx512\r\n\r\n_<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>_\r\nВезде будет полезна\r\n\r\n_<Код c реализацией вашей идеи, если есть>_\r\n\r\n\r\nПолезные ссылки:\r\n* https://quick-bench.com/ - онлайн бенчмарк, поможет вам продемонстрировать эффективность вашего подхода\r\n* https://godbolt.org/ - онлайн дизассемблер\r\n* https://eel.is/c++draft/ - черновик стандарта C++ с возможностью ссылаться на конкретные параграфы\r\n* https://wg21.link/ - универсальная ссылка на международные proposal или баги в С++, например https://wg21.link/P1000 ссылается на документ P1000, а https://wg21.link/cwg100 на 100 баг в ядре языка\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/469/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/469/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/468", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/468/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/468/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/468/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/468", + "id": 949027755, + "node_id": "MDU6SXNzdWU5NDkwMjc3NTU=", + "number": 468, + "title": "Structured bindings for member pointers", + "user": { + "login": "denzor200", + "id": 16864786, + "node_id": "MDQ6VXNlcjE2ODY0Nzg2", + "avatar_url": "https://avatars.githubusercontent.com/u/16864786?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/denzor200", + "html_url": "https://github.com/denzor200", + "followers_url": "https://api.github.com/users/denzor200/followers", + "following_url": "https://api.github.com/users/denzor200/following{/other_user}", + "gists_url": "https://api.github.com/users/denzor200/gists{/gist_id}", + "starred_url": "https://api.github.com/users/denzor200/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/denzor200/subscriptions", + "organizations_url": "https://api.github.com/users/denzor200/orgs", + "repos_url": "https://api.github.com/users/denzor200/repos", + "events_url": "https://api.github.com/users/denzor200/events{/privacy}", + "received_events_url": "https://api.github.com/users/denzor200/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 4, + "created_at": "2021-07-20T19:58:37Z", + "updated_at": "2021-11-19T06:35:10Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Нынешний Structured bindings позволяет нам извлекать ссылки на поля агрегата, при условии что нам известен размер агрегата.\r\nПредлагаю дополнительно добавить возможность извлекать member pointers на поля агрегата. Каким я вижу новый синтаксис: \r\n```\r\nstruct Aggregate\r\n{\r\n\tint first;\r\n\tchar second;\r\n\tdouble third;\r\n};\r\n\r\nauto [first_memptr, second_memptr, third_memptr] = &Aggregate::;\r\n\r\nauto obj = Aggregate{};\r\n\r\nobj.*first_memptr = 100;\r\nobj.*second_memptr = 'c';\r\nobj.*third_memptr = 3.14;\r\n\r\nstd::cout << obj.first << \" \" << obj.second << \" \" << obj.third << std::endl; ///< will print \"100 c 3.14\"\r\n```\r\n\r\nИзвлеченные member pointers могут быть constexpr\r\n```\r\nconstexpr auto tuple_of_memptrs() noexcept {\r\n auto [first_memptr, second_memptr, third_memptr] = &Aggregate::;\r\n return std::tuple{first_memptr, second_memptr, third_memptr};\r\n}\r\n\r\nconstexpr auto memptrs = tuple_of_memptrs();\r\n```\r\n\r\nТак же не забываем, что у некоторых агрегатов не может быть member pointers(например, при наличии битовых полей). В таких случаях придется выдавать ошибку компиляции.\r\n\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/468/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/468/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/467", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/467/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/467/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/467/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/467", + "id": 947581829, + "node_id": "MDU6SXNzdWU5NDc1ODE4Mjk=", + "number": 467, + "title": "Добавить значение \"успех\" в errc ", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815551289, + "node_id": "MDU6TGFiZWwyODE1NTUxMjg5", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%20%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D0%BE%D0%BC", + "name": "Помощь советом", + "color": "FEF2C0", + "default": false, + "description": "Идея прорабатывается другими участниками международного коммитета" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 4, + "created_at": "2021-07-19T12:03:39Z", + "updated_at": "2023-02-23T16:36:24Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Необходимо дабавить значение std::errc:success.\r\nИспользовать enum class для кода возврата и считать что успех это дефолтно сконструированный enum который содержит значение не перечисленное в обьявлении помоему шизофрения. (Да и выглядит не очень)\r\n\r\nПример из https://en.cppreference.com/w/cpp/utility/to_chars\r\n```\r\nint main()\r\n{\r\n std::array str;\r\n \r\n if(auto [ptr, ec] = std::to_chars(str.data(), str.data() + str.size(), 42);\r\n ec == std::errc())\r\n std::cout << std::string_view\r\n (str.data(), ptr); // C++20, uses string_view(first, last)\r\n // (str.data(), ptr - str.data()); // C++17, uses string_view(ptr, length)\r\n}\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/467/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/467/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/466", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/466/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/466/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/466/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/466", + "id": 946041698, + "node_id": "MDU6SXNzdWU5NDYwNDE2OTg=", + "number": 466, + "title": "Добавить метод \"split\" в класс std::string", + "user": { + "login": "aburmagin", + "id": 83090480, + "node_id": "MDQ6VXNlcjgzMDkwNDgw", + "avatar_url": "https://avatars.githubusercontent.com/u/83090480?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/aburmagin", + "html_url": "https://github.com/aburmagin", + "followers_url": "https://api.github.com/users/aburmagin/followers", + "following_url": "https://api.github.com/users/aburmagin/following{/other_user}", + "gists_url": "https://api.github.com/users/aburmagin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/aburmagin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/aburmagin/subscriptions", + "organizations_url": "https://api.github.com/users/aburmagin/orgs", + "repos_url": "https://api.github.com/users/aburmagin/repos", + "events_url": "https://api.github.com/users/aburmagin/events{/privacy}", + "received_events_url": "https://api.github.com/users/aburmagin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815246228, + "node_id": "MDU6TGFiZWwyODE1MjQ2MjI4", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++20", + "name": "C++20", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++20" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 5, + "created_at": "2021-07-16T07:58:50Z", + "updated_at": "2022-02-22T22:44:49Z", + "closed_at": "2022-02-22T19:37:17Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Во множестве языков, таких как \r\n\r\nJava: \r\nhttps://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#split(java.lang.String)\r\n\r\nC#:\r\nhttps://docs.microsoft.com/en-us/dotnet/api/system.string.split?view=net-5.0#System_String_Split_System_Char___\r\n\r\nPython:\r\nhttps://docs.python.org/3/library/stdtypes.html#str.split\r\n\r\nRust:\r\nhttps://doc.rust-lang.org/std/primitive.str.html#method.split\r\n\r\nGo: \r\nhttps://pkg.go.dev/strings#Split\r\n\r\nуже есть метод, позволяющий разделить строку на подстроки с использованием разделителя (сепаратора)\r\n\r\nОчень хотелось бы видеть такой же метод в классе строки языка C++.\r\n\r\nИдея будет полезна в большом числе случаев, учитывая то, что это достаточно популярная задача.\r\n\r\nНа данный момент для её решения используется множество разных способов, выглядящих громоздко:\r\nhttps://stackoverflow.com/questions/14265581/parse-split-a-string-in-c-using-string-delimiter-standard-c\r\n\r\nМетод принимает один параметр - разделитель, тип которого - char или std::string.\r\n\r\nПример использования:\r\n\r\n```\r\n#include \r\n\r\nint main(){\r\nstd::string string = \"foo,bar,baz\";\r\nstd::vector tokens = string.split(',');\r\n\r\nfor (const auto& token: tokens)\r\n std::cout << token << std::endl;\r\n\r\nreturn 0;\r\n}\r\n```\r\n\r\n```\r\nOutput:\r\nfoo\r\nbar\r\nbaz\r\n\r\n```\r\n\r\nВ случае невозможности разделения строки можно кидать исключение, либо придумать другой способ обработки ошибки.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/466/reactions", + "total_count": 3, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/466/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/465", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/465/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/465/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/465/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/465", + "id": 946002449, + "node_id": "MDU6SXNzdWU5NDYwMDI0NDk=", + "number": 465, + "title": "Частичное описание структуры/класса (только методы, не обязательно все)", + "user": { + "login": "osheter", + "id": 87515424, + "node_id": "MDQ6VXNlcjg3NTE1NDI0", + "avatar_url": "https://avatars.githubusercontent.com/u/87515424?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/osheter", + "html_url": "https://github.com/osheter", + "followers_url": "https://api.github.com/users/osheter/followers", + "following_url": "https://api.github.com/users/osheter/following{/other_user}", + "gists_url": "https://api.github.com/users/osheter/gists{/gist_id}", + "starred_url": "https://api.github.com/users/osheter/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/osheter/subscriptions", + "organizations_url": "https://api.github.com/users/osheter/orgs", + "repos_url": "https://api.github.com/users/osheter/repos", + "events_url": "https://api.github.com/users/osheter/events{/privacy}", + "received_events_url": "https://api.github.com/users/osheter/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2021-07-16T06:58:42Z", + "updated_at": "2021-07-16T08:09:46Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Компилятор C++ позволяет объявить имя типа без его полного описания (т.н. предварительное объявление). В дальнейшем это имя можно использовать в виде ссылки или указателя на тип. Если же переменная или поле данного типа используется для вызова метода, то в этой точке требуется иметь полное описание типа. Такое ограничение во многих случаях является избыточным, например если метод не виртуальный или даже статический.\r\n\r\nЧастичное предварительное описание методов типа позволит, там где это возможно, значительно улучшить читабельность кода, скрыть многие детали реализации, убрав их из заголовочных файлов и даже, в некоторых случаях, сократить время компиляции.\r\n\r\nСокрытие деталей реализации в C++ сегодня производится либо с помошью PIMPL либо введением интерфейсов. Интерфейсы наиболее близки частичному описанию, но все же их основная цель - это дать описание абстрактного интерфейса, который затем реализуется как правило группой нескольких различных классов. Если же класс только один, то выделение его публичных методов в отдельный интерфейс - это излишнее переусложнение. Мое предложение частичного описания класса упрощает данный подход, позволяя обходиться только одним именем класса.\r\n\r\nКонкретный синтаксис данной идеи может быть реализован с помощью extern или введением нового зарезервированного слова partial или forward (partial class, like in C#) или с помощью атрибута [[partial]] перед class/struct.\r\n\r\nПример использования:\r\n\r\n```\r\n// .h file \r\nextern struct worker\r\n{\r\n void work();\r\n};\r\n\r\ninline void do_work(worker& w)\r\n{\r\n w.work();\r\n}\r\n```\r\n\r\n```\r\n// .cpp file\r\nstruct worker\r\n{\r\n void work(); // optional declaration\r\nprivate:\r\n int x=0;\r\n};\r\n\r\nvoid worker::work() \r\n{\r\n x++;\r\n}\r\n```\r\n\r\nДругой способ (менее удобный на мой взгляд) это разрешить объявлять только заголовок метода:\r\n```\r\nclass foo;\r\nvoid foo::bar() const; // is it automatically public?\r\nstatic foo::bar2();\r\n```\r\n\r\nДолжно ли частичное описание класса затем повторяться в полном описании? Скорее всего не обязательно, хотя дублирование описаний не запрещено.\r\nВозможно ли существование класса на основании только частичных описаний? Наверное нет, потому что, если частичного описания достаточно, то зачем объявлять его частичным?\r\n\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/465/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/465/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/464", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/464/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/464/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/464/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/464", + "id": 938308480, + "node_id": "MDU6SXNzdWU5MzgzMDg0ODA=", + "number": 464, + "title": "Добавит возможности вызвать лямбду рекурсивно сам себя", + "user": { + "login": "raidenluikang", + "id": 24319853, + "node_id": "MDQ6VXNlcjI0MzE5ODUz", + "avatar_url": "https://avatars.githubusercontent.com/u/24319853?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/raidenluikang", + "html_url": "https://github.com/raidenluikang", + "followers_url": "https://api.github.com/users/raidenluikang/followers", + "following_url": "https://api.github.com/users/raidenluikang/following{/other_user}", + "gists_url": "https://api.github.com/users/raidenluikang/gists{/gist_id}", + "starred_url": "https://api.github.com/users/raidenluikang/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/raidenluikang/subscriptions", + "organizations_url": "https://api.github.com/users/raidenluikang/orgs", + "repos_url": "https://api.github.com/users/raidenluikang/repos", + "events_url": "https://api.github.com/users/raidenluikang/events{/privacy}", + "received_events_url": "https://api.github.com/users/raidenluikang/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-07-06T22:30:05Z", + "updated_at": "2021-10-17T18:57:50Z", + "closed_at": "2021-10-17T18:57:50Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Сейчас лямбду нельзя вызвать сам себя. Для этого иногда придумывает разные хитрости, который не очень то элегантный.\r\nНапример\r\n\r\n```\r\nstd::function< int (int ) > factorial = [&] (int n) -> int\r\n{\r\n if (n < 2) return 1;\r\n else return factorial(n-1) * n;\r\n};\r\n\r\n// usage\r\n factorial(10);\r\n\r\n\r\n```\r\nлибо, такой\r\n```\r\n\r\n auto factorial = [](auto self, int n) -> int\r\n{\r\n if (n < 2) return 1;\r\n else return self( self, n - 1) * n ;\r\n};\r\n\r\n\r\n// usage:\r\n factorial( factorial, 10);\r\n\r\n```\r\n\r\nМожет быть есть ещё другие приёмы, но все они не так элегантно и просто, как вызвать рекурсивной функцией, либо есть накладной расходы как `std::function`.\r\n\r\nДва типа решение могу предлагать:\r\n1. Добавить ключегого слово `self` или `this_ptr` тому подобное внутри лямбда.\r\n2. Захватить название лямбда по умолчание.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/464/reactions", + "total_count": 4, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 1, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/464/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/463", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/463/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/463/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/463/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/463", + "id": 936494419, + "node_id": "MDU6SXNzdWU5MzY0OTQ0MTk=", + "number": 463, + "title": "добавить функцию exception_type(p) для std::exception_ptr", + "user": { + "login": "gleb-kov", + "id": 41119563, + "node_id": "MDQ6VXNlcjQxMTE5NTYz", + "avatar_url": "https://avatars.githubusercontent.com/u/41119563?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gleb-kov", + "html_url": "https://github.com/gleb-kov", + "followers_url": "https://api.github.com/users/gleb-kov/followers", + "following_url": "https://api.github.com/users/gleb-kov/following{/other_user}", + "gists_url": "https://api.github.com/users/gleb-kov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gleb-kov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gleb-kov/subscriptions", + "organizations_url": "https://api.github.com/users/gleb-kov/orgs", + "repos_url": "https://api.github.com/users/gleb-kov/repos", + "events_url": "https://api.github.com/users/gleb-kov/events{/privacy}", + "received_events_url": "https://api.github.com/users/gleb-kov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-07-04T16:31:57Z", + "updated_at": "2021-08-08T12:36:23Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "_<Описание вашей идеи>_\r\nХочется знать информацию о типе исключения из std::exception_ptr. \r\n\r\nНапример, с помощью функции с сигнатурой:\r\n`std::type_info* exception_type(std::exception_ptr)`\r\n\r\nСмотрелось бы лучше как метод у std::exception_ptr, возвращающий const std::type_info&, но тип std::exception_ptr не специфирован.\r\n\r\nНечто похожее: __cxa_current_exception_type\r\n\r\n_<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>_\r\nЛоггирование и дебаг\r\n```\r\ntry {\r\n ...\r\n} catch(...) {\r\n std::cerr << \"Caught exception \" << std::exception_type(std::current_exception())->name() << \", exit.\";\r\n // или std::current_exception()->type().name()\r\n ...\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/463/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/463/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/462", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/462/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/462/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/462/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/462", + "id": 926482934, + "node_id": "MDU6SXNzdWU5MjY0ODI5MzQ=", + "number": 462, + "title": "добавить логический оператор XOR (исключающее ИЛИ)", + "user": { + "login": "toughengineer", + "id": 20643126, + "node_id": "MDQ6VXNlcjIwNjQzMTI2", + "avatar_url": "https://avatars.githubusercontent.com/u/20643126?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/toughengineer", + "html_url": "https://github.com/toughengineer", + "followers_url": "https://api.github.com/users/toughengineer/followers", + "following_url": "https://api.github.com/users/toughengineer/following{/other_user}", + "gists_url": "https://api.github.com/users/toughengineer/gists{/gist_id}", + "starred_url": "https://api.github.com/users/toughengineer/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/toughengineer/subscriptions", + "organizations_url": "https://api.github.com/users/toughengineer/orgs", + "repos_url": "https://api.github.com/users/toughengineer/repos", + "events_url": "https://api.github.com/users/toughengineer/events{/privacy}", + "received_events_url": "https://api.github.com/users/toughengineer/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 4, + "created_at": "2021-06-21T18:27:29Z", + "updated_at": "2022-01-19T19:51:14Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Сабж. \r\nПредлагаю символ `^^` по модели остальных оперторов: `&` и `&&`, `|` и `||`.\r\n\r\nДля булевых аргументов в качестве исключающего ИЛИ работает `!=`, например:\r\n```c++\r\nconst bool smart = isSmart();\r\nconst bool handsome = isHandsome();\r\nconst bool isPossible = smart != handsom;\r\n```\r\n\r\nНо всё равно в этом случае читаемость ниже плинтуса и парсинг физического смысла такого выражения будет не мгновенным.\r\n\r\nДля типов кроме булева всё ещё грустнее, потому что `!=` в отличие от логических операторов не делает контекстного преобразования в булев тип. Например, такое:\r\n```c++\r\nint i = 42;\r\nvoid *ptr = nullptr;\r\nconst auto sadsob = i != ptr; // не работает\r\nconst auto visibledisgust = !!i != !!ptr; // *sigh*\r\n```\r\n\r\nС логическим исключающим ИЛИ имхо выглядит намного лучше:\r\n```c++\r\nint i = 42;\r\nvoid *ptr = nullptr;\r\nconst auto uwu = i ^^ ptr;\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/462/reactions", + "total_count": 8, + "+1": 6, + "-1": 1, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 1, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/462/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/461", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/461/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/461/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/461/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/461", + "id": 923764952, + "node_id": "MDU6SXNzdWU5MjM3NjQ5NTI=", + "number": 461, + "title": "std::format - позволить указывать переменные для подстановки прямо внутри строки", + "user": { + "login": "Aegel5", + "id": 10333681, + "node_id": "MDQ6VXNlcjEwMzMzNjgx", + "avatar_url": "https://avatars.githubusercontent.com/u/10333681?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Aegel5", + "html_url": "https://github.com/Aegel5", + "followers_url": "https://api.github.com/users/Aegel5/followers", + "following_url": "https://api.github.com/users/Aegel5/following{/other_user}", + "gists_url": "https://api.github.com/users/Aegel5/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Aegel5/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Aegel5/subscriptions", + "organizations_url": "https://api.github.com/users/Aegel5/orgs", + "repos_url": "https://api.github.com/users/Aegel5/repos", + "events_url": "https://api.github.com/users/Aegel5/events{/privacy}", + "received_events_url": "https://api.github.com/users/Aegel5/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 7, + "created_at": "2021-06-17T10:34:20Z", + "updated_at": "2021-07-30T22:12:53Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Такой формат уже реализован в С#, пример:\r\n```\r\nint a = 10;\r\nint b = 20;\r\nvar res = $\"Vars: a={a}, b={b}!\";\r\n```\r\nИ это невероятно удобный инструмент. Я не понимаю, почему другие языки не реализовывают подобный функционал.\r\n\r\nКак конкретно реализовать это в С++ я не знаю, возможно тоже добавить `$` перед строкой:\r\n```\r\nint a = 10;\r\nint b = 20;\r\nauto res = $\"Vars: a={a}, b={b}!\";\r\n```\r\n\r\n\r\n\r\n\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/461/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/461/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/460", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/460/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/460/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/460/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/460", + "id": 907340951, + "node_id": "MDU6SXNzdWU5MDczNDA5NTE=", + "number": 460, + "title": "basic_string_view noexcept", + "user": { + "login": "NN---", + "id": 580536, + "node_id": "MDQ6VXNlcjU4MDUzNg==", + "avatar_url": "https://avatars.githubusercontent.com/u/580536?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/NN---", + "html_url": "https://github.com/NN---", + "followers_url": "https://api.github.com/users/NN---/followers", + "following_url": "https://api.github.com/users/NN---/following{/other_user}", + "gists_url": "https://api.github.com/users/NN---/gists{/gist_id}", + "starred_url": "https://api.github.com/users/NN---/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/NN---/subscriptions", + "organizations_url": "https://api.github.com/users/NN---/orgs", + "repos_url": "https://api.github.com/users/NN---/repos", + "events_url": "https://api.github.com/users/NN---/events{/privacy}", + "received_events_url": "https://api.github.com/users/NN---/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-05-31T10:29:49Z", + "updated_at": "2021-06-07T07:53:45Z", + "closed_at": "2021-06-07T07:53:44Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "_<Описание вашей идеи>_\r\nКак известно конструктор basic_string_view , а также remove_prefix не являются noexcept.\r\nНет никаких причин, кроме исторических, не объявить их как noexcept.\r\nВ принципе весь класс мог бы быть noexcept.\r\n\r\n_<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>_\r\nПолезность noexcept в местах без исключений вполне очевидна.\r\nПолучаем больше оптимизаций от компилятора.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/460/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/460/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/459", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/459/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/459/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/459/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/459", + "id": 904998751, + "node_id": "MDU6SXNzdWU5MDQ5OTg3NTE=", + "number": 459, + "title": "for для нескольких контейнеров", + "user": { + "login": "XRay3D", + "id": 10693876, + "node_id": "MDQ6VXNlcjEwNjkzODc2", + "avatar_url": "https://avatars.githubusercontent.com/u/10693876?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/XRay3D", + "html_url": "https://github.com/XRay3D", + "followers_url": "https://api.github.com/users/XRay3D/followers", + "following_url": "https://api.github.com/users/XRay3D/following{/other_user}", + "gists_url": "https://api.github.com/users/XRay3D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/XRay3D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/XRay3D/subscriptions", + "organizations_url": "https://api.github.com/users/XRay3D/orgs", + "repos_url": "https://api.github.com/users/XRay3D/repos", + "events_url": "https://api.github.com/users/XRay3D/events{/privacy}", + "received_events_url": "https://api.github.com/users/XRay3D/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 6, + "created_at": "2021-05-28T09:04:02Z", + "updated_at": "2021-10-17T19:01:56Z", + "closed_at": "2021-10-17T19:01:45Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Вместо классического цикла с переменной ++i доработать range based for для нескольких контейнеров и соответственно итерироваться до границ наименьшего из них.\r\n\r\nEсли переданы std::array или обычные массивы фиксированной длины размеры которых не равны выдавать варнинг времени компиляции.\r\n\r\nБыло:\r\n``` c++\r\nvoid MeasureModel::setRowsEnabled(const std::vector& checkStates) {\r\n for (int i = 0; i < RowCount; ++i) {\r\n if(m_rowEnabled[i] != checkStates[i]) {\r\n m_rowEnabled[i] = checkStates[i];\r\n emit dataChanged();\r\n }\r\n }\r\n}\r\n``` \r\nстало\r\n``` c++\r\nvoid MeasureModel::setRowsEnabled(const std::vector& checkStates)\r\n{\r\n for (auto& checkStateDst, auto checkStateSrc : m_rowEnabled, checkStates) {\r\n if (checkStateDst != checkStateSrc) {\r\n checkStateDst = checkStateSrc;\r\n emit dataChanged();\r\n }\r\n }\r\n}\r\n``` \r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/459/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/459/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/458", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/458/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/458/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/458/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/458", + "id": 894718427, + "node_id": "MDU6SXNzdWU4OTQ3MTg0Mjc=", + "number": 458, + "title": "Конструктор стандартных контейнеров от итераторов разного типа и Ranges", + "user": { + "login": "kirillgrachoff", + "id": 35011824, + "node_id": "MDQ6VXNlcjM1MDExODI0", + "avatar_url": "https://avatars.githubusercontent.com/u/35011824?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kirillgrachoff", + "html_url": "https://github.com/kirillgrachoff", + "followers_url": "https://api.github.com/users/kirillgrachoff/followers", + "following_url": "https://api.github.com/users/kirillgrachoff/following{/other_user}", + "gists_url": "https://api.github.com/users/kirillgrachoff/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kirillgrachoff/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kirillgrachoff/subscriptions", + "organizations_url": "https://api.github.com/users/kirillgrachoff/orgs", + "repos_url": "https://api.github.com/users/kirillgrachoff/repos", + "events_url": "https://api.github.com/users/kirillgrachoff/events{/privacy}", + "received_events_url": "https://api.github.com/users/kirillgrachoff/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 6, + "created_at": "2021-05-18T19:44:02Z", + "updated_at": "2022-02-19T10:44:55Z", + "closed_at": "2022-02-19T10:44:55Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "# Почему больно без этого\r\nВозьмём код на С++. Вполне обычный код.\r\n```cpp\r\nstd::vector v;\r\n// something useful\r\nstd::string s(v.begin(), v.end());\r\n```\r\nРаботает.\r\n\r\nТеперь вспомним про замечательные ***Ranges***.\\\r\nЧто теперь хочется?\\\r\nА хочется вот так:\r\n```cpp\r\nstd::string text = \"this is simple text\";\r\nfor (auto subs : std::ranges::split_view(text, ' ')) {\r\n // либо так:\r\n std::string word(std::ranges::begin(subs), std::ranges::end(subs));\r\n // либо так:\r\n std::string word(subs);\r\n}\r\n```\r\n\r\nНо ни то, ни другое не компилируется т.к. у std::string (и у других контейнеров) нет таких штук.\r\n\r\n# Предложение\r\nДобавить к каждому std контейнеру **хотя бы** конструктор от двух итераторов разного типа (это несложно).\r\nВсего лишь добавить\r\n```cpp\r\ntemplate \r\nrequires Comparable\r\nstd::string(InputIterFirst first, InputIterLast last) {}\r\n```\r\nГде `Comparable` - это `concept`, отвечающий за то, чтобы их можно было сравнивать друг с другом.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/458/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/458/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/457", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/457", + "id": 886386988, + "node_id": "MDU6SXNzdWU4ODYzODY5ODg=", + "number": 457, + "title": "Установка приоритетов потокам", + "user": { + "login": "maksimus1210", + "id": 15178782, + "node_id": "MDQ6VXNlcjE1MTc4Nzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/15178782?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/maksimus1210", + "html_url": "https://github.com/maksimus1210", + "followers_url": "https://api.github.com/users/maksimus1210/followers", + "following_url": "https://api.github.com/users/maksimus1210/following{/other_user}", + "gists_url": "https://api.github.com/users/maksimus1210/gists{/gist_id}", + "starred_url": "https://api.github.com/users/maksimus1210/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/maksimus1210/subscriptions", + "organizations_url": "https://api.github.com/users/maksimus1210/orgs", + "repos_url": "https://api.github.com/users/maksimus1210/repos", + "events_url": "https://api.github.com/users/maksimus1210/events{/privacy}", + "received_events_url": "https://api.github.com/users/maksimus1210/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035680, + "node_id": "MDU6TGFiZWwyODE1MDM1Njgw", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/good%20first%20issue", + "name": "good first issue", + "color": "7057ff", + "default": true, + "description": "Несложная на вид идея. Самое то, чтобы попробовать написать на её proposal и помочь РГ21" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 9, + "created_at": "2021-05-11T07:51:30Z", + "updated_at": "2021-08-02T09:31:14Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "_В STL и Boost есть классы для работы с потоками, но устанавливать приоритеты потокам приходится через сторонние библиотеки как pthread. \r\n Для каждой ОС этот код разный, хотелось бы иметь стандартные средства для управления приоритетом потока._\r\n\r\n`std::thread thread([](){ std::cout << \"Hello world!\" }, std::thread::priority::high_priority);`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/457/reactions", + "total_count": 5, + "+1": 5, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/457/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/456", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/456/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/456/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/456/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/456", + "id": 884771779, + "node_id": "MDU6SXNzdWU4ODQ3NzE3Nzk=", + "number": 456, + "title": "Убрать зависимость core language features от заголовков и ", + "user": { + "login": "oficsu", + "id": 35731382, + "node_id": "MDQ6VXNlcjM1NzMxMzgy", + "avatar_url": "https://avatars.githubusercontent.com/u/35731382?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/oficsu", + "html_url": "https://github.com/oficsu", + "followers_url": "https://api.github.com/users/oficsu/followers", + "following_url": "https://api.github.com/users/oficsu/following{/other_user}", + "gists_url": "https://api.github.com/users/oficsu/gists{/gist_id}", + "starred_url": "https://api.github.com/users/oficsu/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/oficsu/subscriptions", + "organizations_url": "https://api.github.com/users/oficsu/orgs", + "repos_url": "https://api.github.com/users/oficsu/repos", + "events_url": "https://api.github.com/users/oficsu/events{/privacy}", + "received_events_url": "https://api.github.com/users/oficsu/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-05-10T18:05:26Z", + "updated_at": "2021-05-10T20:05:10Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "На текущий момент есть места, где чисто-языковые возможности зависят от типов, объявленных в заголовках стандартной библиотеки. Следующие примеры являются невалидным C++:\r\n```cpp\r\nauto x = {0, 42};\r\nusing initializer_list = decltype(x);\r\n\r\nusing strong_ordering = decltype(0 <=> 42);\r\n```\r\nНа практике, не включив заголовки `` и `` мы не имеем права сделать такие базовые вещи, как:\r\na) инициализировать переменную;\r\nb) сравнить два числа\r\n\r\n\r\n\r\n**Вывод типов через выражение**\r\n\r\nОднако, на деле, у нас допустим похожий механизм — мы имеем право вывести `size_t` через языковые конструкции, [чем, например, пользуется компилятор](https://github.com/gcc-mirror/gcc/commit/6fb7e3c29188ab7cde0b963957caf6182536c77d#diff-8983eec8ace181a18d4daf8759a9a9e5481fac638e1d6f89688ff7433cb388d0R4):\r\n```cpp\r\nusing size_t = decltype(sizeof 0);\r\n```\r\nАналогичным образом мы могли бы определить `std::initializer_list` и `std::strong_ordering`:\r\n```cpp\r\nauto x = {0, 42};\r\nusing initializer_list = decltype(x);\r\nusing strong_ordering = decltype(0 <=> 42);\r\n```\r\nСейчас это ошибка компиляции. Если посмотреть на [вывод трёх компиляторв](https://godbolt.org/z/7EnqYY1cY), каждый из них понимает, где здесь ошибка и прямым текстом требует подключить нужные заголовоки. Но если им достоверно известно, какой заголовок подключать — очень большой вопрос, зачем этот заголовок, собственно, нужен, тем более, почему он нужен для определения типа, использующегося в языковой фиче \r\n\r\nКроме того, если позволить такую реализацию, вопрос `` всё ещё остаётся нерешённым в полной мере, поскольку там определяются также `std::weak_ordering` и `std::partial_ordering`\r\n\r\n\r\n\r\n**Ключевые слова-типы**\r\n\r\nКак более надёжная альтернатива (пусть, и менее эстетичная) — пойти по стопам комитета стандартизации C и добавить встроенные языковые типы, например `_Initializer_list`, `_Strong_ordering`, `_Weak_ordering`, `_Partial_ordering`, а в `std::` сделать на них лишь алиасы\r\n\r\n\r\n\r\nПочему это плохо? Во-первых, такая зависимость не вяжется с желанием иметь отчуждаемую стандартную библиотеку. Во-вторых, буду честен, в первую очередь это крайне уродливая зависимость с эстетической точки зрения. Из реальных практических примеров проблемы — встречались случаи обхода другими программистами этой проблемы в случаях, когда имелся компилятор свежей версии, а библиотеки под него нет — в этом случае ничего не остаётся, кроме как написать недостающую типы в пространстве имён `std::`, что формально является неопределённым поведением\r\n\r\nЯ думаю, в C++ есть и другие примеры зависимости языка от собственной стандартной библиотеки, которые также стоит исправить, если будут найдены\r\n\r\nБез заглядывания в стандарт, я склонен считать, что проблема здесь две. Самая незначительная из них — вординг стандарта, но вторая серьёзнее — ABI. Как дальше манглить условный `_Initializer_list`? Всё ещё как `std::initializer_list`? Однако, если кто-то сможет найти другие проблемы — буду рад комментариям\r\n\r\nСсылки на сообщения топика, изначально натолкнувшего на эту идею: [#⁢1](https://t.me/ProCxx/448728), [#⁢2](https://t.me/ProCxx/449094), [#⁢3](https://t.me/ProCxx/449096), [#⁢4](https://t.me/ProCxx/449109), [#⁢5](https://t.me/ProCxx/449126), [#⁢6](https://t.me/ProCxx/449269), [#⁢7](https://t.me/ProCxx/449293)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/456/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/456/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/455", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/455/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/455/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/455/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/455", + "id": 883770181, + "node_id": "MDU6SXNzdWU4ODM3NzAxODE=", + "number": 455, + "title": "`chain`, `zip` для итераторов и диапазонов", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 4, + "created_at": "2021-05-10T08:59:41Z", + "updated_at": "2022-02-19T10:59:32Z", + "closed_at": "2022-02-19T10:59:31Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "### Суть\r\nВ целом сама идея, думаю, и из заголовка ясна. Предлагаю добавить такие функции, как `zip` и `chain`.\r\n\r\nПервая возвращает адаптер, итератор которого содержит кортеж из ссылок/значений (этот момент вообще требуется дополнительно обдумать, как такое лучше реализовать, возможно в комментах напишу продолжение), полученных из соответствующих переданным контейнерам/диапазонам итераторов. При этом если один диапазон короче другого, то следует итерироваться до конца самого короткого. Хотя в целом тут можно добавить вариант с проверкой равенства длин диапазонов.\r\n\r\nВторая же \"ставит\" один диапазон за другим, позволяя по окончании первого перейти к элементам второго. Внутренние типы диапазонов должны совпадать или хотя бы быть приводимыми друг к другу или к общему родителю (если ссылки или указатели).\r\n\r\nСтоит отметить, что ограничиваться двумя аргументами не представляется рациональным - данные концепции нетрудно обобщаются на произвольное количество диапазонов.\r\n\r\n### Примеры\r\nДумаю, примеров можно подобрать много и во многих областях, когда требуется проитерироваться по нескольким последовательностям примерно следующим образом (концепт):\r\n\r\n```cpp\r\nstd::vector SomeValues = ...;\r\nstd::vector SomeStrings = ...;\r\n\r\nfor (const auto& Pair : zip(SomeValues, SomeStrings)) {\r\n // Pair это std::tuple \r\n}\r\n```\r\n\r\n```cpp\r\nstd::vector SomeValues = ...;\r\nstd::list SomeOtherValues = ...;\r\n\r\nfor (int Value : chain(SomeValues, SomeOtherValues)) {\r\n // Сначала идут значения из SomeValues, а потом - из SomeOtherValues\r\n}\r\n```\r\n\r\n### Реализация\r\nРеализацию `zip` можно найти в бусте. `chain` же в целом не представляет большой сложности в реализации.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/455/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/455/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/454", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/454/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/454/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/454/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/454", + "id": 880995471, + "node_id": "MDU6SXNzdWU4ODA5OTU0NzE=", + "number": 454, + "title": "Добавить move-only std::function ", + "user": { + "login": "raidenluikang", + "id": 24319853, + "node_id": "MDQ6VXNlcjI0MzE5ODUz", + "avatar_url": "https://avatars.githubusercontent.com/u/24319853?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/raidenluikang", + "html_url": "https://github.com/raidenluikang", + "followers_url": "https://api.github.com/users/raidenluikang/followers", + "following_url": "https://api.github.com/users/raidenluikang/following{/other_user}", + "gists_url": "https://api.github.com/users/raidenluikang/gists{/gist_id}", + "starred_url": "https://api.github.com/users/raidenluikang/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/raidenluikang/subscriptions", + "organizations_url": "https://api.github.com/users/raidenluikang/orgs", + "repos_url": "https://api.github.com/users/raidenluikang/repos", + "events_url": "https://api.github.com/users/raidenluikang/events{/privacy}", + "received_events_url": "https://api.github.com/users/raidenluikang/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-05-08T16:05:13Z", + "updated_at": "2021-10-17T19:03:30Z", + "closed_at": "2021-10-17T19:03:21Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "_std::function не поддерживает move-only functors_\r\n\r\n_std::function f = [ m = std::make_unique() ] (){ return *m; }; не компилируется_\r\n\r\n_https://godbolt.org/z/hKhneEWz3_\r\n\r\n```\r\ntemplate \r\nclass function < R(Args ... ) >\r\n{\r\n // ....\r\n template \r\n function ( F && f) ; // -->почему f требуется чтобы она было копируемый? \r\n};\r\n```\r\n\r\n\r\nПолезные ссылки:\r\n* https://godbolt.org/z/hKhneEWz3 - онлайн дизассемблер\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/454/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/454/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/453", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/453/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/453/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/453/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/453", + "id": 876560224, + "node_id": "MDU6SXNzdWU4NzY1NjAyMjQ=", + "number": 453, + "title": "constexpr `to_chars`/`from_chars`", + "user": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + }, + { + "id": 2815260277, + "node_id": "MDU6TGFiZWwyODE1MjYwMjc3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%A1%D0%B4%D0%B5%D0%BB%D0%B0%D0%BD%D0%BE%20%D0%B2%20%D0%A0%D0%9321", + "name": "Сделано в РГ21", + "color": "0E8A16", + "default": false, + "description": "Идея реализована с участием РГ21" + } + ], + "state": "closed", + "locked": false, + "assignee": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "assignees": [ + { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": null, + "comments": 1, + "created_at": "2021-05-05T15:15:13Z", + "updated_at": "2022-08-11T11:35:48Z", + "closed_at": "2022-08-11T11:35:48Z", + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "Хотелось бы иметь стандартный способ перевести строку в число и обратно на этапе компиляции. Сейчас для этого приходится либо писать свои реализации, либо брать что-то из boost/etc.\r\n\r\n```cpp\r\nconstexpr std::optional to_int(std::string_view s) {\r\n int value;\r\n\r\n if (auto [p, err] = std::from_chars(s.begin(), s.end(), value); err == std::errc{}) {\r\n return value;\r\n } else {\r\n return std::nullopt;\r\n }\r\n}\r\n\r\nstatic_assert(to_int(\"42\") == 42);\r\nstatic_assert(to_int(\"foo\") == std::nullopt);\r\n```\r\n\r\n\r\nПропозл для целочисленных числес сейчас находится в работе:\r\nhttps://github.com/cplusplus/papers/issues/984\r\nhttps://wg21.link/p2291\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/453/reactions", + "total_count": 10, + "+1": 10, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/453/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/452", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/452/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/452/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/452/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/452", + "id": 870202497, + "node_id": "MDU6SXNzdWU4NzAyMDI0OTc=", + "number": 452, + "title": "std::basic_string::trim", + "user": { + "login": "GeorgyFirsov", + "id": 11062067, + "node_id": "MDQ6VXNlcjExMDYyMDY3", + "avatar_url": "https://avatars.githubusercontent.com/u/11062067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GeorgyFirsov", + "html_url": "https://github.com/GeorgyFirsov", + "followers_url": "https://api.github.com/users/GeorgyFirsov/followers", + "following_url": "https://api.github.com/users/GeorgyFirsov/following{/other_user}", + "gists_url": "https://api.github.com/users/GeorgyFirsov/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GeorgyFirsov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GeorgyFirsov/subscriptions", + "organizations_url": "https://api.github.com/users/GeorgyFirsov/orgs", + "repos_url": "https://api.github.com/users/GeorgyFirsov/repos", + "events_url": "https://api.github.com/users/GeorgyFirsov/events{/privacy}", + "received_events_url": "https://api.github.com/users/GeorgyFirsov/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035680, + "node_id": "MDU6TGFiZWwyODE1MDM1Njgw", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/good%20first%20issue", + "name": "good first issue", + "color": "7057ff", + "default": true, + "description": "Несложная на вид идея. Самое то, чтобы попробовать написать на её proposal и помочь РГ21" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 4, + "created_at": "2021-04-28T17:52:14Z", + "updated_at": "2021-08-17T17:13:47Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "### Суть\r\nДобавить в шаблон класса строки методы `trim_left`, `trim_right` и `trim`, которые обрезают пробельные символы слева, справа или по обеим сторонам строчки.\r\n\r\n### Применение\r\nПолезно, к примеру, при построчном чтении файлов, при обработке ввода от пользователя и тому подобных случаях. Часто на моей практике встречаются ситуации, когда пробельные символы по сторонам строчки необходимо убрать.\r\n\r\n### Пример реализации\r\n#### Возможная реализация\r\n```cpp\r\nconstexpr basic_string& trim_left()\r\n{\r\n const auto is_not_space = std::not_fn(static_cast(std::isspace));\r\n this->erase(cbegin(), std::find_if(cbegin(), cend(), is_not_space));\r\n return *this;\r\n}\r\n\r\nconstexpr basic_string& trim_right()\r\n{\r\n const auto is_not_space = std::not_fn(static_cast(std::isspace));\r\n this->erase(std::find_if(crbegin(), crend(), is_not_space).base(), cend());\r\n return *this;\r\n}\r\n\r\nconstexpr basic_string& trim()\r\n{\r\n return trim_left().trim_right();\r\n}\r\n```\r\n\r\n#### Как можно сейчас\r\n```cpp\r\n// C++17 и новее\r\n\r\ntemplate\r\nconstexpr basic_string& trim_left(basic_string& s)\r\n{\r\n const auto is_not_space = std::not_fn(static_cast(std::isspace));\r\n s.erase(s.cbegin(), std::find_if(s.cbegin(), s.cend(), is_not_space));\r\n return s;\r\n}\r\n\r\ntemplate\r\nconstexpr basic_string& trim_right(basic_string& s)\r\n{\r\n const auto is_not_space = std::not_fn(static_cast(std::isspace));\r\n s.erase(std::find_if(s.crbegin(), s.crend(), is_not_space).base(), s.cend());\r\n return s;\r\n}\r\n\r\ntemplate\r\nconstexpr basic_string& trim(basic_string& s)\r\n{\r\n return trim_left(trim_right(s));\r\n}\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/452/reactions", + "total_count": 6, + "+1": 6, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/452/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/451", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/451/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/451/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/451/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/451", + "id": 868809758, + "node_id": "MDU6SXNzdWU4Njg4MDk3NTg=", + "number": 451, + "title": "Определение `noexcept`-спецификации самим компилятором", + "user": { + "login": "deiuch", + "id": 26200443, + "node_id": "MDQ6VXNlcjI2MjAwNDQz", + "avatar_url": "https://avatars.githubusercontent.com/u/26200443?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/deiuch", + "html_url": "https://github.com/deiuch", + "followers_url": "https://api.github.com/users/deiuch/followers", + "following_url": "https://api.github.com/users/deiuch/following{/other_user}", + "gists_url": "https://api.github.com/users/deiuch/gists{/gist_id}", + "starred_url": "https://api.github.com/users/deiuch/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/deiuch/subscriptions", + "organizations_url": "https://api.github.com/users/deiuch/orgs", + "repos_url": "https://api.github.com/users/deiuch/repos", + "events_url": "https://api.github.com/users/deiuch/events{/privacy}", + "received_events_url": "https://api.github.com/users/deiuch/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2021-04-27T12:43:41Z", + "updated_at": "2021-05-18T22:34:50Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В некоторых шаблонных функциях мы для полноты картины можем написать в `noexcept(...)` содержимое самой функции по сути. Это вызывает бессмысленное дублирование кода. При этом компилятор, по спецификациям `noexcept` вызываемых из этой функций вполне может сам вычислить, точно ли функция не будет выбрасывать исключений, или это потенциально возможно. Хочется научиться перекладывать эту ответственность на компилятор путём внедрения какого-то дополнения к `noexcept`-спецификации.\r\n\r\nПример предлагаемого синтаксиса (предмет для дискуссии): `void foo() noexcept(auto) {}`\r\n\r\nДанная возможность позволит в простых случаях не дублировать код функции внутри `noexcept`, и при этом активнее пропагировать эту информацию без дополнительных усилий по проверке сигнатур вызываемых функций. Плюс это упростит использование `noexcept` в шаблонах функций, где многие типы или сигнатуры не будут известны до момента инстанцирования.\r\n\r\nТакже можно будет по этой причине всё же ввести `noexcept` для стандартных контейнеров, но который будет определяться деталями имплементации метода стандартного контейнера (к примеру, который может начать бросать исключения в дебажной сборке), и о таком `noexcept` нужно будет меньше беспокоиться далее в использующем его коде.\r\n\r\nОбратной стороной медали будет замедление времени компиляции. Поэтому можно ограничивать использование этого спецификатора в code style на каких-то базовых случаях (для уменьшения дублирования кода, к примеру).\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/451/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/451/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/450", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/450/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/450/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/450/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/450", + "id": 868057406, + "node_id": "MDU6SXNzdWU4NjgwNTc0MDY=", + "number": 450, + "title": "расширить возможности синтаксических анализаторов при помощи Nullable и NotNull", + "user": { + "login": "neshkeev", + "id": 4223091, + "node_id": "MDQ6VXNlcjQyMjMwOTE=", + "avatar_url": "https://avatars.githubusercontent.com/u/4223091?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/neshkeev", + "html_url": "https://github.com/neshkeev", + "followers_url": "https://api.github.com/users/neshkeev/followers", + "following_url": "https://api.github.com/users/neshkeev/following{/other_user}", + "gists_url": "https://api.github.com/users/neshkeev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/neshkeev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/neshkeev/subscriptions", + "organizations_url": "https://api.github.com/users/neshkeev/orgs", + "repos_url": "https://api.github.com/users/neshkeev/repos", + "events_url": "https://api.github.com/users/neshkeev/events{/privacy}", + "received_events_url": "https://api.github.com/users/neshkeev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-26T19:21:57Z", + "updated_at": "2021-04-26T20:56:31Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "# Описание\r\n\r\nВ Java существуют [jsr 305](https://jcp.org/en/jsr/detail?id=305) и [jsr 308](https://jcp.org/en/jsr/detail?id=308), которые стандартизировали поддержку указания программистом в каких местах возможно, а в каких невозможны `null` значения. Компания JetBrains пошла немного дальше и добавила ещё [Contract](https://www.jetbrains.com/help/idea/contract-annotations.html) аннотацию, которая позволяет указывать взаимосвязи между входными и выходными параметрами функции. Intellij IDEA имеет очень эффективный статический анализатор, который позволяет на этапе разработки отлавливать большое количество проблем, связанных с разыменовыванием `null` указателя.\r\n\r\nРеализовать эту идею можно при помощи пустых `#define` макросов:\r\n```c\r\n#define __Nullable\r\n#define __NotNull\r\n#define __Contract(...)\r\n```\r\n\r\n# Примеры\r\n\r\n1. Возврат `null` значения из функции, которая должна вернуть `__NotNull`:\r\n\r\n```c\r\n__NotNull int* getId() {\r\n return null; // нарушение контракта\r\n}\r\n````\r\n2. Функция может возвратить `null`, но клиентский код не проверяет возвращаемое значение:\r\n\r\n```c\r\n__Nullable int* getId();\r\n\r\nint* idPointer = getId();\r\nstd::cout << *idPointer; // segfault\r\n```\r\n3. Если аргумент функции `null` то функция должна вернуть новый объект:\r\n```c\r\n__Contract(\"null -> new\") int* ensureNotNull(int* v) {\r\n return v; // забыли соблюсти контракт\r\n} \r\n```\r\n# Имеющиеся решения\r\n\r\n`clang` [предлагает](https://clang.llvm.org/docs/analyzer/developer-docs/nullability.html) свои `__nullable` и `__nonnull` аннотации", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/450/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/450/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/449", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/449/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/449/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/449/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/449", + "id": 867086812, + "node_id": "MDU6SXNzdWU4NjcwODY4MTI=", + "number": 449, + "title": "Специализация clock_time_conversion для system и steady", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-25T18:58:38Z", + "updated_at": "2021-06-11T12:25:17Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В С++20 наконец-то стало возможным конвертировать время между часами, но не появилось специализации для конвентирования системных часов в монотонные и обратно. На сколько я помню, для них гарантируется что они тикают с одинаковой скоростью и перевод одних в другие тривиален если знать разницу. Разница вычисляется просто (и её можно кешировать). Отдельно надо обратить внимание на то, что системные часы переключаемые и это надо отслеживать для перевычисления разницы. Например localtime на linux делает это вызовом fstat для файла со временем и проверяет что он не изменился. (Неприятно конечно делать системный вызов на каждую конвертацию, но все-же возможно. Может быть это можно сделать оптимальней, например два vdso вызова могут быть быстрее fstat)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/449/reactions", + "total_count": 1, + "+1": 0, + "-1": 1, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/449/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/448", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/448/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/448/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/448/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/448", + "id": 867080284, + "node_id": "MDU6SXNzdWU4NjcwODAyODQ=", + "number": 448, + "title": "Structure bindings и structure matching в аргументах функции", + "user": { + "login": "kirillgrachoff", + "id": 35011824, + "node_id": "MDQ6VXNlcjM1MDExODI0", + "avatar_url": "https://avatars.githubusercontent.com/u/35011824?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kirillgrachoff", + "html_url": "https://github.com/kirillgrachoff", + "followers_url": "https://api.github.com/users/kirillgrachoff/followers", + "following_url": "https://api.github.com/users/kirillgrachoff/following{/other_user}", + "gists_url": "https://api.github.com/users/kirillgrachoff/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kirillgrachoff/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kirillgrachoff/subscriptions", + "organizations_url": "https://api.github.com/users/kirillgrachoff/orgs", + "repos_url": "https://api.github.com/users/kirillgrachoff/repos", + "events_url": "https://api.github.com/users/kirillgrachoff/events{/privacy}", + "received_events_url": "https://api.github.com/users/kirillgrachoff/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-25T18:29:31Z", + "updated_at": "2021-05-03T00:22:48Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "# Распаковка структур данных прямо в аргументах функции\r\nИногда очень хочется делать structure matching в аргументах функции.\r\n\r\nВ C++ есть передача аргументов по значению. Т.е. конструктор копирования выполняется до кода функции.\r\n\r\nХотелось бы делать что-то похожее на structure binding.\r\n```cpp\r\nusing Type = std::tuple;\r\n```\r\n```cpp\r\nvoid foo(Type& [a, b, c]) {\r\n std::cout << a << ' ' << b << ' ' << c << '\\n';\r\n}\r\n```\r\nЗдесь `type(a) == int&; type(b) == char&; type(c) = std::string&`.\r\n\r\n```cpp\r\nvoid foo(Type [a, b, c]) {\r\n std::cout << a << ' ' << b << ' ' << c << '\\n';\r\n}\r\n```\r\nЗдесь `type(a) == int; type(b) == char; type(c) == std::string`\r\n\r\n```cpp\r\nvoid foo(Type&& [a, b, c]) {\r\n std::cout << a << ' ' << b << ' ' << c << '\\n';\r\n}\r\n```\r\nЗдесь `type(a) == int&&; type(b) == char&&; type(c) == std::string&&`\r\n\r\n### Предложение\r\nВвести такой синтаксис.\r\n### Почему это удобно\r\nВы не заводите новых имён в функции.\r\nБез этого нужно было бы писать так:\r\n```cpp\r\nvoid foo(Type type) {\r\n auto& [a, b, c] = type;\r\n // ...\r\n}\r\n````\r\n```cpp\r\nvoid foo(Type& type) {\r\n auto& [a, b, c] = type;\r\n // ...\r\n}\r\n```\r\nПроблема налицо: появляется новое имя `type` и можно забыть написать `auto&`, чтобы не вызвать лишний конструктор копирования.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/448/reactions", + "total_count": 5, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 1, + "rocket": 1, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/448/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/447", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/447/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/447/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/447/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/447", + "id": 867075955, + "node_id": "MDU6SXNzdWU4NjcwNzU5NTU=", + "number": 447, + "title": "Structured bindings syntax extensions", + "user": { + "login": "kirillgrachoff", + "id": 35011824, + "node_id": "MDQ6VXNlcjM1MDExODI0", + "avatar_url": "https://avatars.githubusercontent.com/u/35011824?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kirillgrachoff", + "html_url": "https://github.com/kirillgrachoff", + "followers_url": "https://api.github.com/users/kirillgrachoff/followers", + "following_url": "https://api.github.com/users/kirillgrachoff/following{/other_user}", + "gists_url": "https://api.github.com/users/kirillgrachoff/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kirillgrachoff/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kirillgrachoff/subscriptions", + "organizations_url": "https://api.github.com/users/kirillgrachoff/orgs", + "repos_url": "https://api.github.com/users/kirillgrachoff/repos", + "events_url": "https://api.github.com/users/kirillgrachoff/events{/privacy}", + "received_events_url": "https://api.github.com/users/kirillgrachoff/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2021-04-25T18:10:35Z", + "updated_at": "2021-04-25T18:10:35Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "# Что это такое сейчас\r\nПусть есть код:\r\n```\r\nauto value = make_tuple(10, 'a', std::string(\"YourName\"));\r\nВ стандарте C++17 стало возможным писать такой код:\r\n```cpp\r\nauto [a, b, c] = value\r\nauto& [x, y, z] = value;\r\n```\r\n## Идея No 1\r\nНо (да, такое бывает) может быть такое, что хочется сделать что-то такое, но не заводить новые переменные.\r\nТ.е. что-то такое:\r\n```cpp\r\nauto [a, b, c] = value;\r\nif (conditional_function(a)) {\r\n [a, b, c] = value2;\r\n}\r\n```\r\nНо такое невозможно сделать сейчас.\r\n### Предложение\r\nВвести дополнительный синтаксис\r\n```cpp\r\ntypeA a;\r\ntypeB b;\r\ntypeC c;\r\n// some code...\r\n[a, b, c] = value;\r\n```\r\nТ.е. хотелось бы сделать возможным structured bindings в присваивании.\r\n\r\n## Идея No 2\r\nВот есть то, что есть выше и в стандарте 17 года.\r\nХотелось бы иметь возможность и заводить переменные этой инструкцией, и инициализировать уже существующие.\r\n\r\n### Предложение\r\nМожно писать типы в инструкции из идеи 1.\r\n\r\nХотелось бы сделать валидным такую вещь:\r\n```cpp\r\n[a, b, std::string& name] = value;\r\n[int x, b, c] = value;\r\n```\r\nТ.е. появилось 2 новых переменных: int x и std::string& name.\r\n```cpp\r\n[int& x, char y, const std::string& z] = value;\r\n```\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/447/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/447/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/446", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/446/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/446/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/446/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/446", + "id": 866993658, + "node_id": "MDU6SXNzdWU4NjY5OTM2NTg=", + "number": 446, + "title": "Отказ от с++", + "user": { + "login": "Vitalii-Shmidt", + "id": 52749170, + "node_id": "MDQ6VXNlcjUyNzQ5MTcw", + "avatar_url": "https://avatars.githubusercontent.com/u/52749170?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Vitalii-Shmidt", + "html_url": "https://github.com/Vitalii-Shmidt", + "followers_url": "https://api.github.com/users/Vitalii-Shmidt/followers", + "following_url": "https://api.github.com/users/Vitalii-Shmidt/following{/other_user}", + "gists_url": "https://api.github.com/users/Vitalii-Shmidt/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Vitalii-Shmidt/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Vitalii-Shmidt/subscriptions", + "organizations_url": "https://api.github.com/users/Vitalii-Shmidt/orgs", + "repos_url": "https://api.github.com/users/Vitalii-Shmidt/repos", + "events_url": "https://api.github.com/users/Vitalii-Shmidt/events{/privacy}", + "received_events_url": "https://api.github.com/users/Vitalii-Shmidt/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-25T12:01:36Z", + "updated_at": "2021-04-25T14:25:10Z", + "closed_at": "2021-04-25T14:25:10Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "предлагаю отказаться от с++ и запретить на нем писать, как-либо его пропагандировать. Удалить с++ из сети.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/446/reactions", + "total_count": 6, + "+1": 2, + "-1": 4, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/446/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/445", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/445/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/445/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/445/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/445", + "id": 864593583, + "node_id": "MDU6SXNzdWU4NjQ1OTM1ODM=", + "number": 445, + "title": "Добавление spinlock", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 5, + "created_at": "2021-04-22T06:34:34Z", + "updated_at": "2021-04-25T14:36:59Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В С++20 добавили барьеры и семафоры. Почему спинлок опять обошли? Непонятно...\r\n\r\nДумаю каждый велосипедил свой спинлок (через pthread_spin или std::atomic_flag. А теперь вообще можно через std::atomic::wait)\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/445/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/445/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/444", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/444/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/444/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/444/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/444", + "id": 862654856, + "node_id": "MDU6SXNzdWU4NjI2NTQ4NTY=", + "number": 444, + "title": "Добавить бинарный поиск возвращающий итератор", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 5, + "created_at": "2021-04-20T10:11:36Z", + "updated_at": "2021-04-25T17:41:04Z", + "closed_at": "2021-04-25T14:30:40Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Думаю этот велосипед писал каждый.\r\n\r\nРеализация:\r\n```\r\ntemplate\r\nForwardIt binary_search(ForwardIt first, ForwardIt last, const T& value, Compare comp)\r\n{\r\n auto it = std::lower_bound(first, last, value, comp);\r\n if (it != last && comp(value, *it))\r\n return last;\r\n return it;\r\n}\r\n```\r\n\r\nИмя нового алгоритма остается открытым\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/444/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/444/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/443", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/443/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/443/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/443/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/443", + "id": 860622564, + "node_id": "MDU6SXNzdWU4NjA2MjI1NjQ=", + "number": 443, + "title": "Доработка find у *_set контейнеров", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-18T09:57:44Z", + "updated_at": "2021-04-24T17:45:26Z", + "closed_at": "2021-04-22T14:28:34Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Очень часто в кодовых базах я встречал что-то вроде\r\n```\r\nstruct SName {\r\n// ...\r\n std::string str;\r\n// ...\r\n};\r\n\r\nstd::map map;\r\nSName sname;\r\nmap.insert(sname.str.c_str(), sname);\r\nstd::string find_str;\r\nauto it = map.find(find_str.c_str());\r\n```\r\n\r\n\r\nЭтот код ужасен, и не только с виду, но и неся кучу скрытых и очень опасных моментов (в которых легко отстрелить себе ногу).\r\n\r\nЯ вижу несколько возможных решений. Либо find будет принимать компаратор умеющий сравнивать элемент из set с переданным в find значением, либо map придется параметризовывать не только компаратором но и \"отображением\" (по-моему что-то такое появилось в ranges). Проблематично тк четвертым параметром шаблона у set идет Allocator который если сделать пятым то поломается совместимость, а если добавить после него то станет некрасиво и поломается то что аллокатор всегда последний \r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/443/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/443/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/442", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/442/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/442/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/442/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/442", + "id": 859703836, + "node_id": "MDU6SXNzdWU4NTk3MDM4MzY=", + "number": 442, + "title": "Пофиксить потенциально разную семантику у `typedef` и `using`", + "user": { + "login": "yeputons", + "id": 1297325, + "node_id": "MDQ6VXNlcjEyOTczMjU=", + "avatar_url": "https://avatars.githubusercontent.com/u/1297325?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/yeputons", + "html_url": "https://github.com/yeputons", + "followers_url": "https://api.github.com/users/yeputons/followers", + "following_url": "https://api.github.com/users/yeputons/following{/other_user}", + "gists_url": "https://api.github.com/users/yeputons/gists{/gist_id}", + "starred_url": "https://api.github.com/users/yeputons/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/yeputons/subscriptions", + "organizations_url": "https://api.github.com/users/yeputons/orgs", + "repos_url": "https://api.github.com/users/yeputons/repos", + "events_url": "https://api.github.com/users/yeputons/events{/privacy}", + "received_events_url": "https://api.github.com/users/yeputons/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 3771028573, + "node_id": "LA_kwDOFK7cns7gxVRd", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23-ru-comment", + "name": "C++23-ru-comment", + "color": "21DB3A", + "default": false, + "description": "Идея, которую можно попробовать отправить коментарием от страны к C++23" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 0, + "created_at": "2021-04-16T10:53:03Z", + "updated_at": "2022-02-19T11:02:25Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Мелочь, навеянная вот этим вопросом на SO: https://stackoverflow.com/questions/48613758/using-vs-typedef-is-there-a-subtle-lesser-known-difference\r\n\r\n[`dcl.typedef`/2](https://eel.is/c++draft/dcl.typedef#2) сообщает, что `using A = struct {};` и `typedef struct {} A;` должны быть эквивалентны:\r\n\r\n> A typedef-name can also be introduced by an alias-declaration. ... Such a typedef-name has the same semantics as if it were introduced by the typedef specifier. ...\r\n\r\nДальше можно посмотреть конструкцию `typedef struct {} A;` на верхнем уровне кода, которая относительно ожидаемо заводит тип `A` с external linkage из-за правила [`basic.link]/4.3`](https://eel.is/c++draft/basic.link#4.3). Но, к сожалению, это правило пишет про \"typedef declaration\", что можно интерпретировать как \"typedef declaration, but not alias declaration\". То есть `using A = struct {};` уже не линкуется.\r\n\r\nВероятно, GCC этим и занимается: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99931\r\n\r\nПредлагаю поправить и поменять в этом месте \"typedef declaration\" на что-то вроде \"typedef declaration or alias declaration\". Наверняка захочется зацепить ещё соседние кусочки про `enum`.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/442/reactions", + "total_count": 3, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/442/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/441", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/441/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/441/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/441/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/441", + "id": 858022937, + "node_id": "MDU6SXNzdWU4NTgwMjI5Mzc=", + "number": 441, + "title": "std::unique_any - не требующий копируемости вариант std::any", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-14T15:40:44Z", + "updated_at": "2021-04-14T15:44:58Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "Изначально, std::any позиционировался как безопасная замена `void*`, но что-то пошло не по плану.\r\nВ С++20 нет возможности поместить в std::any некопируемые типы, например типы содержащие std::unqiue_ptr или std::mutex.\r\n\r\n### Решение - std::unique_any\r\n\r\nОтдельный класс `std::unique_any` полностью повторяющий интерфейс `std::any` но без конcтруторов копирования и операторов присвоения от unique_any http://eel.is/c++draft/any.class.general\r\n\r\nПример использования:\r\n```cpp\r\nstd::unique_any var;\r\nvar = 42;\r\nvar.emplace(std::in_place);\r\n\r\nvar.reset();\r\n\r\nstd::lock_guard lock{std::any_cast(var)};\r\nauto shared_var = std::make_shared(42); // 2 allocations\r\n```\r\n\r\nПлюсы:\r\n* удобный и привычный интерфейс\r\n* мы получаем безопасный аналог std::unique_ptr\r\n\r\nМинусы:\r\n* решение не масштабируется на остальные умные указатели (например std::shared_ptr). Но можно добавлять по новому типу на каждый умный указатель, например std::shared_any", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/441/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/441/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/440", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/440/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/440/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/440/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/440", + "id": 857926101, + "node_id": "MDU6SXNzdWU4NTc5MjYxMDE=", + "number": 440, + "title": "std::vector problem", + "user": { + "login": "kirillgrachoff", + "id": 35011824, + "node_id": "MDQ6VXNlcjM1MDExODI0", + "avatar_url": "https://avatars.githubusercontent.com/u/35011824?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/kirillgrachoff", + "html_url": "https://github.com/kirillgrachoff", + "followers_url": "https://api.github.com/users/kirillgrachoff/followers", + "following_url": "https://api.github.com/users/kirillgrachoff/following{/other_user}", + "gists_url": "https://api.github.com/users/kirillgrachoff/gists{/gist_id}", + "starred_url": "https://api.github.com/users/kirillgrachoff/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kirillgrachoff/subscriptions", + "organizations_url": "https://api.github.com/users/kirillgrachoff/orgs", + "repos_url": "https://api.github.com/users/kirillgrachoff/repos", + "events_url": "https://api.github.com/users/kirillgrachoff/events{/privacy}", + "received_events_url": "https://api.github.com/users/kirillgrachoff/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 4417430062, + "node_id": "LA_kwDOFK7cns8AAAABB0yiLg", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/breaking-change", + "name": "breaking-change", + "color": "b60205", + "default": false, + "description": "Идея, ломающая валидный имеющийся код или бинарную совместимость" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-14T13:56:47Z", + "updated_at": "2022-08-11T18:54:42Z", + "closed_at": "2022-08-11T18:54:42Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "It is rude to write\r\n```cpp\r\ntemplate \r\nauto& get_at(std::vector& container, size_t index) {\r\n // write to log\r\n return container[index];\r\n}\r\n```\r\nstd::vector::operator[] returns _Bit_Reference which cannot be cast to bool& or const bool&\r\n\r\nIt is also rude to write\r\n```cpp\r\nT& value = container[index]\r\n```\r\nbecause of _Bit_Reference.\r\n\r\nMy suggestion is:\r\nRename `std::vector` to `std::dynamic_bitset` (or similar) to prevent compile-errors because of `std::vector` specialization.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/440/reactions", + "total_count": 4, + "+1": 1, + "-1": 3, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/440/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/439", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/439/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/439/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/439/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/439", + "id": 856595559, + "node_id": "MDU6SXNzdWU4NTY1OTU1NTk=", + "number": 439, + "title": "Constexper bitset", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035671, + "node_id": "MDU6TGFiZWwyODE1MDM1Njcx", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/duplicate", + "name": "duplicate", + "color": "cfd3d7", + "default": true, + "description": "This issue or pull request already exists" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-13T05:50:38Z", + "updated_at": "2021-04-15T07:56:20Z", + "closed_at": "2021-04-14T18:53:20Z", + "author_association": "NONE", + "active_lock_reason": null, + "body": "Необходимо пометить все методы std::bitset как constexpr", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/439/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/439/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/438", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/438", + "id": 855114208, + "node_id": "MDU6SXNzdWU4NTUxMTQyMDg=", + "number": 438, + "title": "Добавление недостающей функции для работы с кучей", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035680, + "node_id": "MDU6TGFiZWwyODE1MDM1Njgw", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/good%20first%20issue", + "name": "good first issue", + "color": "7057ff", + "default": true, + "description": "Несложная на вид идея. Самое то, чтобы попробовать написать на её proposal и помочь РГ21" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 8, + "created_at": "2021-04-10T17:13:41Z", + "updated_at": "2021-06-24T11:47:29Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В стандарте есть функции для работы с кучей. is_heap, make_heap, push_heap, pop_heap и другие. \r\nНе достает std::shift_down которая будет просеивать модифицированный максимальный/минимальный элемент. \r\nНапример библиотеки событий используют кучу для хранения таймеров. Те получаем таймер, отрабатываем callback и переводим. Делать перезавод удалением + добавлением не оптимально. (Та функция которую приходится заново писать на каждом месте работы)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/438/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/438/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/437", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/437", + "id": 854341714, + "node_id": "MDU6SXNzdWU4NTQzNDE3MTQ=", + "number": 437, + "title": "Добавление новых часов и исправление функций сна", + "user": { + "login": "Roman-Koshelev", + "id": 34384083, + "node_id": "MDQ6VXNlcjM0Mzg0MDgz", + "avatar_url": "https://avatars.githubusercontent.com/u/34384083?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Roman-Koshelev", + "html_url": "https://github.com/Roman-Koshelev", + "followers_url": "https://api.github.com/users/Roman-Koshelev/followers", + "following_url": "https://api.github.com/users/Roman-Koshelev/following{/other_user}", + "gists_url": "https://api.github.com/users/Roman-Koshelev/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Roman-Koshelev/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Roman-Koshelev/subscriptions", + "organizations_url": "https://api.github.com/users/Roman-Koshelev/orgs", + "repos_url": "https://api.github.com/users/Roman-Koshelev/repos", + "events_url": "https://api.github.com/users/Roman-Koshelev/events{/privacy}", + "received_events_url": "https://api.github.com/users/Roman-Koshelev/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035680, + "node_id": "MDU6TGFiZWwyODE1MDM1Njgw", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/good%20first%20issue", + "name": "good first issue", + "color": "7057ff", + "default": true, + "description": "Несложная на вид идея. Самое то, чтобы попробовать написать на её proposal и помочь РГ21" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 9, + "created_at": "2021-04-09T09:19:23Z", + "updated_at": "2021-04-18T20:38:58Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "В С++20 сильно расширили зоопарк часов, но так и не сделали то чего хотелось бы.\r\n\r\nПроблемма 1.\r\n\r\nСейчас (до с++20 по крайней мере) есть трое часов (system_clock, steady_clock, high_resolution_clock).\r\nsystem_clock - часы реального времени с разрешением ??? В Windows это 100ns, на linux в libc++ 1us (наносекунды обрезаются) а в libstdc++ 1ns\r\nsteady_clock - монотонные часы с разрешением обычно 1ns\r\nhigh_resolution_clock - непонятные часы которые steady_clock в Microsoft STL и libc++, и system_clock в libstdc++. Как и для чего их можно использовать абсолютно не ясно.\r\n\r\nПроблемы:\r\n- В linux эти часы зачастую работают не через vDSO (что очень печально).\r\n- Непонятно как получить разрешение\r\n- Отсутствуют их быстрые но менее точные версии\r\n\r\nЧего хочется:\r\n- разрешение часов в constexpr\r\n- обязать их работать через vDSO\r\n- добавить быстрые версии этих часов (с меньшим разрешением). В linux это CLOCK_REALTIME_COARSE и CLOCK_MONOTONIC_COARSE которые сильно шустрее и имеют размешение 1ms чего достаточно для 99% кейсов\r\n- интерфейс для получения типа нужных часов в compile time. Например: дай мне самые быстрые steady часы с разрешением не менее 10ms\r\n\r\n\r\nПроблемма 2.\r\n\r\nДля того чтобы заснуть с++ предоставляет 2 функции (sleep_for и sleep_until). Обе работают интересным образом.\r\nВ Microsoft STL функция sleep_for прибавляет к переданному времени clock::now() и делает sleep_until.\r\nlibc++ и libstdc++ делают наоборот. sleep_until отнимает от переданного времени clock::now() и вызывает sleep_for\r\n\r\nПроблемы Microsoft STL:\r\n- функция вызывает clock::now() что лишнее действие которое конечно нужно для точности, но не всем. Если пользователь захочет он должен сам вызывать clock::now() и вызывать sleep_until. Если вызывается sleep_for то она должна просто уйти в сон без лишних телодвижений\r\n\r\nПроблемы libc++ и libstdc++:\r\n- тут все сильно хуже. Пользователь дергает sleep_until, вызывается clock::now() (которая к тому же не через vDSO), теряется точность например после clock::now() и до sleep() мы можем получить вытеснение и проспим дольше положенного (разработчики многих либ и продуктов съели на этом сто собак). В итоге мы получаем лишний дорогой системный вызов, за счет уменьшения точности (Как тебе такое Илон Маск?).\r\n\r\n\r\nЧего хочется:\r\n- чтобы sleep_until гарантированно работала оптимально\r\n- чтобы sleep_for просто делала что говорят, и не пыталась чтото улучшить за счет лишних телодвижений", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/437/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/437/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/436", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/436/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/436/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/436/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/436", + "id": 853540849, + "node_id": "MDU6SXNzdWU4NTM1NDA4NDk=", + "number": 436, + "title": "Возврат из функции объекта, созданного из конструктора по умолчанию", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2891567122, + "node_id": "MDU6TGFiZWwyODkxNTY3MTIy", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/--", + "name": "--", + "color": "E25547", + "default": false, + "description": "Непопулярная идея (10 и более дизлайков)" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-08T14:35:25Z", + "updated_at": "2021-04-08T14:37:11Z", + "closed_at": "2021-04-08T14:36:24Z", + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +1, -19\r\n_Автор идеи:_ ??\r\n\r\nРазрешить использовать такую конструкцию return auto в функциях, где возможно создать объект\r\n```\r\nT foo() {\r\n return auto; // return T();\r\n}\r\n```\r\n\r\n```\r\nExample:\r\n\r\nusing namespace std;\r\n\r\nvector foo() {\r\n return auto; // Here will be: return vector();\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/436/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/436/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/435", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/435/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/435/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/435/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/435", + "id": 850244794, + "node_id": "MDU6SXNzdWU4NTAyNDQ3OTQ=", + "number": 435, + "title": "Возможность достать std::stacktrace из исключения", + "user": { + "login": "axolm", + "id": 36848714, + "node_id": "MDQ6VXNlcjM2ODQ4NzE0", + "avatar_url": "https://avatars.githubusercontent.com/u/36848714?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/axolm", + "html_url": "https://github.com/axolm", + "followers_url": "https://api.github.com/users/axolm/followers", + "following_url": "https://api.github.com/users/axolm/following{/other_user}", + "gists_url": "https://api.github.com/users/axolm/gists{/gist_id}", + "starred_url": "https://api.github.com/users/axolm/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/axolm/subscriptions", + "organizations_url": "https://api.github.com/users/axolm/orgs", + "repos_url": "https://api.github.com/users/axolm/repos", + "events_url": "https://api.github.com/users/axolm/events{/privacy}", + "received_events_url": "https://api.github.com/users/axolm/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815256097, + "node_id": "MDU6TGFiZWwyODE1MjU2MDk3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%92%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5", + "name": "В работе", + "color": "FBCA04", + "default": false, + "description": "Над идеей идёт активная работа в рамках РГ21" + } + ], + "state": "open", + "locked": false, + "assignee": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "assignees": [ + { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + { + "login": "axolm", + "id": 36848714, + "node_id": "MDQ6VXNlcjM2ODQ4NzE0", + "avatar_url": "https://avatars.githubusercontent.com/u/36848714?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/axolm", + "html_url": "https://github.com/axolm", + "followers_url": "https://api.github.com/users/axolm/followers", + "following_url": "https://api.github.com/users/axolm/following{/other_user}", + "gists_url": "https://api.github.com/users/axolm/gists{/gist_id}", + "starred_url": "https://api.github.com/users/axolm/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/axolm/subscriptions", + "organizations_url": "https://api.github.com/users/axolm/orgs", + "repos_url": "https://api.github.com/users/axolm/repos", + "events_url": "https://api.github.com/users/axolm/events{/privacy}", + "received_events_url": "https://api.github.com/users/axolm/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": null, + "comments": 3, + "created_at": "2021-04-05T09:45:49Z", + "updated_at": "2021-09-30T16:34:54Z", + "closed_at": null, + "author_association": "NONE", + "active_lock_reason": null, + "body": "Конкретно предлагается добавить статический метод `std::stacktrace::from_current_exception()`, который будет возвращать `std::stacktrace`(или возможно `const std::stacktrace&`).\r\nВ качестве пруфа, что к исключению можно добавить трейс без слома ABI делается прототип - https://github.com/axolm/libsfe.\r\nВсё обсуждение ведётся в контексте того, что в стандарт C++23 добавлен `std::stacktrace`", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/435/reactions", + "total_count": 7, + "+1": 6, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 1, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/435/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/434", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/434/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/434/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/434/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/434", + "id": 849690135, + "node_id": "MDU6SXNzdWU4NDk2OTAxMzU=", + "number": 434, + "title": "Добавить std::left( container, number) , std::right(container, number)", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815246228, + "node_id": "MDU6TGFiZWwyODE1MjQ2MjI4", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++20", + "name": "C++20", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++20" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-03T16:21:34Z", + "updated_at": "2021-04-07T08:32:15Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +8, -1\r\n_Автор идеи:_ ??\r\n\r\nу многих языках и SQL есть удобная функция left , right .\r\n\r\n \r\n\r\nнапример, \r\n\r\n \r\n```cpp\r\nstd::string name = \"Hello, world\";\r\n\r\nstd::string hello = left(name, 5); // 'Hello' , name.substr(0, 5)\r\n\r\nstd::string world = right(name, 5); // 'world' , name.substr( name.length() - 5, 5);\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/434/reactions", + "total_count": 2, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 1, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/434/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/433", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/433/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/433/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/433/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/433", + "id": 849689301, + "node_id": "MDU6SXNzdWU4NDk2ODkzMDE=", + "number": 433, + "title": "enum class в switch case конструкций можно использовать если в switch стоит переменный с underlying type of enum", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-03T16:17:23Z", + "updated_at": "2021-04-16T11:57:09Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +3, -7\r\n_Автор идеи:_ ??\r\n\r\nПример, который не скомплируется в с++11 или слудующих версий, потому что enum color не конвертируется на \"int\" . Но в switch case здесь никакое присваивание enum color на каких либо int не происходят. \r\n\r\n \r\n```cpp\r\nenum class color{ red, blue, white };\r\n\r\nint main()\r\n{\r\n int value = read_value_from_anywhere_other_library();\r\n\r\n switch( value ) \r\n {\r\n case color::red : printf(\"This is a red color\\n\"); break;\r\n case color::bllue : printf(\"This is a blue color\\n\"); break;\r\n case color::white : printf(\"This is a white color\\n\"); break;\r\n default: printf(\"This is not a color\\n\");\r\n }\r\n\r\n return 0;\r\n}\r\n```\r\n \r\n\r\nПредлагаю, добавить автогенерация оператор сравнение enum class с его underlying type . Чтобы легко сравнивать и использовать их в if else , switch case и других местах.\r\n\r\n \r\n\r\n \r\n\r\nТот пример , изменим и делаем работающий код для нынешного стандарт С++, будет UB:\r\n```cpp\r\nenum class color{ red, blue, white };\r\n\r\nint main()\r\n{\r\n int value = read_value_from_anywhere_other_library();\r\n\r\n switch( (enum color) value ) // converting has a UB.\r\n {\r\n case color:: red: printf(\"This is a red color\\n\"); break;\r\n case color:: blue: printf(\"This is a blue color\\n\"); break;\r\n case color:: white: printf(\"This is a white color\\n\"); break;\r\n default: printf(\"This is a not color\\n\");break;\r\n }\r\n}\r\n```\r\n \r\n\r\nЕсли не ошибаюсь, в с++17 конвертация целый число в enum class будет UB, если этот целый число значение имеет больше бит чем enum class элементы используется. В данном случий, enum class color -- элементам хватить 3 бит, а \"value\" переменный может имет любой допустимый значений.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/433/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/433/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/432", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/432/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/432/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/432/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/432", + "id": 849687366, + "node_id": "MDU6SXNzdWU4NDk2ODczNjY=", + "number": 432, + "title": "Добавить атрибут [[strict]] в switch, и способ указать значение по-умолчанию в enum class", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-03T16:07:50Z", + "updated_at": "2021-04-16T11:48:53Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +1, -2\r\n_Автор идеи:_ ??\r\n\r\nПредставим что есть такой код:\r\n```cpp\r\nenum class TestEnum {\r\n one,\r\n two\r\n};\r\n\r\nvoid someFunc() {\r\n TestEnum test = TestEnum::one;\r\n\r\n switch (test) {\r\n case TestEnum::one:\r\n cout << \"One\";\r\n break;\r\n case TestEnum::two:\r\n cout << \"Two\";\r\n break;\r\n default:\r\n cout << \"Default\";\r\n break;\r\n }\r\n}\r\n```\r\nИ вот что с ним не так:\r\n\r\n1) Бесполезная ветка default. Если все работает как задумано, то эта ветка не должна выполняться вообще никогда.\r\n\r\n2) Непонятки с самой последней инструкцией break; С виду она как-будто не нужна, но если ее удалить, а потом кто-то, например, из эстетических соображений перенесет default-ветку вверх switch-а то сразу возникнет ошибка из за пропавшего break. Вот код после этих 2х модификаций:\r\n```cpp\r\nswitch (test) {\r\ndefault:\r\n cout << \"Default\"; // Error: break missing!\r\ncase TestEnum::one:\r\n cout << \"One\";\r\n break;\r\ncase TestEnum::two:\r\n cout << \"Two\";\r\n break;\r\n}\r\n```\r\n3) Если удалить default ветку а затем добавить только в enum дополнительное значение \"three\", то программа без проблем скомпилируется, хотя в switch не перебраны все варианты enum-a и нет default ветки. Что тоже выглядит не так как задумано. Пример такой модификации:\r\n```cpp\r\nenum class TestEnum {\r\n one,\r\n two,\r\n three\r\n};\r\n\r\nvoid someFunc() {\r\n TestEnum test = TestEnum::one;\r\n\r\n switch (test) {\r\n case TestEnum::one:\r\n cout << \"One\";\r\n break;\r\n case TestEnum::two:\r\n cout << \"Two\";\r\n break;\r\n } // Where is three?\r\n}\r\n```\r\n4) Так же этот код возможно сломать, если убрать инициализацию переменной значением TestEnum::one . Тогда в switch будет выполняться default ветка, что тоже не выглядит как хорошее поведение для неинициализированной переменной.\r\n\r\nПредлагаю следующее:\r\n\r\n1) Добавить в enum class атрибут, который бы существенно ограничивал возможности создания такого enum-а без значения, например [[strict]]\r\n\r\n2) Добавить в switch атрибут, например [[strict]], который бы гарантировал перебор всех значений enum ов и убирал нерабочие ветки:\r\n\r\nЧтобы это сделать, нужно во-первых сделать break-поведение, поведением по-умолчанию. Т.е. мы убираем все break операторы и подразумеваем что в конце всех case будет автоматом происходить выходить из switch.\r\nВо-вторых нужно гарантировать представленность всех случаев enum-а\r\nЕсли параметром [[strict]] switch передали обычный enum то выдавать compilation error\r\n\r\nЕсли параметром в [[strict]] switch передали enum class (enum, который без атрибута [[strict]]) то проверять, что обязательно есть default ветка, и обязательно есть все возможые case для значений этого enum, иначе compilation error.\r\ndefault ветка как раз для случаев, когда этот enum class инициализирован мусором.\r\nЕсли же нужен [[strict]] switch не по всем значениям enum class, то можно например добавить атрибут [[notfull]], тогда все скомпилится. Важно! атрибут [[notfull]] нужен только в комбинации [[strict]] switch + enum class (не строгий)\r\n\r\nЕсли параметром в [[strict]] switch передали enum class [[strict]], то должно быть всего 2 возможных сценария, которые корректно скомпилируются: либо в этом switch укзааны все возможные значения enum и отсутствует default ветка, либо пропущен один или несколько вариантов enum и тогда default ветка гарантированно присутствует, иначе ошибка компиляции. Примеры кода:\r\n```cpp\r\nenum TestEnum {\r\n one,\r\n two\r\n};\r\n\r\nenum class TestEnumClass {\r\n one,\r\n two\r\n};\r\n\r\nenum class [[strict]] TestEnumStrict {\r\n one,\r\n two\r\n};\r\n\r\n\r\n// строгие switch + обычные enum\r\n TestEnum test;\r\n [[strict]] switch (test) { // В любом случае ошибка компиляции\r\n }\r\n \r\n // строгие switch + обычные enum class\r\n TestEnumClass testClass;\r\n // Успешно скомпилируется\r\n [[strict]] switch (testClass) { \r\n case TestEnumClass::one: cout << \"one\";\r\n case TestEnumClass::two: cout << \"two\";\r\n default: cout << \"not initialized!\";\r\n }\r\n \r\n // Ошибка компиляции: нет default ветки для мусора при инициализации\r\n [[strict]] switch (testClass) { \r\n case TestEnumClass::one: cout << \"one\";\r\n case TestEnumClass::two: cout << \"two\";\r\n }\r\n \r\n // Ошибка компиляции: не все случаи enum представлены\r\n [[strict]] switch (testClass) { \r\n case TestEnumClass::one: cout << \"one\";\r\n default: cout << \"not initialized!\";\r\n }\r\n \r\n // Успешно скомпилируется\r\n [[strict, notfull]] switch (testClass) { \r\n case TestEnumClass::one: cout << \"one\";\r\n default: cout << \"default\";\r\n }\r\n \r\n // Строгие switch + строгие enum class\r\n TestEnumStrict testStrict;\r\n // Успешно скомпилируется, все случаи enum есть, default ветка отсутствует, как и должна\r\n [[strict]] switch (testStrict) { \r\n case TestEnumStrict::one: cout << \"one\";\r\n case TestEnumStrict::two: cout << \"two\";\r\n }\r\n \r\n // Успешная компиляция, тот случай, когда нужно поработать не со всеми enum-значениями\r\n [[strict]] switch (testStrict) { \r\n case TestEnumStrict::one: cout << \"one\";\r\n default: cout << \"default\";\r\n }\r\n \r\n // Ошибка компиляции: default ветка должна отсутствовать! потому что все enum варианты перебраны\r\n [[strict]] switch (testStrict) { \r\n case TestEnumStrict::one: cout << \"one\";\r\n case TestEnumStrict::two: cout << \"two\";\r\n default: cout << \"default\";\r\n }\r\n \r\n // Ошибка компиляции: здесь представлены не все случаи enum!\r\n [[strict]] switch (testStrict) { \r\n case TestEnumStrict::one: cout << \"one\";\r\n }\r\n \r\n // Ошибка компиляции. не должно быть break инструкции в [[strict]] switch\r\n [[strict]] switch (testStrict) { \r\n case TestEnumStrict::one: cout << \"one\"; break;\r\n default: cout << \"default\";\r\n }\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/432/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/432/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/431", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/431/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/431/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/431/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/431", + "id": 849681118, + "node_id": "MDU6SXNzdWU4NDk2ODExMTg=", + "number": 431, + "title": "std::any_of_variadic", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815246228, + "node_id": "MDU6TGFiZWwyODE1MjQ2MjI4", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++20", + "name": "C++20", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++20" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-03T15:35:22Z", + "updated_at": "2021-04-03T15:48:41Z", + "closed_at": "2021-04-03T15:48:41Z", + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +??, -??\r\n_Автор идеи:_ ??\r\n\r\nЧасто приходится писать код, типа\r\n\r\nif ((a == 1) || (a == 2) || (a == 3)) { ... };\r\n\r\nМне кажется, что что-то типа if (std::any_of_variadic(a, 1, 2, 3)) { ... }; этот код бы достаточно сократило.\r\n\r\n+Для консистентности, можно было бы добавить all_of_variadic и none_of_variadic.\r\n\r\n \r\n\r\nСуществует еще вариант, который очень близок к стандартной библиотеке, такой как std::something_of_variadic(функтор, аргументы...), может есть смысл подумать над ним?", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/431/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/431/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/430", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/430/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/430/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/430/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/430", + "id": 849680649, + "node_id": "MDU6SXNzdWU4NDk2ODA2NDk=", + "number": 430, + "title": "Json, XML, Ini format parser", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 4, + "created_at": "2021-04-03T15:32:54Z", + "updated_at": "2021-07-09T11:33:12Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +10, -2\r\n_Автор идеи:_ ??\r\n\r\nВ С++ добавляется столько много вещей, это приятно. \r\n\r\nНо в другой сторону, это печально, что С++ нет стаднтрный инструмент для работы с JSON, XML, INI форматом, который используется почти для все программы с сетевом содействием и других местах. Да, здесь очень много сторонных библиотеках, но у всех есть свои плюси и минусы и главное не в духе современный язык С++.\r\n\r\n \r\n\r\nНедавно читал, С++20 добавили std::format -- очень круто! Python стил форматирование, не-такой громоздкой, быстрый как printf, легко расширяется с пользовательский тип данных, возмнож возвращает std::string, или возможно записывает результат на char [] массив.\r\n\r\n \r\n\r\nВот таким образом, не ужелье нельзя добавить JSON, XML формат парсеры и контейнеры, который и легковесный и быстрый и удобный в использование?\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/430/reactions", + "total_count": 4, + "+1": 3, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 1, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/430/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/429", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/429/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/429/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/429/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/429", + "id": 849680106, + "node_id": "MDU6SXNzdWU4NDk2ODAxMDY=", + "number": 429, + "title": "Длинная арифметика", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035671, + "node_id": "MDU6TGFiZWwyODE1MDM1Njcx", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/duplicate", + "name": "duplicate", + "color": "cfd3d7", + "default": true, + "description": "This issue or pull request already exists" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-03T15:29:40Z", + "updated_at": "2021-04-03T15:31:27Z", + "closed_at": "2021-04-03T15:31:19Z", + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +??, -??\r\n_Автор идеи:_ ??\r\n\r\nДобавить в C++ библиотеку по работе с длинными числами .Насколько знаю сейчас такое есть только в GMP . Хотелось бы иметь такое а самом стандарте .", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/429/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/429/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/428", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/428/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/428/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/428/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/428", + "id": 849679781, + "node_id": "MDU6SXNzdWU4NDk2Nzk3ODE=", + "number": 428, + "title": "Стандартизировать вложенный включение стандартные библиотеки", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-03T15:27:46Z", + "updated_at": "2021-04-03T15:28:18Z", + "closed_at": "2021-04-03T15:28:18Z", + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +??, -??\r\n_Автор идеи:_ ??\r\n\r\nМоя идея, каждого стандартную библиотеку указать какие другие библиотеки они \"должны\" включить, как минимум.\r\n\r\n\r\nНапример, тот же -- зависят по каким другим библиотекам, надо точно указать .\r\n\r\nЛибо, C++17 -- -- Здесь мне интересно , что, это библиотека включает у себя или нет? \r\n\r\nУ std::string_view нет прямую зависимости std::string.\r\n\r\nНапример, у boost/utility/string_view.hpp (1.69 ) включает , , , , и ряд других стандартные библиотеки.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/428/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/428/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/427", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/427/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/427/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/427/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/427", + "id": 849679055, + "node_id": "MDU6SXNzdWU4NDk2NzkwNTU=", + "number": 427, + "title": "Добавить string_view перегрузки для stoi и istringstream", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035671, + "node_id": "MDU6TGFiZWwyODE1MDM1Njcx", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/duplicate", + "name": "duplicate", + "color": "cfd3d7", + "default": true, + "description": "This issue or pull request already exists" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-03T15:23:34Z", + "updated_at": "2021-04-03T15:26:07Z", + "closed_at": "2021-04-03T15:25:59Z", + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +??, -??\r\n_Автор идеи:_ ??\r\n\r\nПредложение улучшает философию C++ \"Не платить за то, что не используется\" для stoi и istringstream т.к. в стандартной библиотеке в приведенных ситуациях приходится платить созданием временной строки, которая в дальнейшем не используется.\r\n\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/427/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/427/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/426", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/426/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/426/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/426/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/426", + "id": 849304357, + "node_id": "MDU6SXNzdWU4NDkzMDQzNTc=", + "number": 426, + "title": "Добавить operator [] на std::tuple, std::variant, std::pair", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035671, + "node_id": "MDU6TGFiZWwyODE1MDM1Njcx", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/duplicate", + "name": "duplicate", + "color": "cfd3d7", + "default": true, + "description": "This issue or pull request already exists" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-02T16:07:55Z", + "updated_at": "2021-04-02T16:11:09Z", + "closed_at": "2021-04-02T16:11:02Z", + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +??, -??\r\n_Автор идеи:_ ??\r\n\r\n```cpp\r\n// example\r\n\r\nstd::tuple my_tuple;\r\n\r\nint first = my_tuple[ _1 ]; \r\ndouble second = my_tuple[ _2 ];\r\nfloat third = my_tuple[ _3 ];\r\n\r\n\r\nstd::pair< std::string, bool > p;\r\n\r\nstd::string s = p[ _1 ] ;\r\nbool b = p[ _2 ];\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/426/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/426/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/425", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/425/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/425/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/425/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/425", + "id": 849298059, + "node_id": "MDU6SXNzdWU4NDkyOTgwNTk=", + "number": 425, + "title": "Запретить присвоение арифметические типы в std::string", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035671, + "node_id": "MDU6TGFiZWwyODE1MDM1Njcx", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/duplicate", + "name": "duplicate", + "color": "cfd3d7", + "default": true, + "description": "This issue or pull request already exists" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-02T15:58:57Z", + "updated_at": "2021-04-02T16:02:33Z", + "closed_at": "2021-04-02T16:02:02Z", + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +??, -??\r\n_Автор идеи:_ ??\r\n\r\nбыло бы хорошо если добавили эту:\r\n\r\n \r\n\r\n```cpp\r\n//Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64\r\n\r\n#include \r\n\r\ntemplate< typename char_type>\r\n class basic_string\r\n{ \r\n public: \r\n basic_string& operator = (char c);\r\n \r\n template< typename T , class = typename std::enable_if< std::is_integral::value && ! std::is_same::value >::type >\r\n basic_string& operator = (T ) = delete;\r\n};\r\n\r\ntypedef basic_string string;\r\nint main()\r\n{\r\n string s;\r\n s = 'a';\r\n \r\n s = 23; // error C2280: 'basic_string &basic_string::operator =(T)': attempting to reference a deleted function\r\n //with\r\n //[\r\n // T=int\r\n //]\r\n //(15): note: see declaration of 'basic_string::operator ='\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/425/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/425/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/424", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/424/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/424/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/424/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/424", + "id": 849294220, + "node_id": "MDU6SXNzdWU4NDkyOTQyMjA=", + "number": 424, + "title": "scope_guard и on_exception_guard для освобождения ресурсов", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815551289, + "node_id": "MDU6TGFiZWwyODE1NTUxMjg5", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%20%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D0%BE%D0%BC", + "name": "Помощь советом", + "color": "FEF2C0", + "default": false, + "description": "Идея прорабатывается другими участниками международного коммитета" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-02T15:51:20Z", + "updated_at": "2021-04-07T08:45:58Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +5, -1\r\n_Автор идеи:_ ??\r\n\r\nДля обеспечения нужного уровня безопасности исключений бывает необходимо при выходе из области видимости выполнить какой-то код (например, освободить ресурс) даже, если код прерван исключением. При этом не всегда удобно создавать отдельный объект, управляющий ресурсом, например, если идет работа с чисто C-шным кодом. Для этого я предлагаю стандартизировать scope_guard и on_exception_guard, со вспомогательными методами их создания make_scope_guard() make_on_exception_guard().\r\n```cpp\r\nint main()\r\n{\r\n int fd = ::open( \"/etc/passwd\", O_RDWR );\r\n if( fd == -1 )\r\n exit( EXIT_FAILURE );\r\n auto fd_guard = make_scope_guard( [=](){ ::close( fd ); } );\r\n // make_scope_guard() создает объект scope_guard, в деструкторе которого выполнится переданный код\r\n do_somth_with( fd );\r\n close( fd ); // если закрывать fd до выхода из области видимости не нужно,\r\n fd_guard.release(); // тогда эти две строки можно вообще не писать\r\n\r\n do_some_more();\r\n \r\n return 0;\r\n}\r\n```\r\nПри использовании такого кода в реальности оптимизитор выбросит все ненужное, в т.ч. и создание объекта scope_guard, при этом сгенерирует код, в котором при любом выходе из области видимости будет вызван close().\r\n\r\nПри вызове make_scope_guard(), создается объект scope_guard и ему передается лямбда для выполнения в деструкторе ~scope_guard(). Также у scope_guard есть метод release() для отмены выполнения кода в деструкторе и для симметричности acquire(), хотя не уверен, что он нужен. Примерная реализация:\r\n```cpp\r\ntemplate \r\nstruct scope_guard\r\n{\r\n scope_guard( T code )\r\n :code( code )\r\n ,own( true )\r\n {}\r\n scope_guard( scope_guard&& other )\r\n :code( other.code )\r\n ,own( true )\r\n { other.own = false; }\r\n scope_guard& operator=( scope_guard&& other ) = delete;\r\n ~scope_guard() { if( own ) code(); }\r\n\r\n scope_guard( const scope_guard& ) = delete;\r\n scope_guard& operator=( const scope_guard& ) = delete;\r\n\r\n void release() { own = false; }\r\n void acquire() { own = true; }\r\n T code;\r\n bool own;\r\n};\r\n\r\n/**\r\n * @code{.cpp}\r\n * auto fd_guard = make_scope_guard( [=](){ ::close( fd ); } );\r\n * @endcode\r\n */\r\ntemplate \r\nscope_guard make_scope_guard( T code )\r\n{\r\n return scope_guard( code );\r\n}\r\n```\r\n\r\nУ такого подхода есть один мелкий недочет - при создании scope_guard может вылететь исключение, однако, это возможно только при копировании захватываемых переменных по значению, однако в реальности все сколько-нибудь нетривиальные переменные scope_guard будет захватывать по ссылке.\r\n\r\non_exception_guard отличается от scope_guard лишь тем, что выполняет переданный код в деструкторе только при выходе из области видимости по исключению. В нужности методов release(), а тем более acquire() я сильно сомневаюсь. Реализация:\r\n```cpp\r\ntemplate \r\nstruct on_exception_guard\r\n{\r\n on_exception_guard( T code )\r\n :code( code )\r\n {}\r\n ~on_exception_guard()\r\n {\r\n#ifdef __cpp_lib_uncaught_exceptions\r\n if ( std::uncaught_exceptions() > 0 )\r\n#else\r\n if ( std::uncaught_exception() )\r\n#endif\r\n code();\r\n }\r\n T code;\r\n};\r\n\r\ntemplate \r\non_exception_guard make_on_exception_guard( T code )\r\n{\r\n return on_exception_guard( code );\r\n}\r\n```\r\nP.S. Можно обсуждать имена методов и типов, их функциональность и реализацию, но, по-моему, бесспорно, что нечто с функциональностью scope_exit давно пора стандартизировать.\r\n", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/424/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/424/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/423", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/423/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/423/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/423/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/423", + "id": 849285448, + "node_id": "MDU6SXNzdWU4NDkyODU0NDg=", + "number": 423, + "title": "Контракты не переименовывать expects/ensures на pre/post", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815531277, + "node_id": "MDU6TGFiZWwyODE1NTMxMjc3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%9D%D0%B0%20%D0%BF%D0%B0%D1%83%D0%B7%D0%B5", + "name": "На паузе", + "color": "D93F0B", + "default": false, + "description": "Международный комитет холодно встретил идею, нужно переосмыслить идею и вернуться к ней позднее" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2021-04-02T15:33:36Z", + "updated_at": "2021-04-05T12:11:21Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +2, -0\r\n_Автор идеи:_ **Игорь Шаповал**\r\n\r\nКонтракты не переименовывать expects/ensures на pre/post\r\n\r\nEWG на последнем заседании по С++20 в Коне одобрила на переименовывание контрактов для предусловия и постусловия expects/ensures на pre/post.\r\nEvolution Working Group (EWG) \r\n\r\nAt the last meeting, EWG finalized the feature set for C++20. At Kona, we focused on finalizing those features:\r\n\r\n* Contracts: We worked on refining the feature. The only change this meeting was renaming expects/ensures to pre/post.\r\n\r\nНазвание pre/post не говорят что это предусловия или постусловия. Может быть уже лучше precond/postcond.\r\n\r\nНазвание expects/ensures как названия для контрактов используются также в других языках.\r\n\r\nrequire/ensure используется в Eiffel. \r\n\r\nПредлагаю не переименовывать expects/ensures контракта. А добавить еще один контракт invariant для проверки полей класса.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/423/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/423/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/422", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/422/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/422/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/422/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/422", + "id": 849283921, + "node_id": "MDU6SXNzdWU4NDkyODM5MjE=", + "number": 422, + "title": "Добавить в switch атрибут [[autobreak]]", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-02T15:30:45Z", + "updated_at": "2021-10-04T11:54:56Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +7, -0\r\n_Автор идеи:_ **Игорь Савенков**\r\n\r\nСобственно, предлагаю добавить в switch атрибут [[autobreak]]\r\nИз названия можно догадаться, что autobreak нужен чтобы меньше писать break;\r\n\r\nАргументы \"за\":\r\n\r\nИмхо, ситуации, когда break пропущен и это сделано намеренно возникают значительно реже, чем когда он просто забыт по недосмотру, (яркое подтверждение этого - существование [[fallthrough]]). Поэтому неплохо бы иметь способ поменять поведение по-умолчанию.\r\n\r\nС этим атрибутом код становится чуть лаконичнее. Вместо такого:\r\n```cpp\r\nswitch (direction) \r\n{\r\ncase Dir::left:\r\n moveLeft();\r\n break;\r\ncase Dir::right:\r\n moveRight();\r\n break;\r\ndefault:\r\n notMove();\r\n break;\r\n}\r\n```\r\nБудет немного более короткая версия. Ну и удастся избежать ошибок со случайно пропущенным break\r\n```cpp\r\n[[autobreak]] switch (direction) \r\n{\r\ncase Dir::left:\r\n moveLeft();\r\ncase Dir::right:\r\n moveRight();\r\ndefault:\r\n notMove();\r\n}\r\n```\r\nМожно убрав переносы строк даже еще чутка сократить, почти не потеряв читаемость (но здесь уже вкусовщина)\r\n```cpp\r\n[[autobreak]] switch (direction) \r\n{\r\ncase Dir::left: moveLeft();\r\ncase Dir::right: moveRight();\r\ndefault: notMove();\r\n}\r\n```\r\n ", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/422/reactions", + "total_count": 2, + "+1": 2, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/422/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/421", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/421/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/421/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/421/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/421", + "id": 849281289, + "node_id": "MDU6SXNzdWU4NDkyODEyODk=", + "number": 421, + "title": "alias для базового класса", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-02T15:25:43Z", + "updated_at": "2022-01-01T02:54:40Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +13, -1\r\n_Автор идеи:_ **Даниил Милютин**\r\n\r\nПри наследовании (особенно с шаблонами) возникает следующая ситуация\r\n```cpp\r\ntemplate\r\nclass Derived: public Base, protected Policy\r\n{\r\nprotected:\r\n using help = Policy;\r\npublic:\r\n using super = Base;\r\n void foo()\r\n {\r\n super::foo(help::someMethod());//\r\n }\r\n};\r\n```\r\nПриходится два раза вбивать ( = копипастить) имя класса, чтобы получить alias.\r\n\r\nПредлагается сократить boilerplate следующим образом:\r\n```cpp\r\ntemplate\r\nclass Derived: public Base => super, protected Policy => help\r\n{\r\npublic:\r\n void foo()\r\n {\r\n super::foo(help::someMethod());//\r\n }\r\n};\r\n```\r\nПредполагается, что alias находятся в той же области видимости и имеют те же модификаторы доступа.\r\n\r\nЕсли очень хочется управлять областью видимости и модификаторами доступа alias, то\r\nможно предложить следующий синтаксис:\r\n```cpp\r\ntemplate\r\nclass Derived\r\n : public Base => private super\r\n , public Policy => private help\r\n{/*...*/};\r\n```\r\nХотя в этом случае мне видится разумным использовать старый синтаксис.\r\n\r\nСимвол \"=>\" мне пока что видится самым уместным.\r\nЕго можно бы заменить на \"=\" или на \"->\" или на \"typedef\" или даже на ключевое слово as.\r\n(Последнее маловероятно.)", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/421/reactions", + "total_count": 1, + "+1": 1, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/421/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/420", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/420/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/420/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/420/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/420", + "id": 849280479, + "node_id": "MDU6SXNzdWU4NDkyODA0Nzk=", + "number": 420, + "title": "Директива связывания extern \"N\" для стандартов", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815551289, + "node_id": "MDU6TGFiZWwyODE1NTUxMjg5", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%20%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D0%BE%D0%BC", + "name": "Помощь советом", + "color": "FEF2C0", + "default": false, + "description": "Идея прорабатывается другими участниками международного коммитета" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-02T15:24:10Z", + "updated_at": "2021-04-02T15:24:41Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +5, -2\r\n_Автор идеи:_ **Александр Коновалов**\r\n\r\nВ этой идеи и сам недоконца уверен, но всё же захотелось услышать мнение других.\r\n\r\nУ языка C++ есть старая \"болезнь\" (но для некоторых и приятная особенность): очень сильная обратная совместимость. Она ограничивает или усложняет введение нового функционала. Для хотя бы частичного решения данной проблемы есть идея указывать используемый стандарт в директиве extern (например: extern \"c++11\" { ... }). Таким образом, старый код можно будет обернуть данной директивой, не боясь проблем обратной совместимости. В рамках данной идеи также предлагается пропускать конструкции с невалидной строкой (а скорее даже выводить warning).\r\n\r\nЧем хороша для этого extern? Во-первых, такой подход используется для включения C кода в C++, а также аналогичный для использования C++ и C в D. Во-вторых, есть уже готовая и проверенная языковая конструкция. В-третьих, такую конструкцию также можно использовать для кастомных расширений C++ какими-либо компиляторами (а может даже библиотеками, которые ставятся как плагины к компиляторам).\r\n\r\nУ этого подхода есть и отрицательные стороны. Во-первых, необходимость оборачивать старый код. Во-вторых, без особых приёмов оборачивания (вроде тех, которые используются в заголовочных файлах C библиотеки в C++) такой код потеряет возможность быть скомпилированным на старых версиях компиляторов, т.к. текущая реализация предполагает генерацию ошибки при использовании строки с недопустимым содержимым. В-третьих, при использовании данного подхода при подключении кастомных расширений языка, не понятно, как разрулить случаи использования разных расширений или старого стандарта с расширением.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/420/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/420/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/419", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/419/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/419/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/419/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/419", + "id": 849272992, + "node_id": "MDU6SXNzdWU4NDkyNzI5OTI=", + "number": 419, + "title": "Разделить стандартную библиотеку на уровни", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815247857, + "node_id": "MDU6TGFiZWwyODE1MjQ3ODU3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23", + "name": "C++23", + "color": "0E8A16", + "default": false, + "description": "Реализовано, в стандарте начиная с C++23" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 3, + "created_at": "2021-04-02T15:10:30Z", + "updated_at": "2022-08-11T17:40:27Z", + "closed_at": "2022-08-11T17:40:13Z", + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +7, -1\r\n_Автор идеи:_ **Александр Коновалов**\r\n\r\nИдея очень абстрактная, но всё же интересно мнение сообщества на её счёт.\r\n\r\nЗдесь и не только замечал проблему многоцелевого использования C++. Есть люди, которые используют C++ для крупных проектов, у которых нет недостатка в ресурсах, а есть люди, которые используют C++ в системах с ограниченными ресурсами. Они не редко сталкиваются лбами: в крупных проектах хочется видеть много разных функций и возможностей, но это приводит к разрастанию стандартной библиотеки. Стоит отметить, сейчас например для микроконтроллеров разработчики не редко прибегают к альтернативным её реализациям или вовсе отказу от неё.\r\n\r\nВидимо при создании Java его разработчики столкнулись с аналогичной проблемой, решением которой стало разделение платформы на 4 уровня: Java Card, Java ME, Java SE, Java EE. Более старшая платформа включает функции более младшей.\r\n\r\nМоё предложение состоит в том, чтобы применить такую схему и для стандартной библиотеки. Что бы это могло дать? Во-первых, runtime библиотеку можно было бы разделить в соответствие с этими уровнями. Таким образом, на платформах с ограниченными ресурсами не пришлось бы тащить весь runtime. Во-вторых, это дало бы возможность появлению компиляторов с \"урезанной\" реализацией, которые декларировали бы поддержку только конкретных уровней.\r\n\r\nЭто совсем сырая идея, так что какой либо конкретики, вроде количество уровней, распределение функционала по ним, необходимость реализации для самого языка и т.д., у меня нет.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/419/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/419/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/418", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/418/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/418/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/418/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/418", + "id": 849270068, + "node_id": "MDU6SXNzdWU4NDkyNzAwNjg=", + "number": 418, + "title": "constexpr std::strlen(const char*)", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815256097, + "node_id": "MDU6TGFiZWwyODE1MjU2MDk3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%92%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5", + "name": "В работе", + "color": "FBCA04", + "default": false, + "description": "Над идеей идёт активная работа в рамках РГ21" + } + ], + "state": "open", + "locked": false, + "assignee": { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + }, + "assignees": [ + { + "login": "Neargye", + "id": 7997966, + "node_id": "MDQ6VXNlcjc5OTc5NjY=", + "avatar_url": "https://avatars.githubusercontent.com/u/7997966?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Neargye", + "html_url": "https://github.com/Neargye", + "followers_url": "https://api.github.com/users/Neargye/followers", + "following_url": "https://api.github.com/users/Neargye/following{/other_user}", + "gists_url": "https://api.github.com/users/Neargye/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Neargye/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Neargye/subscriptions", + "organizations_url": "https://api.github.com/users/Neargye/orgs", + "repos_url": "https://api.github.com/users/Neargye/repos", + "events_url": "https://api.github.com/users/Neargye/events{/privacy}", + "received_events_url": "https://api.github.com/users/Neargye/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": null, + "comments": 3, + "created_at": "2021-04-02T15:04:57Z", + "updated_at": "2021-04-11T19:57:31Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +16, -0\r\n_Автор идеи:_ **Yuriy Chernyshov**\r\n\r\nПо факту многие современные компиляторы имеют функцию __builtin_strlen, которая является constexpr.\r\nНужно только закрепить эту возможность в стандарте.\r\n\r\nНа ::strlen такие требования наложить, понятно, не получится.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/418/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/418/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/417", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/417/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/417/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/417/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/417", + "id": 849269131, + "node_id": "MDU6SXNzdWU4NDkyNjkxMzE=", + "number": 417, + "title": "Нужны перегрузки для std::string_view для функций std::atoXX, std::stoXX", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035671, + "node_id": "MDU6TGFiZWwyODE1MDM1Njcx", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/duplicate", + "name": "duplicate", + "color": "cfd3d7", + "default": true, + "description": "This issue or pull request already exists" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-02T15:03:11Z", + "updated_at": "2021-04-02T15:04:13Z", + "closed_at": "2021-04-02T15:04:08Z", + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +8, -0\r\n_Автор идеи:_ **Ivan Kalinin**\r\n\r\nВ текущей реализации функций std::atoXX требуют, чтобы переданная строка завершалась 0, что часто не подходит для std::string_view. В то же время есть std::stoXX, но для их использования надо создавать целый объект std::string, что не очень эффективно.", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/417/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/417/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/416", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/416/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/416/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/416/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/416", + "id": 849267742, + "node_id": "MDU6SXNzdWU4NDkyNjc3NDI=", + "number": 416, + "title": "C++ ML", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815551289, + "node_id": "MDU6TGFiZWwyODE1NTUxMjg5", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%20%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D0%BE%D0%BC", + "name": "Помощь советом", + "color": "FEF2C0", + "default": false, + "description": "Идея прорабатывается другими участниками международного коммитета" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-02T15:00:31Z", + "updated_at": "2021-04-02T15:00:54Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +2, -7\r\n_Автор идеи:_ **artur1ivanov**\r\n\r\nДобавить machine learning в C++ . Например в виде добавления этой либы mlpack.org", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/416/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/416/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/415", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/415/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/415/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/415/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/415", + "id": 849256316, + "node_id": "MDU6SXNzdWU4NDkyNTYzMTY=", + "number": 415, + "title": "добавить constexpr как модификатор для аргументов функции", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815035671, + "node_id": "MDU6TGFiZWwyODE1MDM1Njcx", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/duplicate", + "name": "duplicate", + "color": "cfd3d7", + "default": true, + "description": "This issue or pull request already exists" + } + ], + "state": "closed", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 2, + "created_at": "2021-04-02T14:39:32Z", + "updated_at": "2021-04-02T14:59:33Z", + "closed_at": "2021-04-02T14:59:27Z", + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +22, -0\r\n_Автор идеи:_ **Юра Левченко**\r\n\r\nОчень часто мы имеем легаси код, где аргументы функции известны на этапе компиляции, и мы можем компилятору подсказать об этом.\r\n\r\nРасмотрим небольшой пример: \r\n```cpp\r\ntest(a, 0);\r\ntest(a, 1);\r\ntest(a, 2);\r\n\r\nint test( int a, constexpr int flag )\r\n{\r\n switch( flag )\r\n {\r\n case 0:\r\n return a + 1;\r\n case 1:\r\n return a - 1;\r\n case 2:\r\n return -a;\r\n default:\r\n return 0;\r\n }\r\n}\r\n```\r\nесли второй параметр задать как constexpr, то можно на этапе компиляции создать 3 функции, по аналогии\r\n```cpp\r\ntest<0>(a);\r\ntest<1>(a);\r\ntest<2>(a);\r\n\r\ntemplate\r\nint test( int a )\r\n{\r\n switch( flag )\r\n {\r\n case 0:\r\n return a + 1;\r\n case 1:\r\n return a - 1;\r\n case 2:\r\n return -a;\r\n default:\r\n return 0;\r\n }\r\n}\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/415/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/415/timeline", + "performed_via_github_app": null, + "state_reason": "completed" + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/414", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/414/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/414/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/414/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/414", + "id": 849253736, + "node_id": "MDU6SXNzdWU4NDkyNTM3MzY=", + "number": 414, + "title": "Поддержать P1427R0 (Concerns about module toolability)", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815551289, + "node_id": "MDU6TGFiZWwyODE1NTUxMjg5", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%20%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D0%BE%D0%BC", + "name": "Помощь советом", + "color": "FEF2C0", + "default": false, + "description": "Идея прорабатывается другими участниками международного коммитета" + } + ], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-02T14:34:44Z", + "updated_at": "2021-04-02T14:37:56Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +1, -0\r\n_Автор идеи:_ **Сергей Прейс**\r\n\r\nПринятые в C++20 модули в том виде, в котором они сейчас зафиксированы создадут кучу проблем системам сборки и могут вызвать фрагментирование на уровне систем сборки (проект сможет собираться одной системой сборки, но не сможет быть адаптирован под другую). В P1427R0 приведён целый ряд проблем и предложены разумные решения. Я предлагаю поддержать это выступление.\r\n\r\nВкратце смысл https://wg21.link/P1427R0 таков:\r\n\r\nДля следующих проблем должны быть так или иначе предложены решения в стандарте на C++ модули.\r\n\r\n1. Мапирование модулей на исходный код. Система сборки должна иметь возможность быстро и однозначно понять где расположен импортируемый модуль в файловой системе. Без этого будет очень сложно сделать эффективное перестроение по зависимостям. Как пример плохих модулей (как в C++ сейчас приводится FORTRAN 90 [1]). Хорошие модули, например, в Go.\r\n\r\n2. Производительность параллельной сборки. Хотя кажется, что модули улучшают время компиляции в больших проектах, где без параллельной компиляции не обойтись, модули могут замедлять сборку. Сборка С/С++ сейчас очень хорошо масштабируется, с модулями это свойство теряется. Небольшое исследование этой проблемы есть в [2]\r\n\r\n3. Импорт или иклуд: из-за нетривиальных требований к структуре модуляризированного кода и отличии этой структуры от обычного (legacy) кода системе сборки очень сложно понять есть ли у файла модульные (не текстовые) зависимости. Системе сборки придётся обрабатывать худший случай и прекомпилировать код, даже если это полностью обычный (legacy) код.\r\n\r\nПредлагается:\r\n\r\n- Ревью модулей в SG-15 (the Tooling Study group ))\r\n\r\n- Стандартизация связывания модулей с файлами\r\n\r\n- Упрощение синтаксиса импортов\r\n\r\n- Дать возможность производителям инструментов попробовать поддержать модули и прислушаться к их мнению", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/414/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/414/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/413", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/413/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/413/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/413/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/413", + "id": 849251761, + "node_id": "MDU6SXNzdWU4NDkyNTE3NjE=", + "number": 413, + "title": "Починить std::invoke_result_t", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [ + { + "id": 2815256097, + "node_id": "MDU6TGFiZWwyODE1MjU2MDk3", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/%D0%92%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5", + "name": "В работе", + "color": "FBCA04", + "default": false, + "description": "Над идеей идёт активная работа в рамках РГ21" + }, + { + "id": 3771028573, + "node_id": "LA_kwDOFK7cns7gxVRd", + "url": "https://api.github.com/repos/cpp-ru/ideas/labels/C++23-ru-comment", + "name": "C++23-ru-comment", + "color": "21DB3A", + "default": false, + "description": "Идея, которую можно попробовать отправить коментарием от страны к C++23" + } + ], + "state": "open", + "locked": false, + "assignee": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "assignees": [ + { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + } + ], + "milestone": null, + "comments": 2, + "created_at": "2021-04-02T14:30:57Z", + "updated_at": "2022-01-27T06:34:36Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +3, -0\r\n_Автор идеи:_ **Дмитрий**\r\n\r\nВ шаблоне-псевдониме std::invoke_result_t есть ошибка, из-за которой он не всегда работает там, где работает обычная std::invoke_result. Хотя, очевидно, они должны быть полностью взаимозаменяемы.\r\n\r\nСуть проблемы:\r\n```cpp\r\n#include \r\n\r\n// Мы знаем, что {Xs...} == {F, Args...}, но не хотим упоминать F явно.\r\ntemplate \r\nvoid f (Xs...)\r\n{\r\n // Всё работает.\r\n using good = typename std::invoke_result::type;\r\n // Ошибка компиляции.\r\n using bad = std::invoke_result_t; // !\r\n}\r\n\r\nstruct call\r\n{\r\n int operator () () const\r\n {\r\n return 0;\r\n }\r\n};\r\n\r\nint main()\r\n{\r\n f(call{});\r\n}\r\n```\r\nПолучается, что псевдоним std::invoke_result_t нарушает \"сигнатуру\" оригинальной метафункции std::invoke_result, ломая тем самым вполне корректный код.\r\n\r\nДумаю, что правильная реализация будет выглядеть так:\r\n```cpp\r\n// Правильно.\r\ntemplate \r\nusing invoke_result_t = typename std::invoke_result::type;\r\n```\r\nА текущая реализация ошибочна:\r\n```cpp\r\n// Неправильно.\r\ntemplate \r\nusing invoke_result_t = typename std::invoke_result::type;\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/413/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/413/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/412", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/412/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/412/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/412/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/412", + "id": 849249095, + "node_id": "MDU6SXNzdWU4NDkyNDkwOTU=", + "number": 412, + "title": "std::initializer_list должен быть применим к move-only объектам", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-02T14:25:59Z", + "updated_at": "2021-04-02T14:29:26Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +7, -0\r\n_Автор идеи:_ **Евгений Гагауз**\r\n\r\nЛегко продемонстрировать ограничение применимости класса std::initializer_list на простом примере инициализации вектора move-only объектов:\r\n```cpp\r\n#include \r\n\r\nstruct MoveOnly {\r\n MoveOnly() = default;\r\n MoveOnly(MoveOnly&&) = default;\r\n};\r\n\r\nstd::vector vec = {MoveOnly()};\r\n```", + "reactions": { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/412/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/cpp-ru/ideas/issues/412/timeline", + "performed_via_github_app": null, + "state_reason": null + }, + { + "url": "https://api.github.com/repos/cpp-ru/ideas/issues/411", + "repository_url": "https://api.github.com/repos/cpp-ru/ideas", + "labels_url": "https://api.github.com/repos/cpp-ru/ideas/issues/411/labels{/name}", + "comments_url": "https://api.github.com/repos/cpp-ru/ideas/issues/411/comments", + "events_url": "https://api.github.com/repos/cpp-ru/ideas/issues/411/events", + "html_url": "https://github.com/cpp-ru/ideas/issues/411", + "id": 849245865, + "node_id": "MDU6SXNzdWU4NDkyNDU4NjU=", + "number": 411, + "title": "std::type_fn и std::value_fn для работы с std:type_identity в value-based контексте", + "user": { + "login": "apolukhin", + "id": 1700098, + "node_id": "MDQ6VXNlcjE3MDAwOTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/1700098?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/apolukhin", + "html_url": "https://github.com/apolukhin", + "followers_url": "https://api.github.com/users/apolukhin/followers", + "following_url": "https://api.github.com/users/apolukhin/following{/other_user}", + "gists_url": "https://api.github.com/users/apolukhin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/apolukhin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/apolukhin/subscriptions", + "organizations_url": "https://api.github.com/users/apolukhin/orgs", + "repos_url": "https://api.github.com/users/apolukhin/repos", + "events_url": "https://api.github.com/users/apolukhin/events{/privacy}", + "received_events_url": "https://api.github.com/users/apolukhin/received_events", + "type": "User", + "site_admin": false + }, + "labels": [], + "state": "open", + "locked": false, + "assignee": null, + "assignees": [], + "milestone": null, + "comments": 1, + "created_at": "2021-04-02T14:19:56Z", + "updated_at": "2021-04-02T14:21:35Z", + "closed_at": null, + "author_association": "MEMBER", + "active_lock_reason": null, + "body": "_Перенос предложения:_ голоса +0, -0\r\n_Автор идеи:_ **Олег Фатхиев**\r\n\r\nПредлагается добавить std::type_fn и std::value_fn для оборачивания метафункций в constexpr функторы, которые в качестве аргументов используют std::type_identity\r\n\r\nЧтобы следовать тенденции комитита относительно метапрограммирования в сторону value-based подхода, предлагается как можно раньше добавить следующие сущности:\r\n```cpp\r\ntemplate