{"id":9947,"date":"2024-09-02T10:58:09","date_gmt":"2024-09-02T10:58:09","guid":{"rendered":"https:\/\/www.modernescpp.com\/?p=9947"},"modified":"2025-07-03T16:13:36","modified_gmt":"2025-07-03T16:13:36","slug":"an-overview-of-c26-the-library","status":"publish","type":"post","link":"https:\/\/www.modernescpp.com\/index.php\/an-overview-of-c26-the-library\/","title":{"rendered":"An Overview of C++26: The Library"},"content":{"rendered":"\n<p>In my last post, I overviewed C++26&#8217;s core language. Today, I continue with the library.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1030\" height=\"450\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/08\/TimelineCpp26Library-1-1030x450.png\" alt=\"\" class=\"wp-image-9949\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/08\/TimelineCpp26Library-1-1030x450.png 1030w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/08\/TimelineCpp26Library-1-300x131.png 300w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/08\/TimelineCpp26Library-1-768x335.png 768w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/08\/TimelineCpp26Library-1-705x308.png 705w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/08\/TimelineCpp26Library-1.png 1180w\" sizes=\"auto, (max-width: 1030px) 100vw, 1030px\" \/><\/figure>\n\n\n\n<p>To make it short. The library does not offer such powerful features as the core language. Let me name them and give you a short example directly from the proposal.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"std_string_and_std_string_view_Processing\"><\/span><code>std::string <\/code>and <code>std::string_view<\/code> Processing<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p> The functions around <code>std::string<\/code> and <code>std::string_view <\/code>makes using them more convenient.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Testing_for_success_or_failure_of_functions\"><\/span>Testing for success or failure of &lt;charconv&gt; functions<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Using the functions <code>to_chars <\/code>or <code>from_chars <\/code>was pretty inconvenient. You had to check with <code>res.ec == std::errc{}<\/code> the success of the conversion. With C++26, you can convert the result directly to <code>bool<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Arithmetic_overloads_of_std_to_string_and_use_std_format\"><\/span>Arithmetic overloads of std::to_string and use std::format<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p><code>std::to_string <\/code>has a few issues. The &#8220;<em>choice of the floating-point format makes <code>std::to_string<\/code> of very limited use in practice&#8221;<\/em> (<a href=\"https:\/\/wg21.link\/P2587R3\">P2587R3<\/a>).<\/p>\n\n\n\n<!-- HTML generated using hilite.me --><div style=\"background: #f0f3f3; overflow:auto;width:auto;gray;border-width:.1em .1em .1em .8em\"><pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #006699; font-weight: bold\">auto<\/span> loc <span style=\"color: #555555\">=<\/span> std<span style=\"color: #555555\">::<\/span>locale(<span style=\"color: #CC3300\">&quot;uk_UA.UTF-8&quot;<\/span>);\nstd<span style=\"color: #555555\">::<\/span>locale<span style=\"color: #555555\">::<\/span>global(loc);\nstd<span style=\"color: #555555\">::<\/span>cout.imbue(loc);\nsetlocale(LC_ALL, <span style=\"color: #CC3300\">&quot;C&quot;<\/span>);\n\nstd<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;iostreams:<\/span><span style=\"color: #CC3300; font-weight: bold\">\\n<\/span><span style=\"color: #CC3300\">&quot;<\/span>;\nstd<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #FF6600\">1234<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;<\/span><span style=\"color: #CC3300; font-weight: bold\">\\n<\/span><span style=\"color: #CC3300\">&quot;<\/span>;\nstd<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #FF6600\">1234.5<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;<\/span><span style=\"color: #CC3300; font-weight: bold\">\\n<\/span><span style=\"color: #CC3300\">&quot;<\/span>;\n\nstd<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;<\/span><span style=\"color: #CC3300; font-weight: bold\">\\n<\/span><span style=\"color: #CC3300\">to_string:<\/span><span style=\"color: #CC3300; font-weight: bold\">\\n<\/span><span style=\"color: #CC3300\">&quot;<\/span>;\nstd<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> std<span style=\"color: #555555\">::<\/span>to_string(<span style=\"color: #FF6600\">1234<\/span>) <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;<\/span><span style=\"color: #CC3300; font-weight: bold\">\\n<\/span><span style=\"color: #CC3300\">&quot;<\/span>;\nstd<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> std<span style=\"color: #555555\">::<\/span>to_string(<span style=\"color: #FF6600\">1234.5<\/span>) <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;<\/span><span style=\"color: #CC3300; font-weight: bold\">\\n<\/span><span style=\"color: #CC3300\">&quot;<\/span>;\n\nsetlocale(LC_ALL, <span style=\"color: #CC3300\">&quot;uk_UA.UTF-8&quot;<\/span>);\n\nstd<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;<\/span><span style=\"color: #CC3300; font-weight: bold\">\\n<\/span><span style=\"color: #CC3300\">to_string (uk_UA.UTF-8 C locale):<\/span><span style=\"color: #CC3300; font-weight: bold\">\\n<\/span><span style=\"color: #CC3300\">&quot;<\/span>;\nstd<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> std<span style=\"color: #555555\">::<\/span>to_string(<span style=\"color: #FF6600\">1234<\/span>) <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;<\/span><span style=\"color: #CC3300; font-weight: bold\">\\n<\/span><span style=\"color: #CC3300\">&quot;<\/span>;\nstd<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> std<span style=\"color: #555555\">::<\/span>to_string(<span style=\"color: #FF6600\">1234.5<\/span>) <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;<\/span><span style=\"color: #CC3300; font-weight: bold\">\\n<\/span><span style=\"color: #CC3300\">&quot;<\/span>;\n<\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"445\" height=\"352\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/09\/to_stringpng-1.png\" alt=\"\" class=\"wp-image-10000\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/09\/to_stringpng-1.png 445w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/09\/to_stringpng-1-300x237.png 300w\" sizes=\"auto, (max-width: 445px) 100vw, 445px\" \/><\/figure>\n\n\n\n<p>The program shows that the output of floating point overloads is inconsistent for iostreams. It takes the decimal point from the global C locale.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Interfacing_stringstreams_with_std_string_view\"><\/span>Interfacing stringstreams with <code>std::string_view<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p> Thanks to proposal <a href=\"https:\/\/wg21.link\/P2495R3\">P2495R3<\/a>, you can create a stringstream from a <code>std::string_view<\/code>. In the following example, <code>\"\"sv<\/code> is an empty<code> string_view<\/code> literal.<\/p>\n\n\n\n<!-- HTML generated using hilite.me --><div style=\"background: #f0f3f3; overflow:auto;width:auto;gray;border-width:.1em .1em .1em .8em\"><pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #0099FF; font-style: italic\">\/\/ implicitly convertable to string_view<\/span>\n<span style=\"color: #006699; font-weight: bold\">const<\/span> mystring str;\n\nstringstream <span style=\"color: #CC00FF\">s1<\/span>(<span style=\"color: #CC3300\">&quot;&quot;<\/span>sv);\nstringstream <span style=\"color: #CC00FF\">s1<\/span>(str);\ns2.str(<span style=\"color: #CC3300\">&quot;&quot;<\/span>sv);\n<\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Concatenation_of_strings_and_string_views\"><\/span>Concatenation of strings and string views<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>With C++26, you can concatenate strings and string views:<\/p>\n\n\n\n<!-- HTML generated using hilite.me --><div style=\"background: #f0f3f3; overflow:auto;width:auto;gray;border-width:.1em .1em .1em .8em\"><pre style=\"margin: 0; line-height: 125%\">std<span style=\"color: #555555\">::<\/span>string calculate(std<span style=\"color: #555555\">::<\/span>string_view prefix)\n{\n  <span style=\"color: #006699; font-weight: bold\">return<\/span> prefix <span style=\"color: #555555\">+<\/span> get_string(); <span style=\"color: #0099FF; font-style: italic\">\/\/ NO ERROR<\/span>\n}\n<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Format_Extensions\"><\/span>Format Extensions<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Pointers\"><\/span>Pointers<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Before C++26, only <code>void<\/code>, <code>const void<\/code>, and<code> std::nullptr_t<\/code> pointer types are valid. If you want to display the address of an arbitrary pointer, you must cast it to <code>(const) void*<\/code>.<\/p>\n\n\n\n<!-- HTML generated using hilite.me --><div style=\"background: #f0f3f3; overflow:auto;width:auto;gray;border-width:.1em .1em .1em .8em\"><pre style=\"margin: 0; line-height: 125%\">\n<span style=\"color: #007788; font-weight: bold\">double<\/span> d <span style=\"color: #555555\">=<\/span> <span style=\"color: #FF6600\">123.456789<\/span>;\nstd<span style=\"color: #555555\">::<\/span>format(<span style=\"color: #CC3300\">&quot;{}&quot;<\/span>, <span style=\"color: #555555\">&amp;<\/span>d); <span style=\"color: #0099FF; font-style: italic\">\/\/ ERROR<\/span>\nstd<span style=\"color: #555555\">::<\/span>format(<span style=\"color: #CC3300\">&quot;{}&quot;<\/span>, <span style=\"color: #006699; font-weight: bold\">static_cast<\/span><span style=\"color: #555555\">&lt;<\/span><span style=\"color: #007788; font-weight: bold\">void<\/span><span style=\"color: #555555\">*&gt;<\/span>(<span style=\"color: #555555\">&amp;<\/span>d)); <span style=\"color: #0099FF; font-style: italic\">\/\/ okay<\/span>\nstd<span style=\"color: #555555\">::<\/span>format(<span style=\"color: #CC3300\">&quot;{}&quot;<\/span>, <span style=\"color: #006699; font-weight: bold\">static_cast<\/span><span style=\"color: #555555\">&lt;<\/span><span style=\"color: #006699; font-weight: bold\">const<\/span> <span style=\"color: #007788; font-weight: bold\">void<\/span><span style=\"color: #555555\">*&gt;<\/span>(<span style=\"color: #555555\">&amp;<\/span>d)); <span style=\"color: #0099FF; font-style: italic\">\/\/ okay<\/span>\nstd<span style=\"color: #555555\">::<\/span>format(<span style=\"color: #CC3300\">&quot;{}&quot;<\/span>, nullptr); <span style=\"color: #0099FF; font-style: italic\">\/\/ okay<\/span>\n<\/pre><\/div>\n\n\n\n<p>With C++26, the error messages are no longer displayed.<\/p>\n\n\n\n<!-- HTML generated using hilite.me --><div style=\"background: #f0f3f3; overflow:auto;width:auto;gray;border-width:.1em .1em .1em .8em\"><pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #0099FF; font-style: italic\">\/\/ pointerFormat.cpp<\/span>\n\n<span style=\"color: #009999\">#include &lt;format&gt;<\/span>\n<span style=\"color: #009999\">#include &lt;iostream&gt;<\/span>\n\n<span style=\"color: #007788; font-weight: bold\">int<\/span> <span style=\"color: #CC00FF\">main<\/span>() {\n \n     std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    <span style=\"color: #007788; font-weight: bold\">double<\/span> d <span style=\"color: #555555\">=<\/span> <span style=\"color: #FF6600\">123.456789<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> std<span style=\"color: #555555\">::<\/span>format(<span style=\"color: #CC3300\">&quot;{}&quot;<\/span>, <span style=\"color: #006699; font-weight: bold\">static_cast<\/span><span style=\"color: #555555\">&lt;<\/span><span style=\"color: #007788; font-weight: bold\">void<\/span><span style=\"color: #555555\">*&gt;<\/span>(<span style=\"color: #555555\">&amp;<\/span>d)) <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> std<span style=\"color: #555555\">::<\/span>format(<span style=\"color: #CC3300\">&quot;{}&quot;<\/span>, <span style=\"color: #006699; font-weight: bold\">static_cast<\/span><span style=\"color: #555555\">&lt;<\/span><span style=\"color: #006699; font-weight: bold\">const<\/span> <span style=\"color: #007788; font-weight: bold\">void<\/span><span style=\"color: #555555\">*&gt;<\/span>(<span style=\"color: #555555\">&amp;<\/span>d)) <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> std<span style=\"color: #555555\">::<\/span>format(<span style=\"color: #CC3300\">&quot;{}&quot;<\/span>, nullptr) <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n}\n<\/pre><\/div>\n\n\n\n<p>Here&#8217;s the output of the program.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"206\" height=\"90\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/08\/pointerFormat.png\" alt=\"\" class=\"wp-image-9967\" style=\"width:200px\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"std_filesystem_path\"><\/span><code>std::filesystem::path<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p><code>std::format<\/code> can display <code>std::filesystem::path <\/code>objects. The example from the proposal <a href=\"https:\/\/wg21.link\/P2845R8\">P2845R8<\/a> shows.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>auto<\/strong> p1 = std::filesystem::path(\"\/usr\/bin\");<br>Ja std::cout &lt;&lt; std::format(\"{}\", p1);                           <em>\/\/  \/usr\/bin<\/em><br><br><br><strong>auto<\/strong> p2 = std::filesystem::path(\"multi<strong>\\n<\/strong>line\");<br>std::cout &lt;&lt; std::format(\"{}\", p2);                          <em>\/\/ multi<\/em><br>                                                             <em>\/\/ line<\/em><br><br><br><strong>auto<\/strong> p3 = std::filesystem::path(\"multi<strong>\\n<\/strong>line\");<br>std::cout &lt;&lt; std::format(\"{:?}\", p3);                        <em>\/\/ \"multi\\nline\"<\/em><br><\/pre>\n\n\n\n<p>Thanks to the format string &#8220;<code>{:?}<\/code>&#8221; in the last line, the escape sequence &#8220;<code>\\n<\/code>&#8221; is not interpreted.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"std_inplace_vector\"><\/span><code>std::inplace_vector<\/code> <span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><code>std::inplace_vector <\/code>&#8220;<em>is, a dynamically-resizable <code>vector<\/code> with compile-time fixed capacity and contiguous embedded storage in which the elements are stored within the vector object itself.<\/em>&#8221; (<a href=\"https:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2023\/p0843r8.html\">P0843R8<\/a>)<\/p>\n\n\n\n<p>This container can be used as a drop-in replacement for <code>std::vector<\/code>. You might ask yourself, when should I use the<code> inplace_vector<\/code> or <code>vector<\/code>.<\/p>\n\n\n\n<p> The proposal <a href=\"https:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2023\/p0843r8.html\">P0843R8<\/a> gives you the answer:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>memory allocation is not possible, e.g., embedded environments without a free store, where only a stack and the static memory segment are available,<\/li>\n\n\n\n<li>memory allocation imposes an unacceptable performance penalty, e.g., with respect to latency,<\/li>\n\n\n\n<li>allocation of objects with complex lifetimes in the <em>static<\/em>-memory segment is required,<\/li>\n\n\n\n<li><code>std::array<\/code> is not an option, e.g., if non-default constructible objects must be stored,<\/li>\n\n\n\n<li>a dynamically-resizable array is required within <code>constexpr<\/code> functions,<\/li>\n\n\n\n<li>the storage location of the <code>inplace_vector<\/code> elements is required to be within the <code>inplace_vector<\/code> object itself (e.g. to support <code>memcpy<\/code> for serialization purposes).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Ranges_Improvements\"><\/span>Ranges Improvements<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>The ranges library will get new functions: <code>std::ranges::generate_random<\/code> and <code>std::ranges::concat_view.<\/code> <\/p>\n\n\n\n<p>The call <code>std::ranges::generate_random(fltArray, g, d<\/code>)  uses the generator <code>g <\/code>and the distribution <code>d <\/code>to create the random numbers. The call is equivalent to the following loop:<\/p>\n\n\n\n<!-- HTML generated using hilite.me --><div style=\"background: #f0f3f3; overflow:auto;width:auto;gray;border-width:.1em .1em .1em .8em\"><pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #006699; font-weight: bold\">for<\/span>(<span style=\"color: #006699; font-weight: bold\">auto<\/span><span style=\"color: #555555\">&amp;<\/span> el <span style=\"color: #555555\">:<\/span> fltArray)\nel <span style=\"color: #555555\">=<\/span> d(e);\n<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"constexpr_Extensions\"><\/span><code>constexpr&nbsp;<\/code>Extensions <span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Since C++11, the tendency has continued: More and more are becoming <code>constexpr <\/code>in C++.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The algorithm <code>std::stable sort, std::stable partition<\/code>, and <code>std::inplace_merge<\/code> are <code>constexpr <\/code>in C++26. This is also <code>true <\/code>for their counterparts in the ranges library.<\/li>\n\n\n\n<li>The proposal <a class=\"\" href=\"https:\/\/wg21.link\/P1383R2\">P1383R2<\/a> &#8220;<em>amounts to a (further) liberal sprinkling of constexpr in &lt;cmath&gt; , together with a smattering in &lt;complex&gt;<\/em>&#8220;.\u200b<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Whats_next\"><\/span>What&#8217;s next?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>In my next post, I will continue my journey through the library in C++26.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my last post, I overviewed C++26&#8217;s core language. Today, I continue with the library. To make it short. The library does not offer such powerful features as the core language. Let me name them and give you a short example directly from the proposal. std::string and std::string_view Processing The functions around std::string and std::string_view [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":9944,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[559],"tags":[],"class_list":["post-9947","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c26-blog"],"_links":{"self":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/9947","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/comments?post=9947"}],"version-history":[{"count":32,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/9947\/revisions"}],"predecessor-version":[{"id":10850,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/9947\/revisions\/10850"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media\/9944"}],"wp:attachment":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media?parent=9947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/categories?post=9947"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/tags?post=9947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}