<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Форум 'C/C++' на RSDN</title>
    <link>http://rsdn.org/Forum/cpp/</link>
    <description>Программирование на C++. No VCL, no MFC, pure C++ only.</description>
    <category>cpp</category>
    <language>ru-ru</language>
    <copyright>Copyright ©, RSDN, 2001-2007</copyright>
    <webMaster>forum@rsdn.org</webMaster>
    <generator>RSDN RSS Generator 1.3</generator>
    <image>
      <url>http://rsdn.org/rsdn.gif</url>
      <title>RSDN</title>
      <link>http://rsdn.org</link>
    </image>
    <lastBuildDate>Wed, 30 Sep 2026 18:52:14 GMT</lastBuildDate>
    <ttl>5</ttl>
	<item>
		<title>Корутины C++: как приручить асинхронный I/O</title>
		<link>http://rsdn.org/Forum/cpp/9145935.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/cpp/9145935</guid>
		<comments>http://rsdn.org/Forum/cpp/9145935</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9145935</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9145935</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9145935</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Всем привет!&lt;br /&gt;
&lt;br /&gt;
Анонс статьи не в "прикладном С++", а тут, потому что идёт разбор языковых тонкостей:&lt;br /&gt;
&lt;a class="m" href="https://habr.com/ru/articles/1085348/" target="_blank"&gt;https://habr.com/ru/articles/1085348/&lt;/a&gt;&lt;/div&gt;
				
		</description>
		
		<category>cpp</category>
		<pubDate>Tue, 22 Sep 2026 17:41:21 GMT</pubDate>
		
			<author>vdimas &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>Как MSVC теряет деструкторы в корутинах</title>
		<link>http://rsdn.org/Forum/cpp/9145142.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/cpp/9145142</guid>
		<comments>http://rsdn.org/Forum/cpp/9145142</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9145142</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9145142</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9145142</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Всем привет, накопал неприятный баг компилятора.&lt;br /&gt;
&lt;br /&gt;
Корутина не вызывает деструкторы локальных (для её фреймов) объектов в релизе:&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;coroutine&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;cstdio&amp;gt;

&lt;span class='kw'&gt;bool&lt;/span&gt; destroyed = &lt;span class='kw'&gt;false&lt;/span&gt;;

&lt;span class='kw'&gt;struct&lt;/span&gt; trace { ~trace() { destroyed = &lt;span class='kw'&gt;true&lt;/span&gt;; } };

&lt;span class='kw'&gt;struct&lt;/span&gt; fire_and_forget {
    &lt;span class='kw'&gt;struct&lt;/span&gt; promise_type {
        fire_and_forget get_return_object() &lt;span class='kw'&gt;const&lt;/span&gt; noexcept { &lt;span class='kw'&gt;return&lt;/span&gt; {}; }
        std::suspend_never initial_suspend() &lt;span class='kw'&gt;const&lt;/span&gt; noexcept { &lt;span class='kw'&gt;return&lt;/span&gt; {}; }
        std::suspend_never final_suspend() &lt;span class='kw'&gt;const&lt;/span&gt; noexcept { &lt;span class='kw'&gt;return&lt;/span&gt; {}; }
        &lt;span class='kw'&gt;void&lt;/span&gt; return_void() &lt;span class='kw'&gt;const&lt;/span&gt; noexcept {}
        &lt;span class='kw'&gt;void&lt;/span&gt; unhandled_exception() &lt;span class='kw'&gt;const&lt;/span&gt; noexcept {}
    };
};

&lt;span class='kw'&gt;struct&lt;/span&gt; capture {                       &lt;span class='com'&gt;// отдаёт наружу свою же ручку&lt;/span&gt;
    std::coroutine_handle&amp;lt;&amp;gt;* out;
    &lt;span class='kw'&gt;bool&lt;/span&gt; await_ready() &lt;span class='kw'&gt;const&lt;/span&gt; noexcept { &lt;span class='kw'&gt;return false&lt;/span&gt;; }
    &lt;span class='kw'&gt;void&lt;/span&gt; await_suspend(std::coroutine_handle&amp;lt;&amp;gt; h) &lt;span class='kw'&gt;const&lt;/span&gt; noexcept { *out = h; }
    &lt;span class='kw'&gt;void&lt;/span&gt; await_resume() &lt;span class='kw'&gt;const&lt;/span&gt; noexcept {}
};

