From 833647bd06276a63db4801c14a7f089e5f9f8504 Mon Sep 17 00:00:00 2001
From: Sebastien Gilles <sebastien.gilles@inria.fr>
Date: Thu, 25 Jul 2019 13:00:14 +0200
Subject: [PATCH] Add a new C++ 17 way to define properly a static data
 attribute.

---
 2-ObjectProgramming/5-static.ipynb | 34 +++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/2-ObjectProgramming/5-static.ipynb b/2-ObjectProgramming/5-static.ipynb
index 0ece550..d68a008 100644
--- a/2-ObjectProgramming/5-static.ipynb
+++ b/2-ObjectProgramming/5-static.ipynb
@@ -14,7 +14,7 @@
    },
    "source": [
     "<h1>Table of contents<span class=\"tocSkip\"></span></h1>\n",
-    "<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Static-in-C\" data-toc-modified-id=\"Static-in-C-1\">Static in C</a></span></li><li><span><a href=\"#Static-methods\" data-toc-modified-id=\"Static-methods-2\">Static methods</a></span><ul class=\"toc-item\"><li><span><a href=\"#Nitpick:-ClassName()-is-very-inefficient\" data-toc-modified-id=\"Nitpick:-ClassName()-is-very-inefficient-2.1\">Nitpick: <code>ClassName()</code> is very inefficient</a></span></li></ul></li><li><span><a href=\"#Static-data-attributes---to-avoid...-(see-next-section-to-understand-why!)\" data-toc-modified-id=\"Static-data-attributes---to-avoid...-(see-next-section-to-understand-why!)-3\">Static data attributes - to avoid... (see next section to understand why!)</a></span></li><li><span><a href=\"#Static-order-initialization-fiasco---and-its-fix\" data-toc-modified-id=\"Static-order-initialization-fiasco---and-its-fix-4\">Static order initialization fiasco - and its fix</a></span></li></ul></div>"
+    "<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Static-in-C\" data-toc-modified-id=\"Static-in-C-1\">Static in C</a></span></li><li><span><a href=\"#Static-methods\" data-toc-modified-id=\"Static-methods-2\">Static methods</a></span><ul class=\"toc-item\"><li><span><a href=\"#Nitpick:-ClassName()-is-very-inefficient\" data-toc-modified-id=\"Nitpick:-ClassName()-is-very-inefficient-2.1\">Nitpick: <code>ClassName()</code> is very inefficient</a></span></li></ul></li><li><span><a href=\"#Static-data-attributes---to-avoid...-(see-next-section-to-understand-why!)\" data-toc-modified-id=\"Static-data-attributes---to-avoid...-(see-next-section-to-understand-why!)-3\">Static data attributes - to avoid... (see next section to understand why!)</a></span></li><li><span><a href=\"#Static-order-initialization-fiasco---and-its-fix\" data-toc-modified-id=\"Static-order-initialization-fiasco---and-its-fix-4\">Static order initialization fiasco - and its fix</a></span><ul class=\"toc-item\"><li><span><a href=\"#Update:\" data-toc-modified-id=\"Update:-4.1\">Update:</a></span></li></ul></li></ul></div>"
    ]
   },
   {
@@ -403,6 +403,38 @@
     "* The dedicated item on [Parashift FAQ](https://isocpp.org/wiki/faq/ctors#static-init-order)\n"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Update:\n",
+    "\n",
+    "C++ 17 actually provides a way to define the value in the header file with the `inline` keyword:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "struct Class4\n",
+    "{\n",
+    "    Class4();\n",
+    "    \n",
+    "    ~Class4();\n",
+    "    \n",
+    "    static inline int Ninstance_ = 0;\n",
+    "};"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Thanks to this [FluentCpp post](https://www.fluentcpp.com/2019/07/23/how-to-define-a-global-constant-in-cpp/) that gave me the hint!"
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
-- 
GitLab