{"id":6411,"date":"2022-07-24T16:35:41","date_gmt":"2022-07-24T16:35:41","guid":{"rendered":"https:\/\/www.modernescpp.com\/index.php\/an-the-five-winners-for-c-core-guidelines-best-practices-for-modern-c\/"},"modified":"2022-07-24T16:35:41","modified_gmt":"2022-07-24T16:35:41","slug":"an-the-five-winners-for-c-core-guidelines-best-practices-for-modern-c","status":"publish","type":"post","link":"https:\/\/www.modernescpp.com\/index.php\/an-the-five-winners-for-c-core-guidelines-best-practices-for-modern-c\/","title":{"rendered":"And the Five Winners for &#8220;C++ Core Guidelines: Best Practices for Modern C++&#8221;"},"content":{"rendered":"<p>Today, I want to present the five winners of the vouchers for my book &#8220;C++ Core Guidelines Explained: Best Practices for Modern C++&#8221;.<\/p>\n<p><!--more--><\/p>\n<p>&nbsp;<img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-6401\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2022\/07\/CppCoreGuidelines.jpg\" alt=\"CppCoreGuidelines\" width=\"300\" height=\"391\" style=\"display: block; margin-left: auto; margin-right: auto;\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2022\/07\/CppCoreGuidelines.jpg 648w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2022\/07\/CppCoreGuidelines-230x300.jpg 230w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>First, I have to adjust the number. Instead of five, I will give away seven vouchers. Why? Honestly, I could not decide. Additionally, I got more than 30 answers. Therefore, I added three vouchers. Here are the answers in the order I got the. You should already have the voucher.<\/p>\n<h2>Sandor<\/h2>\n<div class=\"gmail_default\">Not surprisingly the first thing I had in mind were smart pointers, but that would be too evident. And I was also not sure if you mean language or library features. We used to have smart pointers before from boost, etc.<\/div>\n<div class=\"gmail_default\">&nbsp;<\/div>\n<div class=\"gmail_default\">Keeping that in mind, to me, it&#8217;s the override specifier. It makes intentions so much clearer! With virtual you know exactly one thing, that very function can be overridden. But you have no idea whether it&#8217;s overriding something or not. Forgetting a const here, using another similar type there, and you have some issues that are very difficult to spot. The override specifier changed that and helped me to catch some subtle bugs in our codebase that I would have never found.<\/div>\n<h2>Tom<\/h2>\n<p>&nbsp;<\/p>\n<p>The most influential feature of C++ 17 for me has been structured bindings.<br \/>Structured bindings let me write and refactor flexible code in places like interacting with a std::pair returned from a function (multiple return) or iterating over a map or custom type.<br \/>As long as we choose descriptive variable &amp; function names, structured bindings enable us to write concise but readable code using words of intent related to the domain we&#8217;re working in instead of only relying on type names.<\/p>\n<p>I also think structured bindings help C++ be considered as a &#8220;modern&#8221; language, they&#8217;re a convenience that&#8217;s almost expected now if you look at how often the same feature is used in languages like Golang and JavaScript. Sure they&#8217;re different worlds, but I like to learn and take inspiration from anywhere I can and translate it into my own program design if it fits well.<\/p>\n<h2>Akash<\/h2>\n<div dir=\"auto\">&nbsp;<\/div>\n<div dir=\"auto\">The most influential feature for me is the introduction on &#8220;thread&#8221; support in C++11.<\/div>\n<div dir=\"auto\">&nbsp;<\/div>\n<div dir=\"auto\">This is because of the reason that , it is very basic requirement for any good software project. Earlier we had to know and learn platform specific threads like &#8220;pthreads&#8221; in Linux, Win32 APIs on Windows etc.&nbsp;<\/div>\n<div dir=\"auto\">&nbsp;<\/div>\n<div dir=\"auto\">But with thread introduction in C++11 and concurrency support provided for it has made it cross-platform and also lead to advanced concepts like promise\/future.<\/div>\n<div>&nbsp;<\/div>\n<h2>Far\u00e9s<\/h2>\n<div>\n<div class=\"gmail_default\">I mostly know C++11. I would write couples of words about lambda function&nbsp;or expression. It creates an anonymous function.<\/div>\n<div class=\"gmail_default\">A lambda expression is a mechanism for specifying a function object. The primary use for lambda is to specify a simple action to be performed by some function.&nbsp;<\/div>\n<div class=\"gmail_default\">For instance, one can declare the argument [ ] (int x, int y) { return sin( x ) &lt; sin( y ); } with the condition, x and y are between [0 pi]&nbsp; &#8211; this is a &#8220;lambda function&#8221; or &#8220;lambda expression&#8221;, which specifies an operation that given two integer arguments x and y returns the result of comparing their sin values.&nbsp; A lambda expression can as well access local variables in the scope in which it is used.<\/div>\n<div>&nbsp;<\/div>\n<h2>Michael<\/h2>\n<p>my &#8220;most influential feature&#8221; of the last decade in C++ was the std::shared_ptr (and also the std::unique_ptr). I could never &#8220;befriend&#8221; the auto_ptr, never used it &#8211; but the new kind of smart pointers became real quick my best buddies.<\/p>\n<p>After working with Java and Android next to C++, the memory management with new and delete felt like being from the stone ages. With a lot of trouble on how, when and where to allocate and to free the memory. Plus how (not) to pass those pointers around in the code.<\/p>\n<p>Especially using the smart pointers with RAII frees up a lot of cognitive load. I don&#8217;t need to think about the memory allocation, the compiler will do this for me. And releases the memory after the last (or only) reference falls out of scope.<\/p>\n<p>And they are still nice to use even though some of the code got more complex. Simple forward declarations of classes no longer work (the smart pointers need to do a &#8220;sizeof()&#8221;), and circular dependencies had to be solved in a different way. I do it in Java style with abstract classes emulating interfaces, so the class for the smart pointer is compiled as separate unit.<\/p>\n<h2>Tobias<\/h2>\n<p><span lang=\"EN-US\">this is a tough question, since there are so many improvements in the C++ language since the advent of C++11. So I thought what feature has altered the way I program C++ the most. The two main features I considered was \u201cauto\u201d and \u201csmart pointers (unique_ptr, shared_ptr)\u201d and I must say that smart pointers transformed my code definitely more than auto. Auto helps a lot but it is mainly syntactic sugar. In contrast smart pointers enable C++ programmers to use a different style of programming. The owner of objects can be clearly expressed also the distinction between single or exclusive ownership in contrast to shared ownership can be expressed with the use of unique_ptr and shared_ptr. The smart pointers also make programming idioms like RAII easier. Lastly smart pointers avoid several security pitfalls if applied correctly. It avoids dangling memory objects since the lifetime of objects is tied to a scope and exiting the scope automatically deletes the object.<\/span><\/p>\n<h2>Adam<\/h2>\n<p><span id=\"page3R_mcid0\"><span dir=\"ltr\" role=\"presentation\">My vote for the most influential feature of C++11\/14\/17 goes to the specifier<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><code><span dir=\"ltr\" role=\"presentation\">constexpr<\/span><\/code><span dir=\"ltr\" role=\"presentation\">, <\/span><span dir=\"ltr\" role=\"presentation\">introduced in C++ 11.<\/span><\/span><span id=\"page3R_mcid1\"><br role=\"presentation\" \/><span dir=\"ltr\" role=\"presentation\"><\/span><\/span><\/p>\n<p><span id=\"page3R_mcid1\"><span dir=\"ltr\" role=\"presentation\">According to cppreference (<\/span><\/span><span id=\"page3R_mcid2\"><span dir=\"ltr\" role=\"presentation\"><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/constexpr\">https:\/\/en.cppreference.com\/w\/cpp\/language\/constexpr<\/a><\/span><\/span><span id=\"page3R_mcid3\"><span dir=\"ltr\" role=\"presentation\">) &#8220;The <\/span><span dir=\"ltr\" role=\"presentation\">constexpr<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">specifier declares that it is possible to evaluate the value of the function or variable at <\/span><span dir=\"ltr\" role=\"presentation\">compile time.&#8221;<\/span><span dir=\"ltr\" role=\"presentation\">.<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">Trivially, for example we can declare: <\/span><\/span><\/p>\n<p><samp><span id=\"page3R_mcid4\"><span dir=\"ltr\" role=\"presentation\">constexpr<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">auto<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">meaning_of_life{ 42 };<\/span><\/span><span id=\"page3R_mcid5\"><\/span><span id=\"page3R_mcid5\"><\/span><\/samp><\/div>\n<div><samp><span id=\"page3R_mcid5\"><\/span><\/samp><\/p>\n<p><span id=\"page3R_mcid5\"><span dir=\"ltr\" role=\"presentation\">This quite innocuous feature allows you to declare variables that can be evaluated at compile <\/span><span dir=\"ltr\" role=\"presentation\">time.<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">Like it<\/span><span dir=\"ltr\" role=\"presentation\">s runtime counterpart<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><code><span dir=\"ltr\" role=\"presentation\">const<\/span><\/code><span dir=\"ltr\" role=\"presentation\">,<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">i<\/span><span dir=\"ltr\" role=\"presentation\">t allows you to be clear about the meaning of a piece of <\/span><span dir=\"ltr\" role=\"presentation\">code.<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">In the best tradition of C++ it allows you to express your intention exactly (say what you <\/span><span dir=\"ltr\" role=\"presentation\">mean and mean what you say).<\/span><\/span><span id=\"page3R_mcid6\"><br role=\"presentation\" \/><span dir=\"ltr\" role=\"presentation\"><\/span><\/span><\/p>\n<p><span id=\"page3R_mcid6\"><span dir=\"ltr\" role=\"presentation\">But it is not just limited to variables.<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><code><span dir=\"ltr\" role=\"presentation\">constexpr<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><\/code><span dir=\"ltr\" role=\"presentation\">can apply to<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">functions that can be compile<\/span><span dir=\"ltr\" role=\"presentation\">&#8211;<\/span><span dir=\"ltr\" role=\"presentation\">time <\/span><span dir=\"ltr\" role=\"presentation\">evaluated.<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">For<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">example<\/span><span dir=\"ltr\" role=\"presentation\">, given the<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">following<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">arrangement<\/span><span dir=\"ltr\" role=\"presentation\">:<\/span><\/span><\/p>\n<\/div>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #f0f3f3; overflow: auto; width: auto; gray;border-width: .1em .1em .1em .8em;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #006699; font-weight: bold;\">enum<\/span> <span style=\"color: #006699; font-weight: bold;\">class<\/span> <span style=\"color: #00aa88; font-weight: bold;\">MediaType<\/span>\r\n{\r\n    Unknown,\r\n    Music,\r\n    Video,\r\n    Book\r\n};\r\n<span style=\"color: #006699; font-weight: bold;\">using<\/span> MediaTypeItem <span style=\"color: #555555;\">=<\/span> std<span style=\"color: #555555;\">::<\/span>pair<span style=\"color: #555555;\">&lt;<\/span>MediaType, std<span style=\"color: #555555;\">::<\/span>string_view<span style=\"color: #555555;\">&gt;<\/span>;\r\n<span style=\"color: #006699; font-weight: bold;\">struct<\/span> MediaTypeValues\r\n{\r\n    <span style=\"color: #006699; font-weight: bold;\">static<\/span> constexpr std<span style=\"color: #555555;\">::<\/span>array<span style=\"color: #555555;\">&lt;<\/span>MediaTypeItem, <span style=\"color: #ff6600;\">3<\/span><span style=\"color: #555555;\">&gt;<\/span> values{\r\n        {{MediaType<span style=\"color: #555555;\">::<\/span>Book, <span style=\"color: #cc3300;\">\"Book\"<\/span>sv},\r\n         {MediaType<span style=\"color: #555555;\">::<\/span>Music, <span style=\"color: #cc3300;\">\"Music\"<\/span>sv},\r\n         {MediaType<span style=\"color: #555555;\">::<\/span>Video, <span style=\"color: #cc3300;\">\"Video\"<\/span>sv}}};\r\n};\r\nconstexpr std<span style=\"color: #555555;\">::<\/span>string_view GetString(MediaType in)\r\n{\r\n    <span style=\"color: #006699; font-weight: bold;\">for<\/span> (<span style=\"color: #006699; font-weight: bold;\">const<\/span> <span style=\"color: #006699; font-weight: bold;\">auto<\/span> <span style=\"color: #555555;\">&amp;<\/span>v <span style=\"color: #555555;\">:<\/span> MediaTypeValues<span style=\"color: #555555;\">::<\/span>values)\r\n    {\r\n        <span style=\"color: #006699; font-weight: bold;\">if<\/span> (v.first <span style=\"color: #555555;\">==<\/span> in)\r\n        {\r\n            <span style=\"color: #006699; font-weight: bold;\">return<\/span> v.second;\r\n        }\r\n    }\r\n    <span style=\"color: #006699; font-weight: bold;\">return<\/span> {};\r\n}\r\n<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p><span id=\"page3R_mcid33\" class=\"markedContent\"><span dir=\"ltr\" role=\"presentation\">We can take advantage of<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><code><span dir=\"ltr\" role=\"presentation\">constexpr<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><\/code><span dir=\"ltr\" role=\"presentation\">to<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">create a compile<\/span><span dir=\"ltr\" role=\"presentation\">&#8211;<\/span><span dir=\"ltr\" role=\"presentation\">time evaluated<\/span><code><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">std::<\/span><span dir=\"ltr\" role=\"presentation\">array<\/span><\/code><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">to map <\/span><span dir=\"ltr\" role=\"presentation\">enumerated values to their string counterparts.<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><code><span dir=\"ltr\" role=\"presentation\">constexpr<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><\/code><span dir=\"ltr\" role=\"presentation\">allows us to<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">take code that was once <\/span><span dir=\"ltr\" role=\"presentation\">evaluated at runtime and make it into compile<\/span><span dir=\"ltr\" role=\"presentation\">&#8211;<\/span><span dir=\"ltr\" role=\"presentation\">time evaluated code.<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">And this<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">is<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">evalu<\/span><span dir=\"ltr\" role=\"presentation\">ated at <\/span><span dir=\"ltr\" role=\"presentation\">compile time<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">as shown below:<\/span><\/span><\/p>\n<p>&nbsp;<img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-6410\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2022\/07\/intellise.jpg\" alt=\"intellise\" width=\"650\" height=\"140\" style=\"display: block; margin-left: auto; margin-right: auto;\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2022\/07\/intellise.jpg 801w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2022\/07\/intellise-300x65.jpg 300w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2022\/07\/intellise-768x166.jpg 768w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/p>\n<p><span id=\"page14R_mcid1\" class=\"markedContent\"><span dir=\"ltr\" role=\"presentation\">The function<\/span><code><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">GetString<\/span><\/code><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">is<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">evaluated at compile<\/span><span dir=\"ltr\" role=\"presentation\">&#8211;<\/span><span dir=\"ltr\" role=\"presentation\">time<\/span><span dir=\"ltr\" role=\"presentation\">, as is displayed by<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">Visual Studio&#8217;s <\/span><span dir=\"ltr\" role=\"presentation\">I<\/span><span dir=\"ltr\" role=\"presentation\">ntelli<\/span><span dir=\"ltr\" role=\"presentation\">S<\/span><span dir=\"ltr\" role=\"presentation\">ense<\/span><span dir=\"ltr\" role=\"presentation\">.<\/span><\/span><span id=\"page14R_mcid2\" class=\"markedContent\"><br role=\"presentation\" \/><span dir=\"ltr\" role=\"presentation\"><\/span><\/span><\/p>\n<p><span id=\"page14R_mcid2\" class=\"markedContent\"><span dir=\"ltr\" role=\"presentation\">Of course, we&#8217;ve always had compile<\/span><span dir=\"ltr\" role=\"presentation\">&#8211;<\/span><span dir=\"ltr\" role=\"presentation\">time constructs (template metaprogramming uses compile<\/span><span dir=\"ltr\" role=\"presentation\">&#8211;<\/span><span dir=\"ltr\" role=\"presentation\">time evaluation extensively)<\/span><span dir=\"ltr\" role=\"presentation\">,<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">but these have often been esoteric (computing factor<\/span><span dir=\"ltr\" role=\"presentation\">ials at compile<\/span><span dir=\"ltr\" role=\"presentation\">&#8211; <\/span><span dir=\"ltr\" role=\"presentation\">time<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">for example<\/span><span dir=\"ltr\" role=\"presentation\">).<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">What makes<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><code><span dir=\"ltr\" role=\"presentation\">constexpr<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><\/code><span dir=\"ltr\" role=\"presentation\">so influential is<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">that it<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">opens the way to<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">re<\/span><span dir=\"ltr\" role=\"presentation\">designing <\/span><span dir=\"ltr\" role=\"presentation\">whole sections of a codebase from runtime to compile<\/span><span dir=\"ltr\" role=\"presentation\">&#8211;<\/span><span dir=\"ltr\" role=\"presentation\">time<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">evaluated code<\/span><span dir=\"ltr\" role=\"presentation\">.<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">As<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\"><code>constexpr<\/code> <\/span><span dir=\"ltr\" role=\"presentation\">permeates the STL, it encourages re<\/span><span dir=\"ltr\" role=\"presentation\">design and<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">refactoring.<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">Where once some code might have <\/span><span dir=\"ltr\" role=\"presentation\">been runtime evaluated, now we can<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">use<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><code><span dir=\"ltr\" role=\"presentation\">constexpr<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><\/code><span dir=\"ltr\" role=\"presentation\">to redesign it to be compile<\/span><span dir=\"ltr\" role=\"presentation\">&#8211;<\/span><span dir=\"ltr\" role=\"presentation\">time evaluated <\/span><span dir=\"ltr\" role=\"presentation\">and<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">hence<\/span><span dir=\"ltr\" role=\"presentation\"> <\/span><span dir=\"ltr\" role=\"presentation\">more efficient<\/span><span dir=\"ltr\" role=\"presentation\">.<\/span><\/span><\/p>\n<p>&nbsp;<\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today, I want to present the five winners of the vouchers for my book &#8220;C++ Core Guidelines Explained: Best Practices for Modern C++&#8221;.<\/p>\n","protected":false},"author":21,"featured_media":6401,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[360],"tags":[],"class_list":["post-6411","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"_links":{"self":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/6411","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=6411"}],"version-history":[{"count":0,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/6411\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media\/6401"}],"wp:attachment":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media?parent=6411"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/categories?post=6411"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/tags?post=6411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}