fire_and_forget coro(std::coroutine_handle&amp;lt;&amp;gt;&amp;amp; out) {
    trace held;
    co_await capture{&amp;amp;out};
}

&lt;span class='kw'&gt;int&lt;/span&gt; main() {
    std::coroutine_handle&amp;lt;&amp;gt; waiter;

    coro(waiter);
    waiter.resume();                   &lt;span class='com'&gt;// тело доходит до конца&lt;/span&gt;

    std::printf(&lt;span class='str'&gt;"%s\n"&lt;/span&gt;, destroyed ? &lt;span class='str'&gt;"ok"&lt;/span&gt; : &lt;span class='str'&gt;"BUG: ~trace() was not called"&lt;/span&gt;);
    &lt;span class='kw'&gt;return&lt;/span&gt; destroyed ? 0 : 1;
}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;cl /std:c++20 /EHsc /Od repro.cpp   -&amp;gt;  ok
cl /std:c++20 /EHsc /O2 repro.cpp   -&amp;gt;  BUG: ~trace() was not called&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Матрица:&lt;br /&gt;
/Od — чисто, &lt;br /&gt;
/O1, /O2, /Ox — сломано;&lt;br /&gt;
/O2 /Ob0 — снова чисто, &lt;br /&gt;
/Ob1, /Ob2, /Ob3 — сломано. &lt;br /&gt;
&lt;br /&gt;
Значит, дело во встраивании фрейма.&lt;br /&gt;
&lt;br /&gt;
x86 &amp;mdash; ОК на всех уровнях.&lt;br /&gt;
&lt;b&gt;Болеет только x64&lt;/b&gt;;&lt;br /&gt;
&lt;br /&gt;
Уровень языка ни при чём: C++17 через /await:strict, C++20, /std:c++23preview, /std:c++latest — одинаково.&lt;br /&gt;
/GL, /MT, /MD, /GS-, /permissive-, /Gy, /Gw, /guard:cf, /Qspectre, /arch:AVX2, /Zi, /GR- — ничего не меняют.&lt;br /&gt;
&lt;br /&gt;
А вот это забавно:&lt;br /&gt;
&lt;table class='formatter' border='0' cellspacing='2' cellpadding='5'&gt;&lt;tr class='formatter'&gt;&lt;th class='formatter'&gt;ключ&lt;/th&gt;&lt;th class='formatter'&gt;результат&lt;/th&gt;&lt;/tr&gt;&lt;tr class='formatter'&gt;&lt;td class='formatter'&gt;/EHs, /EHsc&lt;/td&gt;&lt;td class='formatter'&gt;деструктор пропущен, кадр не освобождён&lt;/td&gt;&lt;/tr&gt;&lt;tr class='formatter'&gt;&lt;td class='formatter'&gt;/EHa, /EHac&lt;/td&gt;&lt;td class='formatter'&gt;всё правильно&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Т.е. для случая обслуживания аппаратных (асинхронных) исключений код генерируется верный. ))&lt;br /&gt;
&lt;br /&gt;
Документация /EH объясняет, чем модели отличаются внутри: «When you use /EHs or /EHsc, the compiler assumes that exceptions can only occur at a throw statement or at a function call. This assumption allows the compiler to eliminate code for tracking the lifetime of many unwindable objects».&lt;br /&gt;
&lt;br /&gt;
Проверяем в лоб: берём шесть вариантов одного и того же тела, отличающихся только тем, обязан ли компилятор считать, что тут может возникнуть исключение. /std:c++latest /EHsc /O2:&lt;br /&gt;
&lt;table class='formatter' border='0' cellspacing='2' cellpadding='5'&gt;  &lt;tr class='formatter'&gt;    &lt;th class='formatter'&gt;тело корутины&lt;/th&gt;    &lt;th class='formatter'&gt;результат&lt;/th&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;ничего бросить не может (всё noexcept)&lt;/td&gt;    &lt;td class='formatter'&gt;деструктор пропущен&lt;/td&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;недостижимый throw: if (never) throw …, где never — volatile bool = false&lt;/td&gt;    &lt;td class='formatter'&gt;деструктор выполнен&lt;/td&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;вызов функции из другой единицы трансляции&lt;/td&gt;    &lt;td class='formatter'&gt;деструктор выполнен&lt;/td&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;co_await внутри try { } catch (...) { }&lt;/td&gt;    &lt;td class='formatter'&gt;деструктор выполнен&lt;/td&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;awaiter без noexcept&lt;/td&gt;    &lt;td class='formatter'&gt;деструктор выполнен&lt;/td&gt;  &lt;/tr&gt;  &lt;tr class='formatter'&gt;    &lt;td class='formatter'&gt;промис без noexcept&lt;/td&gt;    &lt;td class='formatter'&gt;деструктор выполнен&lt;/td&gt;  &lt;/tr&gt;&lt;/table&gt;То есть: компилятор, решив, что тело корутины не бросает, выбрасывает учёт времени жизни — и вместе с ним уходит обычная уборка, к исключениям никакого отношения не имеющая: деструктор локального объекта и вызов функции освобождения кадра.&lt;br /&gt;
&lt;br /&gt;
Достаточно запихнуть в тело мёртвый throw, до которого управление никогда не дойдёт, и всё работает. &lt;img border='0' width='18' height='18' src='//rsdn.org/Forum/images/facepalm.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
Форма с владельцем (final_suspend() возвращает suspend_always, кадр сносит тот, кто его держит) не задета — там всё пашет как ожидалось. У меня изначально был только этот вариант корутины, который обслуживался фреймворком, всё было ОК.&lt;br /&gt;
&lt;br /&gt;
Добавил второй тип корутины, которую "выстрелил и забыл" &amp;mdash; и натрахался половину суток в стиле "то ли лыжи не едут, то ли я ..." &lt;img border='0' width='18' height='18' src='//rsdn.org/Forum/images/facepalm.gif' /&gt;&lt;br /&gt;
(выходной день насмарку)&lt;br /&gt;
&lt;br /&gt;
=============&lt;br /&gt;
Отправил баг в MS по стандартному каналу фидбэка студии, но почему-то не вижу его.&lt;br /&gt;
А кто-то отправлял баги в MS, там сразу он виден или только когда заводится feedback по нему?&lt;br /&gt;
На всякий случай отправил в STL-тим, там поживее реагируют:&lt;br /&gt;
&lt;a class="github m" href="https://github.com/microsoft/STL/issues/6458" target="_blank"&gt;https://github.com/microsoft/STL/issues/6458&lt;/a&gt;&lt;/div&gt;
				
		</description>
		
		<category>cpp</category>
		<pubDate>Sun, 20 Sep 2026 21:29:13 GMT</pubDate>
		
			<author>vdimas &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>17</slash:comments>
		
	</item>

	<item>
		<title>Выбор операторов для переопределения</title>
		<link>http://rsdn.org/Forum/cpp/9142566.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/cpp/9142566</guid>
		<comments>http://rsdn.org/Forum/cpp/9142566</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9142566</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9142566</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9142566</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Всем привет!&lt;br /&gt;
