{"id":483755,"date":"2026-06-16T06:01:21","date_gmt":"2026-06-16T06:01:21","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=483755"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=483755","title":{"rendered":"\u041d\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0430\u0440\u043a\u043e\u0432\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u0438"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>(\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435. \u0421\u043c. <a href=\"https:\/\/habr.com\/ru\/articles\/1046688\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/a>, \u0433\u0434\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043a\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043c\u0430\u0440\u043a\u043e\u0432\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0444\u043c\u0430\u0445 &#171;\u043d\u0430 \u0431\u0443\u043c\u0430\u0436\u043a\u0435&#187;).<\/p>\n<p>\u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u041d\u0410\u041c &#8212; \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0444\u043c\u044b \u041c\u0430\u0440\u043a\u043e\u0432\u0430<\/p>\n<\/li>\n<li>\n<p>\u041a\u0422 &#8212; \u043a\u043e\u043c\u043f\u0430\u0439\u043b-\u0442\u0430\u0439\u043c<\/p>\n<\/li>\n<li>\n<p>\u0420\u0422 &#8212; \u0440\u0430\u043d\u0442\u0430\u0439\u043c<\/p>\n<\/li>\n<\/ul>\n<h2>\u041a\u0430\u043a\u0438\u0435 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441 \u0436\u0434\u0443\u0442?<\/h2>\n<p>\u042f \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u041d\u0410\u041c \u0432 \u041a\u0422 &#8212; \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e \u0437\u0432\u0451\u0437\u0434\u043e\u0447\u043a\u043e\u0439.<\/p>\n<p>\u0427\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0433\u0435\u0440\u043e\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u0442\u044c, \u0438 \u043e \u0447\u0451\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435?<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a05\/d75\/7c9\/a05d757c94a407f948666f408cb8af6c.png\" width=\"924\" height=\"452\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a05\/d75\/7c9\/a05d757c94a407f948666f408cb8af6c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a05\/d75\/7c9\/a05d757c94a407f948666f408cb8af6c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>\u041f\u0435\u0440\u0432\u043e\u0435 \u0438 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435: \u0441\u0442\u0440\u043e\u043a\u0438<\/h4>\n<p>\u0425\u043e\u0442\u044f <code>std::string<\/code> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u041a\u0422, \u043d\u043e \u0441 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430\u043c\u0438. \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u041a\u0422-\u0420\u0422.<\/p>\n<pre><code class=\"cpp\">constexpr std::string make(bool small) {  if (small)    return \"short\"; \/\/ small object optimization  else    return \"long enough string that needs allocation\"; \/\/ new char[]}constexpr auto s = make(true);constexpr auto l = make(false); \/\/ \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438static_assert(make(true) != \"\");static_assert(make(false) != \"\"); \/\/ \u043e\u043a. \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u041a\u0422 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043a\u0443\u0447\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0445\u043d\u0443\u0442\u044c \u0432\u0441\u044e \u041d\u0410\u041c-\u043c\u0430\u0448\u0438\u043d\u0443, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0432\u043d\u0443\u0442\u0440\u044c constexpr-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a-\u0442\u043e<\/p>\n<pre><code class=\"cpp\">constexpr auto run(std::string data) {  \/\/ \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0445\u043e\u0442\u044c \u0441 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0435\u0439, \u0445\u043e\u0442\u044c \u0431\u0435\u0437...  const auto program = RULES(RULE(\"a\", \"b\"), FINAL_RULE(\"c\", \"D\"), RULE(\"e\", \"f\"));  const auto machine = MACHINE(program);  \/\/ \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 - \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0441 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0435\u0439  std::string result = machine(data);  return result;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0443 \u0438 \u0447\u0442\u043e \u043c\u044b \u0441 \u044d\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0430\u0435\u043c? \u0422\u043e\u043b\u044c\u043a\u043e \u0432 static_assert \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c? \u0410 \u0435\u0441\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443, \u0442\u043e \u0438\u0437-\u0437\u0430 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 constexpr, \u0438 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0420\u0422-\u0432\u044b\u0437\u043e\u0432, \u043f\u0443\u0441\u0442\u044c \u0438 \u0434\u043e main().<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0431\u044b \u0447\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u041a\u0422.<\/p>\n<p>\u041d\u043e \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 &#8212; \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u043d\u0438\u0445 \u0440\u0430\u0437\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430, &#8212; \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u043e\u0438\u0441\u043a\u0430-\u0437\u0430\u043c\u0435\u043d\u044b, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u044d\u0442\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, &#8212; \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b.<\/p>\n<p>\u041e\u0442\u0441\u044e\u0434\u0430 \u0432\u044b\u0442\u0435\u043a\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h4>\u0412\u0442\u043e\u0440\u043e\u0435: \u0446\u0438\u043a\u043b\u044b \u043d\u0430\u0434 \u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438<\/h4>\n<p>\u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0432 constexpr-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0435\u0441\u0442\u044c \u0438 for, \u0438 while. \u041d\u043e, \u043a\u0430\u043a \u0438 \u0432 \u0420\u0422, \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438 \u0441 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438.<\/p>\n<pre><code class=\"cpp\">constexpr int table[] = {1, 2, 3, 4, 5};constexpr int sum() {    int s = 0;    for (auto t : table) s += t;    return s;}constexpr int countdown(int n) {    int s = 0;    while (n--) s += n;    return s;}\/\/ \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 - \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u041a\u0422, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0442\u0438\u043f\u0430\u0445\/\/ (\u0437\u0434\u0435\u0441\u044c - \u0432 \u0434\u043b\u0438\u043d\u0430\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432)int a[sum()];int b[countdown(10)];<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u041d\u0410\u041c, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0438\u0437 \u043f\u0440\u0430\u0432\u0438\u043b \u0441 \u043d\u0435\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, &#8212; \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u0430\u044f.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0446\u0438\u043a\u043b\u043e\u0432 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.\u00a0<strong>\u0418 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e!<\/strong><\/p>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442<\/p>\n<h4>\u0422\u0440\u0435\u0442\u044c\u0435: \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438<\/h4>\n<p>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0432 \u041a\u0422 &#8212; \u044d\u0442\u043e \u0446\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u0411\u0443\u0434\u044c \u0442\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u0442\u0438\u043f\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u0438\u043b\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f constexpr-\u0444\u0443\u043d\u043a\u0446\u0438\u044f  <\/p>\n<pre><code class=\"cpp\">template&lt;int N&gt; struct deep_type : deep_type&lt;N-1&gt; {};template&lt;&gt; struct deep_type&lt;0&gt; {};constexpr int deep_call(int n) {    if (n == 0) return 0;    else return deep_call(n-1);}\/\/ \u0434\u043e\u0438\u0433\u0440\u0430\u0435\u043c\u0441\u044f \u0434\u043e \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 (\u0438 \u0441\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u043d\u0435 \u0434\u043e ICE)using D = deep_type&lt;1000&gt;;constexpr int d = deep_call(1000);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430, \u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438, \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u0443 \u0433\u043b\u0443\u0431\u0438\u043d\u0443, &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 gcc \u044d\u0442\u043e <code>-fconstexpr-depth=<em>N<\/em><\/code> \u0438 <code>-ftemplate-depth=<em>N<\/em><\/code> . \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 \u0440\u0438\u0441\u043a\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0442\u0435\u043a.<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u043c\u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u043e\u0432.<\/p>\n<h4>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435: \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u041a\u0422 \u0438 \u0420\u0422<\/h4>\n<p>\u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0435\u0442\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 constexpr-\u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0420\u0422 \u0438 \u0441 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u043e\u0432\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 (\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u043c\u0438 \u043b\u043e\u0433\u0438\u043a\u0443 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f) \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e. \u041d\u0430\u0434\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0410 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u041a\u0422-\u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0420\u0422 &#8212; \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0441\u0442\u043e. \u041d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435.<\/p>\n<h4>\u041d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435: \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432<\/h4>\n<p>\u0422\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0418 \u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 (\u043a\u0430\u0436\u0434\u043e\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u043a, \u0430 \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 &#8212; \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u0440\u0430\u0432\u0438\u043b, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442). \u0418 &#8212; \u044d\u0442\u043e \u044f \u0443\u0436\u0435 \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u0443\u044e &#8212; \u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u0430\u044f \u0430\u0443\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439.<\/p>\n<p>\u0414\u0430 \u0438 \u0432\u0441\u044f\u043a\u0438\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0442\u043e\u0436\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0435.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044f\u0437\u044b\u043a \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 C++ \u043d\u0435\u043e\u0431\u044b\u0447\u0430\u0439\u043d\u043e \u0441\u043b\u0430\u0431\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d, \u043f\u043e\u0447\u0442\u0438 \u043a\u0430\u043a \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u043d\u043e \u044d\u0442\u043e, \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0434\u0430\u0451\u0442 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u043d\u0435\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c (&#171;\u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 T? \u0430 \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 auto?&#187;) \u0438 \u043e\u0448\u0438\u0431\u043a\u043e\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c (\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u043c \u043f\u043e\u0440\u0442\u044f\u043d\u043a\u0430\u043c \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438).<\/p>\n<p>\u0422\u0443\u0442 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043f\u0443\u0442\u0438:<\/p>\n<ol>\n<li>\n<p>\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0435\u0437\u0434\u0435 auto \/ class \u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u0435_\u043c\u043d\u0435\u043c\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435_\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u0438 \u0431\u043b\u044e\u0441\u0442\u0438 \u0447\u0438\u0441\u0442\u043e\u0442\u0443 \u0440\u0443\u043a<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><strong>\u043a\u043e\u043d\u0446\u0435\u043f\u0442\u044b<\/strong><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cpp\">\/\/ \u043f\u0443\u0441\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043c\u0435\u044e\u0442 \u0434\u0435\u043b\u043e \u0441 \u0442\u0438\u043f\u0430\u043c\u0438, \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430template&lt;size_t N&gt; struct str { ..... };\/\/ \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u0442\u044ctemplate&lt;class S&gt; struct foo { ..... };auto bar(auto s) { ..... }\/\/ \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0443\u0442\u044ctemplate&lt;class&gt; struct foo;template&lt;size_t N&gt; struct foo&lt;str&lt;N&gt;&gt; { using S=str&lt;N&gt;; ..... };template&lt;size_t N&gt; auto bar(str&lt;N&gt; s) { ..... }\/\/ \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u0443\u0442\u044ctemplate&lt;class T&gt; concept Str = .....; \/\/ true \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f str&lt;N&gt;template&lt;Str S&gt; struct foo { ..... };Str auto bar(Str s) { ..... } \/\/ \u0437\u0430\u043e\u0434\u043d\u043e \u0438 \u0442\u0438\u043f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043c\u043e\u0436\u0435\u043c \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u0434\u043e str&lt;N1&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<hr\/>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0446\u0438\u043a\u043b\u044b \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0441\u0442\u0440\u043e\u043a, \u0441\u0442\u0440\u043e\u043a\u0438 &#8212; \u043e\u0442 \u0442\u0438\u043f\u043e\u0432, \u0430 \u0442\u0438\u043f\u044b &#8212; \u043e\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u043e\u0432, &#8212; \u043a\u043e\u0442\u0451\u043d\u043e\u043a \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0413\u0430\u0432 \u043d\u0430\u0447\u043d\u0451\u0442 \u0441\u043f\u0443\u0441\u043a \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\u043a\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0438\u0445.<\/p>\n<h2>\u041a\u043e\u043d\u0446\u0435\u043f\u0442\u044b<\/h2>\n<p>\u041a\u043e\u043d\u0446\u0435\u043f\u0442\u043e\u0432 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e. \u041f\u0440\u0438\u0447\u0451\u043c \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u044b \u0442\u043e\u0436\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0440\u0443\u043a\u0430\u043c\u0438, \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u043d\u0430\u0431\u043e\u0440 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u041a\u043e\u043d\u0446\u0435\u043f\u0442 \u0437\u0430\u0434\u0430\u0451\u0442 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e<\/p>\n<ul>\n<li>\n<p>&#171;\u0442\u0438\u043f T \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0443 F&#187;<\/p>\n<\/li>\n<li>\n<p>&#171;\u0442\u0438\u043f T \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 W \u043d\u0430\u0434 \u0442\u0438\u043f\u043e\u043c U&#187;<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u0438\u0447\u0451\u043c \u0442\u0438\u043f U \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c, \u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043a\u043e\u0435\u043c\u0443 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0443.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b &#8212; \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c <strong>\u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432<\/strong> \u0432 \u0441\u0432\u044f\u0437\u043a\u0435: \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430 + \u043f\u043e\u043c\u0435\u0442\u043a\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u0430\u043a \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u0439 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0443 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430.<\/p>\n<pre><code class=\"cpp\">CONCEPT(FooBar);\/\/ \u043e\u0431\u044f\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0442 FooBar \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u043e\u0431\u0432\u044f\u0437\u043a\u0443 \u0434\u043b\u044f \u043d\u0435\u0433\u043e,\/\/ \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u044e is_FooBar, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0438\u0436\u0435struct foo {    REPRESENTS(FooBar)};struct bar {    REPRESENTS(FooBar)};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f, \u0442\u043e \u043e\u043d\u0430 \u0441\u0430\u043c\u0430 \u0443\u0436\u0435 \u0437\u0430\u0434\u0430\u0451\u0442 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432 &#8212; \u0432\u043e\u043f\u043b\u043e\u0449\u0435\u043d\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0430. \u041d\u043e \u0432 C++ \u043d\u0435\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 &#171;\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438&#187; \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442. \u0415\u0441\u0442\u044c \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<pre><code class=\"cpp\">template&lt;class U&gt; struct buz {.....}; \/\/ \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e buztemplate&lt;class U&gt; void f(buz&lt;U&gt; arg);template&lt;class T&gt; struct xyz;template&lt;class U&gt; struct xyz&lt;buz&lt;U&gt;&gt; {.....};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u043e\u0436\u0435\u043c \u0440\u0443\u043a\u0430\u043c\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0442<\/p>\n<pre><code class=\"cpp\">\/\/ \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u0430 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442template&lt;class T&gt; constexpr bool is_Buz_v = false;template&lt;class U&gt; constexpr bool is_Buz_v&lt;buz&lt;U&gt;&gt; = true;template&lt;class T&gt; concept Buz = is_Buz_v&lt;T&gt;;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0440\u043e\u0434\u0435.<\/p>\n<p>\u041d\u043e \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443\u00a0<code>BuzOfType&lt;bar&gt;<\/code>\u00a0\u0438 \u0434\u0430\u0436\u0435\u00a0<code>BuzOfFamily&lt;FooBar&gt;<\/code>&#8230;<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, &#8212; \u0435\u0441\u0442\u044c, \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043d\u0430\u0431\u043e\u0440 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438 \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0439.<\/p>\n<pre><code class=\"cpp\">CONCEPT_WITH_TYPE(Buz)\/\/ \u043e\u0431\u044a\u044f\u0432\u0438\u043b \u0441\u0440\u0430\u0437\u0443 \u0442\u0440\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430\/\/ Buz&lt;T&gt;\/\/ BuzOfType&lt;T, U&gt;   \u0433\u0434\u0435 U - \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f\/\/ BuzOfTraits&lt;T, C&gt; \u0433\u0434\u0435 C - \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0442\u0438\u043f\u0430template&lt;class T&gt; struct buz {    REPRESENTS(Buz);    using type = T; \/\/ CONCEPT_WITH_TYPE \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 T \u0431\u044b\u043b \u0437\u0430\u043f\u0438\u0441\u0430\u043d \u0432 \u0438\u043c\u044f type};using buz_of_foo = buz&lt;foo&gt;;static_assert(Buz&lt;buz_of_foo&gt;);static_assert(BuzOfType&lt;buz_of_foo, foo&gt;);         \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 U == foostatic_assert(BuzOfTraits&lt;buz_of_foo, is_FooBar&gt;); \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 is_FooBar&lt;foo&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c,<\/p>\n<h4>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u044b<\/h4>\n<p>\u041a\u043e\u043d\u0446\u0435\u043f\u0442 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0442 \u043a \u0442\u0438\u043f\u0443 \u043f\u043b\u044e\u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c, &#8212; \u0442\u043e \u0435\u0441\u0442\u044c, \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u0434 \u0431\u0443\u043b\u0435\u0432\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043d\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430).<\/p>\n<p>\u0418 \u0432\u043e\u043e\u0431\u0449\u0435, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/p>\n<ul>\n<li>\n<p>\u0442\u0438\u043f\u044b (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0430\u043b\u0438\u0430\u0441\u044b)<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0442\u0438\u043f\u043e\u0432 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0430\u043b\u0438\u0430\u0441\u043e\u0432)<\/p>\n<\/li>\n<\/ul>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 (is_FooBar_v) &#8212; \u043d\u0435\u043b\u044c\u0437\u044f. \u0410 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u043a\u043e\u043d\u0446\u0435\u043f\u0442 (FooBar).<\/p>\n<p>\u041d\u043e \u0432 \u043c\u0435\u0442\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0451\u043c\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430-\u043e\u0431\u0451\u0440\u0442\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0451 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u0430\u043b\u0438\u0430\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a\u0443\u0434\u0430 \u0445\u043e\u0447\u0435\u0442 \u043a\u0430\u043a \u0445\u043e\u0447\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430, \u0430 \u0442\u0438\u043f-\u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, &#8212; \u0442\u043e\u0433\u0434\u0430 \u0430\u043b\u0438\u0430\u0441 \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0442 \u0442\u0438\u043f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u043e<\/p>\n<pre><code class=\"cpp\">template&lt;class T&gt; concept FooBar = ......;\/\/ DEFINE_TYPECHECKER(FooBar)template&lt;class T&gt; constexpr bool is_FooBar_v = FooBar&lt;T&gt;;template&lt;class T&gt; using is_FooBar = std::bool_constant&lt;FooBar&lt;T&gt;&gt;;\/\/ \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u043e\u0432 BuzOf...template&lt;class T, class U&gt;concept BuzOfType = Buz&lt;T&gt; &amp;&amp; HasTypeOfType&lt;T, U&gt;;template&lt;class T, template&lt;class&gt;class C&gt;concept BuzOfTraits = Buz&lt;T&gt; &amp;&amp; HasTypeOfTraits&lt;T, C&gt;;\/\/ \u0433\u0434\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u044b, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f T::typetemplate&lt;class T, class U&gt;concept HasTypeOfType = std::same_as&lt;typename std::remove_cvref_t&lt;T&gt;::type, U&gt;;template&lt;class T, template&lt;class&gt;class C&gt;concept HasTypeOfTraits = C&lt;typename std::remove_cvref_t&lt;T&gt;::type&gt;::value;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041a\u0430\u043a \u043d\u0430\u0441\u0435\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044f\u043c\u0438<\/h4>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u044f\u0441\u043d\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u044b\u0431\u0440\u0430\u043b \u0434\u0438\u0437\u0430\u0439\u043d \u0441 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c <code>REPRESENTS<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<p>\u041f\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u0447\u0451\u0442\u0443, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 &#8212; \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0438 \u0441\u043d\u0430\u0440\u0443\u0436\u0438.<\/p>\n<p>\u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c (\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0435\u043b\u0438\u0442\u044c \u043a \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, int). \u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f, \u0442\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0442\u0438\u043f\u0430 \u0432\u0435\u0441\u044c\u043c\u0430 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u043c:<\/p>\n<pre><code class=\"cpp\">template&lt;class T&gt; constexpr bool is_FooBar_v = false;  \/\/ \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u0443template&lt;class T&gt; concept FooBar = is_FooBar_v&lt;T&gt;;template&lt;class X, int N, auto Something&gt;struct ohoho { ..... };\/\/ \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430template&lt;class X, int N, auto Something&gt;constexpr bool is_FooBar_v&lt;ohoho&lt;X, N, Something&gt;&gt; = true;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0442\u0430\u043c \u0435\u0449\u0451 \u043a\u043e\u0435-\u043a\u0430\u043a\u0438\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0432\u044b\u043b\u0435\u0437\u0430\u044e\u0442, \u0434\u0430\u0436\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f ODR.<\/p>\n<p>\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0431\u0435\u0437 \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043f\u0438\u0441\u0430\u043d\u0438\u043d\u044b.<\/p>\n<p>\u0410 REPRESENTS \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e)<\/p>\n<pre><code class=\"cpp\">\/\/ \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0442\u044d\u0433struct FooBar_concept_probe{};\/\/ \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0442template&lt;class T&gt; concept FooBar =    requires { std::remove_cvref_t&lt;T&gt;::represents_concept(FooBar_concept_probe{}); };\/\/ \u0432\u043d\u043e\u0441\u0438\u043c \u043c\u0435\u0442\u043a\u0443 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443template&lt;class X, int N, auto Something&gt;struct ohoho {    static void represents_concept(FooBar_concept_probe) {};};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432. \u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e REPRESENTS.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u044f \u043f\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u0442\u044d\u0433\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c, \u0430 \u043d\u0435 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u044b \u0438 \u0438\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\u0445 \u0438\u043c\u0451\u043d.<\/p>\n<pre><code class=\"cpp\">namespace ns1 { CONCEPT(FooBar) }namespace ns2 {  struct foo {    REPRESENTS(ns1::FooBar)  };}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u043d\u0446\u0435\u043f\u0442, \u043d\u0430\u0441\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<pre><code>template&lt;class T&gt; concept ArbitraryFamily = \/* \u0434\u0435\u043b\u0430\u0435\u043c, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u043c *\/;DEFINE_TYPECHECKER(ArbitraryFamily)\/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 is_ArbitraryFamily \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043c\u043e\u0438\u043c\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430\u043c\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u0438 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0432\u0441\u0451, \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430\u043c\u0438.<\/p>\n<h4>\u041a\u0430\u043a \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438?<\/h4>\n<p>\u041a\u043e\u043d\u0446\u0435\u043f\u0442\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 4 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445, \u043a\u0430\u043a \u0448\u0430\u0431\u043b\u043e\u043d \u0431\u0443\u043b\u0435\u0432\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u0432 requires, \u043a\u0430\u043a \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430-\u0442\u0438\u043f\u0430 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435<\/p>\n<\/li>\n<li>\n<p>\u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 auto-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\">static_assert(FooBar&lt;foo&gt; &amp;&amp; !FooBar&lt;int&gt;);foo f();static_assert(requires{ {f()} -&gt; FooBar; });\/\/ \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e foo, \u043d\u043e \u043c\u043e\u0436\u043d\u043e - \"\u0442\u0438\u043f, \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a foo\"\/\/ \u0432\u043e\u0442 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d same_as \u043d\u0430\u0440\u044f\u0434\u0443 \u0441 is_same_vstatic_assert(requires{ {f()} -&gt; std::same_as&lt;foo&gt;; });template&lt;FooBar T&gt; struct foobarwrapper {};\/\/ \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043etemplate&lt;class T&gt; requires FooBar&lt;T&gt; struct foobarwrapper {};void g(FooBar auto x, FooBar auto const&amp; y, FooBar auto&amp;&amp; z);\/\/ \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043etemplate&lt;class X, class Y, class Z&gt;auto g(X x, Y const&amp; y, Z&amp;&amp; z)requires FooBar&lt;X&gt; &amp;&amp; FooBar&lt;Y&gt; &amp;&amp; FooBar&lt;Z&gt;;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0438\u0434\u0438\u0442\u0435, \u0433\u0434\u0435 \u043f\u043e\u0434\u0432\u043e\u0445? \u0415\u0441\u043b\u0438 X \u0438 Y &#8212; \u044d\u0442\u043e \u0442\u0438\u043f\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u043e Z &#8212; \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430.<\/p>\n<p>\u0418, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d FooBar \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443.<\/p>\n<p>\u041f\u0440\u0430\u0432\u0434\u0430, \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 foobarwrapper \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0448\u0438\u0440\u043e\u043a\u0438\u043c: \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 foo \u0438\u043b\u0438 bar \u0442\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c foo&amp; \u0438\u043b\u0438 bar&amp;&amp;.<\/p>\n<p>\u041d\u0443, \u0442\u0443\u0442 \u0443\u0436 \u0432\u044b\u0445\u043e\u0434\u043e\u0432 \u0434\u0432\u0430:<\/p>\n<ul>\n<li>\n<p>\u0438\u043b\u0438 \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u0440\u0443 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u043e\u0432, \u0441\u043a\u0430\u0436\u0435\u043c,<\/p>\n<ul>\n<li>\n<p>FooBarGeneric (\u0432\u0441\u0435\u044f\u0434\u043d\u044b\u0439, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441 auto \/ decltype(auto))<\/p>\n<\/li>\n<li>\n<p>FooBarValue (\u0441\u0442\u0440\u043e\u0433\u043e \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432 foo, bar),<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0442\u0443 \u0440\u0443\u043a \u0438 \u043d\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438<\/p>\n<ul>\n<li>\n<p><code>requires (!std::is_reference_v&lt;T&gt;)<\/code><\/p>\n<\/li>\n<li>\n<p><code>static_assert(!std::is_reference_v&lt;T&gt;)<\/code><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u042f \u043f\u043e\u0448\u0451\u043b \u0432\u0442\u043e\u0440\u044b\u043c, \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0443\u0442\u0451\u043c. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430\u0445 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f <code>std::remove_cvref_t&lt;T&gt;<\/code>.<\/p>\n<hr\/>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0443\u043f\u0435\u043d\u044c\u043a\u0430\u0445 \u043d\u0430\u0441 \u0436\u0434\u0443\u0442 \u0441\u0442\u0440\u043e\u043a\u0438&#8230; \u0418 \u043d\u043e\u0432\u044b\u0435 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438!<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1047886\/\">https:\/\/habr.com\/ru\/articles\/1047886\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>(\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435. \u0421\u043c. \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c, \u0433\u0434\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043a\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043c\u0430\u0440\u043a\u043e\u0432\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0444\u043c\u0430\u0445 &#171;\u043d\u0430 \u0431\u0443\u043c\u0430\u0436\u043a\u0435&#187;).\u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f:\u041d\u0410\u041c &#8212; \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0444\u043c\u044b \u041c\u0430\u0440\u043a\u043e\u0432\u0430\u041a\u0422 &#8212; \u043a\u043e\u043c\u043f\u0430\u0439\u043b-\u0442\u0430\u0439\u043c\u0420\u0422 &#8212; \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u041a\u0430\u043a\u0438\u0435 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441 \u0436\u0434\u0443\u0442?\u042f \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u041d\u0410\u041c \u0432 \u041a\u0422 &#8212; \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e \u0437\u0432\u0451\u0437\u0434\u043e\u0447\u043a\u043e\u0439.\u0427\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0433\u0435\u0440\u043e\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u0442\u044c, \u0438 \u043e \u0447\u0451\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435?\u041f\u0435\u0440\u0432\u043e\u0435 \u0438 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435: \u0441\u0442\u0440\u043e\u043a\u0438\u0425\u043e\u0442\u044f std::string \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u041a\u0422, \u043d\u043e \u0441 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430\u043c\u0438. \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u041a\u0422-\u0420\u0422.constexpr std::string make(bool small) {  if (small)    return &#171;short&#187;; \/\/ small object optimization  else    return &#171;long enough string that needs allocation&#187;; \/\/ new char[]}constexpr auto s = make(true);constexpr auto l = make(false); \/\/ \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438static_assert(make(true) != &#171;&#187;);static_assert(make(false) != &#171;&#187;); \/\/ \u043e\u043a. \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u041a\u0422 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043a\u0443\u0447\u0438\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0445\u043d\u0443\u0442\u044c \u0432\u0441\u044e \u041d\u0410\u041c-\u043c\u0430\u0448\u0438\u043d\u0443, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0432\u043d\u0443\u0442\u0440\u044c constexpr-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a-\u0442\u043econstexpr auto run(std::string data) {  \/\/ \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0445\u043e\u0442\u044c \u0441 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0435\u0439, \u0445\u043e\u0442\u044c \u0431\u0435\u0437&#8230;  const auto program = RULES(RULE(&#171;a&#187;, &#171;b&#187;), FINAL_RULE(&#171;c&#187;, &#171;D&#187;), RULE(&#171;e&#187;, &#171;f&#187;));  const auto machine = MACHINE(program);  \/\/ \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 &#8212; \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0441 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0435\u0439  std::string result = machine(data);  return result;}\u041d\u0443 \u0438 \u0447\u0442\u043e \u043c\u044b \u0441 \u044d\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0430\u0435\u043c? \u0422\u043e\u043b\u044c\u043a\u043e \u0432 static_assert \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c? \u0410 \u0435\u0441\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443, \u0442\u043e \u0438\u0437-\u0437\u0430 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 constexpr, \u0438 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0420\u0422-\u0432\u044b\u0437\u043e\u0432, \u043f\u0443\u0441\u0442\u044c \u0438 \u0434\u043e main().\u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0431\u044b \u0447\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u041a\u0422.\u041d\u043e \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 &#8212; \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u043d\u0438\u0445 \u0440\u0430\u0437\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430, &#8212; \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u043e\u0438\u0441\u043a\u0430-\u0437\u0430\u043c\u0435\u043d\u044b, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u044d\u0442\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, &#8212; \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b.\u041e\u0442\u0441\u044e\u0434\u0430 \u0432\u044b\u0442\u0435\u043a\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u044c.\u0412\u0442\u043e\u0440\u043e\u0435: \u0446\u0438\u043a\u043b\u044b \u043d\u0430\u0434 \u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438\u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0432 constexpr-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0435\u0441\u0442\u044c \u0438 for, \u0438 while. \u041d\u043e, \u043a\u0430\u043a \u0438 \u0432 \u0420\u0422, \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438 \u0441 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438.constexpr int table[] = {1, 2, 3, 4, 5};constexpr int sum() {    int s = 0;    for (auto t : table) s += t;    return s;}constexpr int countdown(int n) {    int s = 0;    while (n&#8212;) s += n;    return s;}\/\/ \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 &#8212; \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u041a\u0422, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0442\u0438\u043f\u0430\u0445\/\/ (\u0437\u0434\u0435\u0441\u044c &#8212; \u0432 \u0434\u043b\u0438\u043d\u0430\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432)int a[sum()];int b[countdown(10)];\u0410 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u041d\u0410\u041c, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0438\u0437 \u043f\u0440\u0430\u0432\u0438\u043b \u0441 \u043d\u0435\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, &#8212; \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u0430\u044f.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0446\u0438\u043a\u043b\u043e\u0432 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.\u00a0\u0418 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e!\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0422\u0440\u0435\u0442\u044c\u0435: \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0432 \u041a\u0422 &#8212; \u044d\u0442\u043e \u0446\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u0411\u0443\u0434\u044c \u0442\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u0442\u0438\u043f\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u0438\u043b\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f constexpr-\u0444\u0443\u043d\u043a\u0446\u0438\u044f  template&lt;int N&gt; struct deep_type : deep_type&lt;N-1&gt; {};template&lt;&gt; struct deep_type&lt;0&gt; {};constexpr int deep_call(int n) {    if (n == 0) return 0;    else return deep_call(n-1);}\/\/ \u0434\u043e\u0438\u0433\u0440\u0430\u0435\u043c\u0441\u044f \u0434\u043e \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 (\u0438 \u0441\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u043d\u0435 \u0434\u043e ICE)using D = deep_type&lt;1000&gt;;constexpr int d = deep_call(1000);\u0414\u0430, \u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438, \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u0443 \u0433\u043b\u0443\u0431\u0438\u043d\u0443, &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 gcc \u044d\u0442\u043e -fconstexpr-depth=N \u0438 -ftemplate-depth=N . \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 \u0440\u0438\u0441\u043a\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0442\u0435\u043a.\u0422\u0430\u043a \u0447\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u043c\u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u043e\u0432.\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435: \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u041a\u0422 \u0438 \u0420\u0422\u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0435\u0442\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 constexpr-\u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0420\u0422 \u0438 \u0441 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u043e\u0432\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 (\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u043c\u0438 \u043b\u043e\u0433\u0438\u043a\u0443 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f) \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e. \u041d\u0430\u0434\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438.\u0410 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u041a\u0422-\u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0420\u0422 &#8212; \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0441\u0442\u043e. \u041d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435.\u041d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435: \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432\u0422\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0418 \u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 (\u043a\u0430\u0436\u0434\u043e\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u043a, \u0430 \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 &#8212; \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u0440\u0430\u0432\u0438\u043b, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442). \u0418 &#8212; \u044d\u0442\u043e \u044f \u0443\u0436\u0435 \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u0443\u044e &#8212; \u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u0430\u044f \u0430\u0443\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439.\u0414\u0430 \u0438 \u0432\u0441\u044f\u043a\u0438\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0442\u043e\u0436\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0435.\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044f\u0437\u044b\u043a \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 C++ \u043d\u0435\u043e\u0431\u044b\u0447\u0430\u0439\u043d\u043e \u0441\u043b\u0430\u0431\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d, \u043f\u043e\u0447\u0442\u0438 \u043a\u0430\u043a \u043b\u044f\u043c\u0431\u0434\u0430-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u043d\u043e \u044d\u0442\u043e, \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0434\u0430\u0451\u0442 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u043d\u0435\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c (&#171;\u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 T? \u0430 \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 auto?&#187;) \u0438 \u043e\u0448\u0438\u0431\u043a\u043e\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c (\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u043c \u043f\u043e\u0440\u0442\u044f\u043d\u043a\u0430\u043c \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438).\u0422\u0443\u0442 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043f\u0443\u0442\u0438:\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0435\u0437\u0434\u0435 auto \/ class \u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u0435_\u043c\u043d\u0435\u043c\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435_\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u0438 \u0431\u043b\u044e\u0441\u0442\u0438 \u0447\u0438\u0441\u0442\u043e\u0442\u0443 \u0440\u0443\u043a\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\u043a\u043e\u043d\u0446\u0435\u043f\u0442\u044b\/\/ \u043f\u0443\u0441\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043c\u0435\u044e\u0442 \u0434\u0435\u043b\u043e \u0441 \u0442\u0438\u043f\u0430\u043c\u0438, \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430template&lt;size_t N&gt; struct str { &#8230;.. };\/\/ \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u0442\u044ctemplate&lt;class S&gt; struct foo { &#8230;.. };auto bar(auto s) { &#8230;.. }\/\/ \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0443\u0442\u044ctemplate&lt;class&gt; struct foo;template&lt;size_t N&gt; struct foo&lt;str&lt;N&gt;&gt; { using S=str&lt;N&gt;; &#8230;.. };template&lt;size_t N&gt; auto bar(str&lt;N&gt; s) { &#8230;.. }\/\/ \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u0443\u0442\u044ctemplate&lt;class T&gt; concept Str = &#8230;..; \/\/ true \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f str&lt;N&gt;template&lt;Str S&gt; struct foo { &#8230;.. };Str auto bar(Str s) { &#8230;.. } \/\/ \u0437\u0430\u043e\u0434\u043d\u043e \u0438 \u0442\u0438\u043f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043c\u043e\u0436\u0435\u043c \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u0434\u043e str&lt;N1&gt;\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0446\u0438\u043a\u043b\u044b \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0441\u0442\u0440\u043e\u043a, \u0441\u0442\u0440\u043e\u043a\u0438 &#8212; \u043e\u0442 \u0442\u0438\u043f\u043e\u0432, \u0430 \u0442\u0438\u043f\u044b &#8212; \u043e\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u043e\u0432, &#8212; \u043a\u043e\u0442\u0451\u043d\u043e\u043a \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0413\u0430\u0432 \u043d\u0430\u0447\u043d\u0451\u0442 \u0441\u043f\u0443\u0441\u043a \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\u043a\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0438\u0445.\u041a\u043e\u043d\u0446\u0435\u043f\u0442\u044b\u041a\u043e\u043d\u0446\u0435\u043f\u0442\u043e\u0432 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e. \u041f\u0440\u0438\u0447\u0451\u043c \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u044b \u0442\u043e\u0436\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0440\u0443\u043a\u0430\u043c\u0438, \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u043d\u0430\u0431\u043e\u0440 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.\u041a\u043e\u043d\u0446\u0435\u043f\u0442 \u0437\u0430\u0434\u0430\u0451\u0442 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e&#187;\u0442\u0438\u043f T \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0443 F&#187;&#187;\u0442\u0438\u043f T \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 W \u043d\u0430\u0434 \u0442\u0438\u043f\u043e\u043c U&#187;\u043f\u0440\u0438\u0447\u0451\u043c \u0442\u0438\u043f U \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c, \u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043a\u043e\u0435\u043c\u0443 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0443.\u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b &#8212; \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435: \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430 + \u043f\u043e\u043c\u0435\u0442\u043a\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u0430\u043a \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u0439 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0443 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430.CONCEPT(FooBar);\/\/ \u043e\u0431\u044f\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0442 FooBar \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u043e\u0431\u0432\u044f\u0437\u043a\u0443 \u0434\u043b\u044f \u043d\u0435\u0433\u043e,\/\/ \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u044e is_FooBar, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0438\u0436\u0435struct foo {    REPRESENTS(FooBar)};struct bar {    REPRESENTS(FooBar)};\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f, \u0442\u043e \u043e\u043d\u0430 \u0441\u0430\u043c\u0430 \u0443\u0436\u0435 \u0437\u0430\u0434\u0430\u0451\u0442 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432 &#8212; \u0432\u043e\u043f\u043b\u043e\u0449\u0435\u043d\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0430. \u041d\u043e \u0432 C++ \u043d\u0435\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 &#171;\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438&#187; \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442. \u0415\u0441\u0442\u044c \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438.template&lt;class U&gt; struct buz {&#8230;..}; \/\/ \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e buztemplate&lt;class U&gt; void f(buz&lt;U&gt; arg);template&lt;class T&gt; struct xyz;template&lt;class U&gt; struct xyz&lt;buz&lt;U&gt;&gt; {&#8230;..};\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u043e\u0436\u0435\u043c \u0440\u0443\u043a\u0430\u043c\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0442\/\/ \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u0430 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442template&lt;class T&gt; constexpr bool is_Buz_v = false;template&lt;class U&gt; constexpr bool is_Buz_v&lt;buz&lt;U&gt;&gt; = true;template&lt;class T&gt; concept Buz = is_Buz_v&lt;T&gt;;\u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0440\u043e\u0434\u0435.\u041d\u043e \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443\u00a0BuzOfType&lt;bar&gt;\u00a0\u0438 \u0434\u0430\u0436\u0435\u00a0BuzOfFamily&lt;FooBar&gt;&#8230;\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, &#8212; \u0435\u0441\u0442\u044c, \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043d\u0430\u0431\u043e\u0440 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438 \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0439.CONCEPT_WITH_TYPE(Buz)\/\/ \u043e\u0431\u044a\u044f\u0432\u0438\u043b \u0441\u0440\u0430\u0437\u0443 \u0442\u0440\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430\/\/ Buz&lt;T&gt;\/\/ BuzOfType&lt;T, U&gt;   \u0433\u0434\u0435 U &#8212; \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f\/\/ BuzOfTraits&lt;T, C&gt; \u0433\u0434\u0435 C &#8212; \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0442\u0438\u043f\u0430template&lt;class T&gt; struct buz {    REPRESENTS(Buz);    using type = T; \/\/ CONCEPT_WITH_TYPE \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 T \u0431\u044b\u043b \u0437\u0430\u043f\u0438\u0441\u0430\u043d \u0432 \u0438\u043c\u044f type};using buz_of_foo = buz&lt;foo&gt;;static_assert(Buz&lt;buz_of_foo&gt;);static_assert(BuzOfType&lt;buz_of_foo, foo&gt;);         \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 U == foostatic_assert(BuzOfTraits&lt;buz_of_foo, is_FooBar&gt;); \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 is_FooBar&lt;foo&gt;\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c,\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u044b\u041a\u043e\u043d\u0446\u0435\u043f\u0442 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0442 \u043a \u0442\u0438\u043f\u0443 \u043f\u043b\u044e\u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c, &#8212; \u0442\u043e \u0435\u0441\u0442\u044c, \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u0434 \u0431\u0443\u043b\u0435\u0432\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043d\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430).\u0418 \u0432\u043e\u043e\u0431\u0449\u0435, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0442\u0438\u043f\u044b (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0430\u043b\u0438\u0430\u0441\u044b)\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b\u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0442\u0438\u043f\u043e\u0432 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0430\u043b\u0438\u0430\u0441\u043e\u0432)\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 (is_FooBar_v) &#8212; \u043d\u0435\u043b\u044c\u0437\u044f. \u0410 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u043a\u043e\u043d\u0446\u0435\u043f\u0442 (FooBar).\u041d\u043e \u0432 \u043c\u0435\u0442\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0451\u043c\u043e\u0432:\u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430-\u043e\u0431\u0451\u0440\u0442\u043a\u0438\u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0451 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u0430\u043b\u0438\u0430\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a\u0443\u0434\u0430 \u0445\u043e\u0447\u0435\u0442 \u043a\u0430\u043a \u0445\u043e\u0447\u0435\u0442\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430, \u0430 \u0442\u0438\u043f-\u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, &#8212; \u0442\u043e\u0433\u0434\u0430 \u0430\u043b\u0438\u0430\u0441 \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0442 \u0442\u0438\u043f.\u0427\u0442\u043e, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u043etemplate&lt;class T&gt; concept FooBar = &#8230;&#8230;;\/\/ DEFINE_TYPECHECKER(FooBar)template&lt;class T&gt; constexpr bool is_FooBar_v = FooBar&lt;T&gt;;template&lt;class T&gt; using is_FooBar = std::bool_constant&lt;FooBar&lt;T&gt;&gt;;\/\/ \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u043e\u0432 BuzOf&#8230;template&lt;class T, class U&gt;concept BuzOfType = Buz&lt;T&gt; &amp;&amp; HasTypeOfType&lt;T, U&gt;;template&lt;class T, template&lt;class&gt;class C&gt;concept BuzOfTraits = Buz&lt;T&gt; &amp;&amp; HasTypeOfTraits&lt;T, C&gt;;\/\/ \u0433\u0434\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u044b, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f T::typetemplate&lt;class T, class U&gt;concept HasTypeOfType = std::same_as&lt;typename std::remove_cvref_t&lt;T&gt;::type, U&gt;;template&lt;class T, template&lt;class&gt;class C&gt;concept HasTypeOfTraits = C&lt;typename std::remove_cvref_t&lt;T&gt;::type&gt;::value;\u041a\u0430\u043a \u043d\u0430\u0441\u0435\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044f\u043c\u0438\u0421\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u044f\u0441\u043d\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u044b\u0431\u0440\u0430\u043b \u0434\u0438\u0437\u0430\u0439\u043d \u0441 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c REPRESENTS \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.\u041f\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u0447\u0451\u0442\u0443, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 &#8212; \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0438 \u0441\u043d\u0430\u0440\u0443\u0436\u0438.\u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c (\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0435\u043b\u0438\u0442\u044c \u043a \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, int). \u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f, \u0442\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0442\u0438\u043f\u0430 \u0432\u0435\u0441\u044c\u043c\u0430 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u043c:template&lt;class T&gt; constexpr bool is_FooBar_v = false;  \/\/ \u043f\u043e \u0434\u0435\u0444\u043e\u043b\u0442\u0443template&lt;class T&gt; concept FooBar = is_FooBar_v&lt;T&gt;;template&lt;class X, int N, auto Something&gt;struct ohoho { &#8230;.. };\/\/ \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430template&lt;class X, int N, auto Something&gt;constexpr bool is_FooBar_v&lt;ohoho&lt;X, N, Something&gt;&gt; = true;\u0418 \u0442\u0430\u043c \u0435\u0449\u0451 \u043a\u043e\u0435-\u043a\u0430\u043a\u0438\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0432\u044b\u043b\u0435\u0437\u0430\u044e\u0442, \u0434\u0430\u0436\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f ODR.\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0431\u0435\u0437 \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043f\u0438\u0441\u0430\u043d\u0438\u043d\u044b.\u0410 REPRESENTS \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e)\/\/ \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0442\u044d\u0433struct&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-483755","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483755","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=483755"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483755\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=483755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=483755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=483755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}