&lt;br /&gt;
Вопрос на чувство вкуса, читабельность и случайные грабли.&lt;br /&gt;
&lt;br /&gt;
Есть двусторонний биндинг контрола к observable-полю модели:&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;    TextBox {
        text = Bind {eq.x1},
    },&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;a class="github m" href="https://github.com/dmitry-valyukov/wxl/blob/main/samples/Quadratic/main.cpp" target="_blank"&gt;https://github.com/dmitry-valyukov/wxl/blob/main/samples/Quadratic/main.cpp&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Как только захотелось прикрутить односторонний биндинг, так стало видно, что возникает путаница:&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;    TextBox {
        text = BindRead {eq.x1},
    },&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;    TextBox {
        text = BindWrite {eq.x1},
    },&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
В реактивном подходе никогда не понятно, кто кого read/write, потому что два участника.&lt;br /&gt;
Наверно надо выкидывать тег-тип полностью, потому что только путаницу создаёт.&lt;br /&gt;
&lt;br /&gt;
Есть идея перейти на переопределения операторов, чтобы было видно, кто кого.&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;    TextBox {
        text = eq.x1,  &lt;span class='com'&gt;// Двусторонний биндинг &lt;/span&gt;
    },&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Что плохо &amp;mdash; что к синтаксическому хелперу через operator= много чего подвязывается, могут начаться гонки по приведениям типов.&lt;br /&gt;
Да и теряется на фоне остальных присвоений свойств, а биндинг должен "ловиться" глазами, потому что ради него рисуют формочки обычно.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;    TextBox {
        text &amp;gt;= eq.a,  &lt;span class='com'&gt;// Односторонний биндинг &lt;/span&gt;
    },
    TextBox {
        text &amp;lt;= eq.x1, &lt;span class='com'&gt;// Односторонний биндинг &lt;/span&gt;
    },&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Что плохо &amp;mdash; левая стрелка нормальная, правая &amp;mdash; оперение от стрелки.&lt;br /&gt;
&lt;br /&gt;
Пока мест склоняюсь к такому:&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;    TextBox {
        text &amp;lt;=&amp;gt; eq.a, &lt;span class='com'&gt;// Двусторонний биндинг &lt;/span&gt;
    },
    TextBox {
        text &amp;gt;&amp;gt; eq.b,  &lt;span class='com'&gt;// Односторонний биндинг &lt;/span&gt;
    },
    TextBox {
        text &amp;lt;&amp;lt; eq.x1, &lt;span class='com'&gt;// Односторонний биндинг &lt;/span&gt;
    },&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Не выглядит ли это птичьим языком и вообще дичью?&lt;br /&gt;
Кто-то развлекался достаточно в реактивных фреймворках?&lt;br /&gt;
И какие косяки могут быть?&lt;br /&gt;
&lt;br /&gt;
Про операторы &amp;lt;&amp;lt; и &amp;gt;&amp;gt; косяки понятные... &lt;br /&gt;
Проще было бы с &amp;lt;= и &amp;gt;=, но несимметричность стрелок огорчает внутреннего перфекциониста, отсюда желание обсудить. ))&lt;/div&gt;
				
		</description>
		
		<category>cpp</category>
		<pubDate>Fri, 18 Sep 2026 18:50:44 GMT</pubDate>
		
			<author>vdimas &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>6</slash:comments>
		
	</item>

	<item>
		<title>задачка на знание стандарта</title>
		<link>http://rsdn.org/Forum/cpp/9142406.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/cpp/9142406</guid>
		<comments>http://rsdn.org/Forum/cpp/9142406</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9142406</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9142406</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9142406</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Что в коде не так?&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;auto&lt;/span&gt; fetch() { &lt;span class='com'&gt;// просто для примера. Здесь всё нормально&lt;/span&gt;
  &lt;span class='kw'&gt;return&lt;/span&gt; std::vector&amp;lt;std::string&amp;gt; {&lt;span class='str'&gt;"1"&lt;/span&gt;, &lt;span class='str'&gt;"2"&lt;/span&gt;, &lt;span class='str'&gt;"3"&lt;/span&gt;};
}

&lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; Proj = std::identity&amp;gt;
&lt;span class='kw'&gt;auto&lt;/span&gt; fetchData(Proj proj = {}) {
  std::vector&amp;lt;std::string&amp;gt; data = fetch();
  data = proj(std::move(data));
  &lt;span class='kw'&gt;return&lt;/span&gt; data;
}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Можно даже с нейронками попытаться ответить (потому как клод собственно эту ошибку и допустил) &lt;img border='0' width='15' height='15' src='//rsdn.org/Forum/images/smile.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								Ответ			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(//rsdn.org/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;blockquote class='q'&gt;&lt;p&gt;An object of a type defined in the C++ standard library may be move-assigned (11.4.6 [class.copy.assign]) to itself. Such an assignment places the object in a valid but unspecified state unless otherwise specified.&lt;/p&gt;&lt;/blockquote&gt;
Так что такой код приводит к unspecified behaviour&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;fetchData();&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Поведение зависит от либы. gcc/clang удалил данные.&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(//rsdn.org/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt;
				
		</description>
		
		<category>cpp</category>
		<pubDate>Fri, 18 Sep 2026 09:32:25 GMT</pubDate>
		
			<author>sergii.p &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>3</slash:comments>
		
	</item>

	<item>
		<title>именна параметров функций и методов</title>
		<link>http://rsdn.org/Forum/cpp/9132761.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/cpp/9132761</guid>
		<comments>http://rsdn.org/Forum/cpp/9132761</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9132761</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9132761</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9132761</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;У нас на работе большая code base без какой либо документации&lt;br /&gt;
мой вышестояший коллега в библиотеке которую я сопровождаю по собственной иницативе удалил все имена параметров в декларации С++ классов&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;class VideoProcessor {
public:
    void ProcessFrame(const Frame&amp;amp; frame,
                      uint32_t timeout_ms,
                      bool blocking);
};&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;class VideoProcessor {
public:
    void ProcessFrame(const Frame&amp;amp;,
                      uint32_t,
                      bool);
};&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
скажите пожалуйста это нормальная практика ?&lt;br /&gt;
если нет как можно аргументировать что это излишни&lt;/div&gt;
				
		</description>
		
		<category>cpp</category>
		<pubDate>Fri, 28 Aug 2026 11:26:17 GMT</pubDate>
		
			<author>sergey2b &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>299</slash:comments>
		
	</item>

	<item>
		<title>usnig this_type = ???;</title>
		<link>http://rsdn.org/Forum/cpp/9116819.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/cpp/9116819</guid>
		<comments>http://rsdn.org/Forum/cpp/9116819</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9116819</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9116819</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9116819</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;В продолжение темы: &lt;a class=" tips m" href="https://rsdn.org/forum/cpp/5871322.1" rel="#WEkejx" target="_blank" title="Получить тип класса"&gt;Получить тип класса&lt;div class="tooltip" id="WEkejx"&gt;Автор: _NN_&lt;br /&gt;Дата: 27.11.14&lt;/div&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
В рамках С++20 (и выше, на будущее)&lt;br /&gt;
Есть ли возможность получить тип класса, находясь внутри класса и не используя имя класса?&lt;br /&gt;
&lt;br /&gt;
[сcode]&lt;br /&gt;
class A&lt;br /&gt;
{&lt;br /&gt;
  using this_type = ???; // что угодно, но имя класса (в данном случае A) встречаться не должно&lt;br /&gt;
};&lt;br /&gt;
[/сcode]&lt;/div&gt;
				
		</description>
		
		<category>cpp</category>
		<pubDate>Mon, 20 Jul 2026 14:07:52 GMT</pubDate>
		
			<author>B0FEE664 &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>17</slash:comments>
		
	</item>

	<item>
		<title>news: cmake + import std + MSVC - works</title>
		<link>http://rsdn.org/Forum/cpp/9113794.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/cpp/9113794</guid>
		<comments>http://rsdn.org/Forum/cpp/9113794</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9113794</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9113794</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9113794</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;и так благодаря мне&lt;br /&gt;
мой патч решили включить в cmake &lt;br /&gt;
теперь import std; под windows&lt;br /&gt;
работает для cmake + (clang или clang-cl) + MSVC stl&lt;br /&gt;
&lt;br /&gt;
жаль, но патч не вошел в вышедший на днях cmake 4.4.0 (кстати cmake + clang-cl уже поддерживает модули в cmake 4.4.0)&lt;br /&gt;
но точно будет в следующем cmake 4.5.0 релиз запланирован где то на октябрь&lt;br /&gt;
и возможно войдет в патч фикс  cmake 4.4.1 дата выхода не известна&lt;/div&gt;
				
		</description>
		
		<category>cpp</category>
		<pubDate>Sat, 11 Jul 2026 16:51:39 GMT</pubDate>
		
			<author>Великий Мессия &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>6</slash:comments>
		
	</item>

	<item>
		<title>UB из-за оператора defined в макроопределениях</title>
		<link>http://rsdn.org/Forum/cpp/9112153.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/cpp/9112153</guid>
		<comments>http://rsdn.org/Forum/cpp/9112153</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9112153</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9112153</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9112153</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;С большим удивлением узнал, что еще в C99 (6.10.1-3) и C++11 (16.1-4) использование оператора defined в макроопределении объявлено UB. Как нужно реализовать препроцессор (хоть внешний, хоть встроенный в компилятор), чтоб его поведение на таких макросах было менее определенным, чем на макросах, переопределяемых через #undef?&lt;/div&gt;
				
		</description>
		
		<category>cpp</category>
		<pubDate>Fri, 10 Jul 2026 09:14:09 GMT</pubDate>
		
			<author>Евгений Музыченко &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>20</slash:comments>
		
	</item>

	<item>
		<title>Вопрос по непонятому из С++20 короутин</title>
		<link>http://rsdn.org/Forum/cpp/9101840.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/cpp/9101840</guid>
		<comments>http://rsdn.org/Forum/cpp/9101840</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9101840</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9101840</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9101840</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Доброго дня!&lt;br /&gt;
&lt;br /&gt;
В очередной раз пытаюсь разобраться с короутинами из C++20. Среди того, что не понимаю, есть один момент, который можно обозначить как "идеология обращения с асинхронными сущностями". Попробую пояснить о чем речь.&lt;br /&gt;
&lt;br /&gt;
Большинство примеров использования короутин демонстрируют co_await в одну операцию. Что-то вроде:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;auto&lt;/span&gt; socket = co_await socket_factory::connect(ip);
co_await socket.send(request_packet);
&lt;span class='kw'&gt;auto&lt;/span&gt; reply = co_await socket.receive();
...&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Но, насколько я смог понять, в реальности за &lt;tt&gt;co_await something()&lt;/tt&gt; стоит два шага:&lt;br /&gt;
&lt;br /&gt;
1. Вызов something() и получение некого Task-а как результат формирования короутины something (под Task-ом понимается тип возвращаемого something() значения, это может быть и не Task, а какой-нибудь generator или еще что-то, что хранит в себе coroutine_handle из something()).&lt;br /&gt;
2. Применение оператора co_await к возвращенному из something() Task-у. С последующей цепочкой вызовов await_ready/await_suspend/await_resume для Awaiter-а (или самого Task-а, если отдельного Awaiter-а нет).&lt;br /&gt;
&lt;br /&gt;
Поэтому, при желании, программист может переписать строчку &lt;tt&gt;co_await socket_factory::connect(ip);&lt;/tt&gt; в более развернутом виде:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='com'&gt;// Получили в свое распоряжение короутину connect.&lt;/span&gt;
&lt;span class='kw'&gt;auto&lt;/span&gt; connect_task = socket_factory::connect(ip);
... &lt;span class='com'&gt;// Тут курим бамбук.
// И только сейчас толкаем ее на выполнение.&lt;/span&gt;
&lt;span class='kw'&gt;auto&lt;/span&gt; socket = co_await connect_task;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Теперь к сути вопроса.&lt;br /&gt;
&lt;br /&gt;
Допустим, у меня есть очередь сообщений и я хочу сделать к ней async_receive, который бы представлял из себя короутину. Т.е. что-то вроде:&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;async_receive_task_t async_receive(message_queue_t queue) {
  ... &lt;span class='com'&gt;// Какие-то действия с co_yield/co_return.&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
И чтобы к этому async_receive можно было применять co_await:&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;auto&lt;/span&gt; msg = co_await async_receive(commands_queue);&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Сейчас у меня есть мысль, что в async_receive сразу при входе можно делать попытку чтения из очереди. И если очередь не пуста, то немедленно доставать сообщение оттуда.&lt;br /&gt;
&lt;br /&gt;
Т.е. мой async_receive_task_t::promise_type::initial_suspend будет возвращать std::suspend_never, а async_receive будет работать как-то так:&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;async_receive_task_t async_receive(message_queue_t queue) {
  &lt;span class='com'&gt;// Сразу пытаемся взять сообщение если очередь не пуста.&lt;/span&gt;
  &lt;span class='kw'&gt;auto&lt;/span&gt; msg = queue.try_get_nonblocking();

  &lt;span class='com'&gt;// Если взять не удалось, то будем ждать возвращения в эту короутину
  // из нашего async_receive_task_t::awaiter_t::await_suspend.&lt;/span&gt;
  &lt;span class='kw'&gt;if&lt;/span&gt;(!msg) {
    co_yield empty_queue;
    &lt;span class='com'&gt;// А когда нам вернут управление, то сделаем еще одну попытку.&lt;/span&gt;
    msg = ...;
  }

  co_return msg;
}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Такой "энергичный" подход вроде как хорош тем, что не нужно тратить время если очередь сообщений не пуста. Сразу же внутри async_receive получаем сообщение, наш awaiter_t об этом узнает и вернет true из await_ready. Соответственно, не придется делать попытку приостановить ту короутину, в которой обратились к async_receive.&lt;br /&gt;
&lt;br /&gt;
Однако, меня смущает потенциальная возможность вот какого сценария:&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;auto&lt;/span&gt; receive_coro = async_receive(command_queue); &lt;span class='com'&gt;// (1)
// Теперь у нас на руках есть короутина async_receive, но в приостановленном
// состоянии.&lt;/span&gt;
...
... &lt;span class='com'&gt;// Еще какие-то действия.&lt;/span&gt;
...
&lt;span class='kw'&gt;if&lt;/span&gt;(something_went_wrong) &lt;span class='kw'&gt;return&lt;/span&gt;; &lt;span class='com'&gt;// Дальше не идем.

// Только сейчас нам нужно сообщение из очереди.&lt;/span&gt;
&lt;span class='kw'&gt;auto&lt;/span&gt; msg = co_await receive_coro; &lt;span class='com'&gt;// (2)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
При "энергичном" подходе если в command_queue было сообщение, то это сообщение будет извлечено в точке (1). Однако, если дело до точки (2) не дойдет, то сообщение будет потеряно. &lt;br /&gt;
&lt;br /&gt;
Что мне кажется неправильным. Ведь co_await-а не было. А значит и явной попытки взять сообщение в обработку не было.&lt;br /&gt;
&lt;br /&gt;
Возможно, правильным был бы "ленивый" подход, в котором promise_type::initial_suspend возвращал бы std::suspend_always. Сама короутина async_receive создавалась бы в приостановленном состоянии, а первая попытка чтения из очереди была бы в awaiter_t::await_suspend. И чтобы awaiter_t::await_suspend возвращал true только если очередь пуста и нужно приостанавливаться до появления в ней сообщений (соответственно, если в awaiter_t::await_suspend сообщение удалось взять, то возвращается false).&lt;br /&gt;
&lt;br /&gt;
Собственно, сам вопрос: правильно ли я понимаю, что с точки зрения C++ных короутин более уместно использовать именно "ленивый" подход для такой гипотетической async_receive?&lt;br /&gt;
&lt;br /&gt;
PS. Про рекомендацию возвращать из promise_type::initial_suspend значение std::suspend_always читал неоднократно. Здесь больше вопрос в том, насколько это уместно с точки зрения нужного мне async_receive.&lt;br /&gt;
&lt;br /&gt;
PPS. Про &lt;a class="m" href="https://lewissbaker.github.io/2020/05/11/understanding_symmetric_transfer" target="_blank"&gt;symmetric transfer&lt;/a&gt; тоже читал. Но есть ощущение, что для моего async_receive достаточно будет возврата bool-а из awaiter_t::await_suspend.&lt;/div&gt;
				
		</description>
		
		<category>cpp</category>
		<pubDate>Thu, 18 Jun 2026 13:21:56 GMT</pubDate>
		
			<author>so5team &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>88</slash:comments>
		
	</item>

	<item>
		<title>Про умные указатели пр. безопасные фишки</title>
		<link>http://rsdn.org/Forum/cpp/9097513.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/cpp/9097513</guid>
		<comments>http://rsdn.org/Forum/cpp/9097513</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9097513</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9097513</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9097513</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Вопрос такой, особенно к @sergey2b и прочим, кто привык к старому C++.&lt;br /&gt;
&lt;br /&gt;
Используете ли вы везде умные указатели или же вам удобнее по старинке и т.н. умные указатели только мешают?&lt;br /&gt;
&lt;br /&gt;
Аналогичный вопрос &amp;mdash; про потоки. Используете ли либы с корутинами (какие?) или же по старинке с ручной синхронизацией?&lt;/div&gt;
				
		</description>
		
		<category>cpp</category>
		<pubDate>Sat, 06 Jun 2026 16:35:29 GMT</pubDate>
		
			<author>Shmj &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>88</slash:comments>
		
	</item>
</channel>
</rss>
