CINXE.COM

April 2018 – Sutter’s Mill

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="profile" href="http://gmpg.org/xfn/11"> <title>April 2018 &#8211; Sutter’s Mill</title> <script type="text/javascript"> WebFontConfig = {"google":{"families":["Alegreya+Sans:r:latin,latin-ext","Noticia+Text:r,i,b,bi:latin,latin-ext"]},"api_url":"https:\/\/fonts-api.wp.com\/css"}; (function() { var wf = document.createElement('script'); wf.src = 'https://s0.wp.com/wp-content/plugins/custom-fonts/js/webfont.js'; wf.type = 'text/javascript'; wf.async = 'true'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(wf, s); })(); </script><style id="jetpack-custom-fonts-css">.wf-active code, .wf-active kbd, .wf-active pre, .wf-active samp{font-family:"Noticia Text",serif}.wf-active body{font-family:"Noticia Text",serif}.wf-active button, .wf-active input, .wf-active select{font-family:"Noticia Text",serif}.wf-active textarea{font-family:"Noticia Text",serif}.wf-active blockquote{font-family:"Noticia Text",serif}.wf-active code, .wf-active kbd, .wf-active pre, .wf-active tt, .wf-active var{font-family:"Noticia Text",serif}.wf-active .button, .wf-active .more-link, .wf-active button:not(.menu-toggle), .wf-active input[type="button"], .wf-active input[type="reset"], .wf-active input[type="submit"], .wf-active .posts-navigation .nav-links a, .wf-active #content #infinite-handle span button{font-family:"Noticia Text",serif}.wf-active input[type="email"], .wf-active input[type="password"], .wf-active input[type="search"], .wf-active input[type="text"], .wf-active input[type="url"], .wf-active textarea{font-family:"Noticia Text",serif}.wf-active .post-navigation{font-family:"Noticia Text",serif}.wf-active .main-navigation{font-family:"Noticia Text",serif}.wf-active .entry-content, .wf-active .entry-summary, .wf-active .page-content{font-family:"Noticia Text",serif}.wf-active .entry-content .subtitle{font-family:"Noticia Text",serif}.wf-active #comments{font-family:"Noticia Text",serif}.wf-active .comment-form label{font-family:"Noticia Text",serif}.wf-active .comment-form span.required{font-family:"Noticia Text",serif}.wf-active .widget_recent_entries span.post-date{font-family:"Noticia Text",serif}.wf-active .site-description{font-family:"Noticia Text",serif}.wf-active .site-posted-on time{font-family:"Noticia Text",serif}.wf-active .page-header:not(.page-header-light) .taxonomy-description{font-family:"Noticia Text",serif}.wf-active .light-text{font-family:"Noticia Text",serif}.wf-active .site-info{font-family:"Noticia Text",serif}.wf-active .sticky-label{font-family:"Noticia Text",serif}.wf-active .post-details, .wf-active .post-details a{font-family:"Noticia Text",serif}.wf-active .page-links{font-family:"Noticia Text",serif}.wf-active .post-edit-link{font-family:"Noticia Text",serif}.wf-active .post-author-card .author-description{font-family:"Noticia Text",serif}.wf-active #tinymce h1, .wf-active #tinymce h2, .wf-active #tinymce h3, .wf-active #tinymce h4, .wf-active #tinymce h5, .wf-active #tinymce h6, .wf-active .comment-content h1, .wf-active .comment-content h2, .wf-active .comment-content h3, .wf-active .comment-content h4, .wf-active .comment-content h5, .wf-active .comment-content h6, .wf-active .entry-content h1, .wf-active .entry-content h2, .wf-active .entry-content h3, .wf-active .entry-content h4, .wf-active .entry-content h5, .wf-active .entry-content h6, .wf-active .entry-summary h1, .wf-active .entry-summary h2, .wf-active .entry-summary h3, .wf-active .entry-summary h4, .wf-active .entry-summary h5, .wf-active .entry-summary h6, .wf-active .widget_text h1, .wf-active .widget_text h2, .wf-active .widget_text h3, .wf-active .widget_text h4, .wf-active .widget_text h5, .wf-active .widget_text h6{font-family:"Alegreya Sans",sans-serif;font-style:normal;font-weight:400}.wf-active h1{font-style:normal;font-weight:400}.wf-active h2{font-style:normal;font-weight:400}.wf-active h3{font-style:normal;font-weight:400}.wf-active h4{font-style:normal;font-weight:400}.wf-active h5{font-style:normal;font-weight:400}.wf-active h6{font-style:normal;font-weight:400}.wf-active blockquote h1, .wf-active blockquote h2, .wf-active blockquote h3, .wf-active blockquote h4{font-family:"Alegreya Sans",sans-serif;font-weight:400;font-style:normal}.wf-active div#jp-relatedposts h3.jp-relatedposts-headline em{font-family:"Alegreya Sans",sans-serif;font-style:normal;font-weight:400}.wf-active .comment-reply-title, .wf-active .comments-title{font-family:"Alegreya Sans",sans-serif;font-weight:400;font-style:normal}.wf-active .image-post-title{font-family:"Alegreya Sans",sans-serif;font-weight:400;font-style:normal}.wf-active .page-header:not(.page-header-light) h1{font-style:normal;font-weight:400}.wf-active .entry-title{font-family:"Alegreya Sans",sans-serif;font-style:normal;font-weight:400}.wf-active #post-cover-image .cover-meta .single-post-title{font-family:"Alegreya Sans",sans-serif;font-style:normal;font-weight:400}.wf-active #hero-header .site-title{font-family:"Alegreya Sans",sans-serif;font-style:normal;font-weight:400}.wf-active .site-header .site-title{font-style:normal;font-weight:400}.wf-active .site-header .site-description{font-style:normal;font-weight:400}</style> <meta name='robots' content='max-image-preview:large' /> <!-- Async WordPress.com Remote Login --> <script id="wpcom_remote_login_js"> var wpcom_remote_login_extra_auth = ''; function wpcom_remote_login_remove_dom_node_id( element_id ) { var dom_node = document.getElementById( element_id ); if ( dom_node ) { dom_node.parentNode.removeChild( dom_node ); } } function wpcom_remote_login_remove_dom_node_classes( class_name ) { var dom_nodes = document.querySelectorAll( '.' + class_name ); for ( var i = 0; i < dom_nodes.length; i++ ) { dom_nodes[ i ].parentNode.removeChild( dom_nodes[ i ] ); } } function wpcom_remote_login_final_cleanup() { wpcom_remote_login_remove_dom_node_classes( "wpcom_remote_login_msg" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_validate" ); wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_js" ); wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_iframe" ); wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_styles" ); } // Watch for messages back from the remote login window.addEventListener( "message", function( e ) { if ( e.origin === "https://r-login.wordpress.com" ) { var data = {}; try { data = JSON.parse( e.data ); } catch( e ) { wpcom_remote_login_final_cleanup(); return; } if ( data.msg === 'LOGIN' ) { // Clean up the login check iframe wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); var id_regex = new RegExp( /^[0-9]+$/ ); var token_regex = new RegExp( /^.*|.*|.*$/ ); if ( token_regex.test( data.token ) && id_regex.test( data.wpcomid ) ) { // We have everything we need to ask for a login var script = document.createElement( "script" ); script.setAttribute( "id", "wpcom_remote_login_validate" ); script.src = '/remote-login.php?wpcom_remote_login=validate' + '&wpcomid=' + data.wpcomid + '&token=' + encodeURIComponent( data.token ) + '&host=' + window.location.protocol + '//' + window.location.hostname + '&postid=3664' + '&is_singular='; document.body.appendChild( script ); } return; } // Safari ITP, not logged in, so redirect if ( data.msg === 'LOGIN-REDIRECT' ) { window.location = 'https://wordpress.com/log-in?redirect_to=' + window.location.href; return; } // Safari ITP, storage access failed, remove the request if ( data.msg === 'LOGIN-REMOVE' ) { var css_zap = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } @media screen and ( max-width: 782px ) { html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } }'; var style_zap = document.createElement( 'style' ); style_zap.type = 'text/css'; style_zap.appendChild( document.createTextNode( css_zap ) ); document.body.appendChild( style_zap ); var e = document.getElementById( 'wpcom_request_access_iframe' ); e.parentNode.removeChild( e ); document.cookie = 'wordpress_com_login_access=denied; path=/; max-age=31536000'; return; } // Safari ITP if ( data.msg === 'REQUEST_ACCESS' ) { console.log( 'request access: safari' ); // Check ITP iframe enable/disable knob if ( wpcom_remote_login_extra_auth !== 'safari_itp_iframe' ) { return; } // If we are in a "private window" there is no ITP. var private_window = false; try { var opendb = window.openDatabase( null, null, null, null ); } catch( e ) { private_window = true; } if ( private_window ) { console.log( 'private window' ); return; } var iframe = document.createElement( 'iframe' ); iframe.id = 'wpcom_request_access_iframe'; iframe.setAttribute( 'scrolling', 'no' ); iframe.setAttribute( 'sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-top-navigation-by-user-activation' ); iframe.src = 'https://r-login.wordpress.com/remote-login.php?wpcom_remote_login=request_access&origin=' + encodeURIComponent( data.origin ) + '&wpcomid=' + encodeURIComponent( data.wpcomid ); var css = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 46px !important; } * html body { margin-top: 46px !important; } @media screen and ( max-width: 660px ) { html { margin-top: 71px !important; } * html body { margin-top: 71px !important; } #wpcom_request_access_iframe { display: block; height: 71px !important; } } #wpcom_request_access_iframe { border: 0px; height: 46px; position: fixed; top: 0; left: 0; width: 100%; min-width: 100%; z-index: 99999; background: #23282d; } '; var style = document.createElement( 'style' ); style.type = 'text/css'; style.id = 'wpcom_request_access_styles'; style.appendChild( document.createTextNode( css ) ); document.body.appendChild( style ); document.body.appendChild( iframe ); } if ( data.msg === 'DONE' ) { wpcom_remote_login_final_cleanup(); } } }, false ); // Inject the remote login iframe after the page has had a chance to load // more critical resources window.addEventListener( "DOMContentLoaded", function( e ) { var iframe = document.createElement( "iframe" ); iframe.style.display = "none"; iframe.setAttribute( "scrolling", "no" ); iframe.setAttribute( "id", "wpcom_remote_login_key" ); iframe.src = "https://r-login.wordpress.com/remote-login.php" + "?wpcom_remote_login=key" + "&origin=aHR0cHM6Ly9oZXJic3V0dGVyLmNvbQ%3D%3D" + "&wpcomid=3379246" + "&time=1740574670"; document.body.appendChild( iframe ); }, false ); </script> <link rel='dns-prefetch' href='//s2.wp.com' /> <link rel='dns-prefetch' href='//s1.wp.com' /> <link rel='dns-prefetch' href='//s0.wp.com' /> <link rel="alternate" type="application/rss+xml" title="Sutter’s Mill &raquo; Feed" href="https://herbsutter.com/feed/" /> <link rel="alternate" type="application/rss+xml" title="Sutter’s Mill &raquo; Comments Feed" href="https://herbsutter.com/comments/feed/" /> <script type="text/javascript"> /* <![CDATA[ */ function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function () { oldonload(); func(); } } } /* ]]> */ </script> <script type="text/javascript"> /* <![CDATA[ */ window._wpemojiSettings = {"baseUrl":"https:\/\/s0.wp.com\/wp-content\/mu-plugins\/wpcom-smileys\/twemoji\/2\/72x72\/","ext":".png","svgUrl":"https:\/\/s0.wp.com\/wp-content\/mu-plugins\/wpcom-smileys\/twemoji\/2\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/s2.wp.com\/wp-includes\/js\/wp-emoji-release.min.js?m=1719498190i&ver=6.7.2-RC1-59780"}}; /*! This file is auto-generated */ !function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings); /* ]]> */ </script> <style id='wp-emoji-styles-inline-css'> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-2-1' href='https://s1.wp.com/_static/??-eJyljkEKwyAQRS9UMxoCWZWeRc1gTY3KzNjg7Zt2U+gq0OXn8R4f9qp8yYJZoKYWYmYI7ZgOKRyEEJ6jHvQwgmsxLeBS8Q+VoiNLHVh6wsEzX+C/kNxxOxP6WAwrSrVv3fbSRAWKy+kvPwmyEnPgr37brmaetNaTMfP6AnHzajo=&cssminify=yes' type='text/css' media='all' /> <style id='wp-block-library-inline-css'> .has-text-align-justify { text-align:justify; } .has-text-align-justify{text-align:justify;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-4-1' href='https://s2.wp.com/_static/??-eJzTLy/QzcxLzilNSS3WzyrWz01NyUxMzUnNTc0rQeEU5CRWphbp5qSmJyZX6uVm5uklFxfr6OPTDpRD5sM02efaGpoZmFkYGRuZGmQBAHPvL0Y=&cssminify=yes' type='text/css' media='all' /> <style id='jetpack-sharing-buttons-style-inline-css'> .jetpack-sharing-buttons__services-list{display:flex;flex-direction:row;flex-wrap:wrap;gap:0;list-style-type:none;margin:5px;padding:0}.jetpack-sharing-buttons__services-list.has-small-icon-size{font-size:12px}.jetpack-sharing-buttons__services-list.has-normal-icon-size{font-size:16px}.jetpack-sharing-buttons__services-list.has-large-icon-size{font-size:24px}.jetpack-sharing-buttons__services-list.has-huge-icon-size{font-size:36px}@media print{.jetpack-sharing-buttons__services-list{display:none!important}}.editor-styles-wrapper .wp-block-jetpack-sharing-buttons{gap:0;padding-inline-start:0}ul.jetpack-sharing-buttons__services-list.has-background{padding:1.25em 2.375em} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-6-1' href='https://s2.wp.com/wp-content/plugins/coblocks/2.18.1-simple-rev.4/dist/coblocks-style.css?m=1681832297i&cssminify=yes' type='text/css' media='all' /> <style id='classic-theme-styles-inline-css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-8-1' href='https://s1.wp.com/_static/??/wp-content/mu-plugins/core-compat/wp-mediaelement.css,/wp-content/mu-plugins/wpcom-bbpress-premium-themes.css?m=1432920480j&cssminify=yes' type='text/css' media='all' /> <style id='global-styles-inline-css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--medium-blue: #0087be;--wp--preset--color--bright-blue: #00aadc;--wp--preset--color--dark-gray: #4d4d4b;--wp--preset--color--light-gray: #b3b3b1;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-family--albert-sans: 'Albert Sans', sans-serif;--wp--preset--font-family--alegreya: Alegreya, serif;--wp--preset--font-family--arvo: Arvo, serif;--wp--preset--font-family--bodoni-moda: 'Bodoni Moda', serif;--wp--preset--font-family--bricolage-grotesque: 'Bricolage Grotesque', sans-serif;--wp--preset--font-family--cabin: Cabin, sans-serif;--wp--preset--font-family--chivo: Chivo, sans-serif;--wp--preset--font-family--commissioner: Commissioner, sans-serif;--wp--preset--font-family--cormorant: Cormorant, serif;--wp--preset--font-family--courier-prime: 'Courier Prime', monospace;--wp--preset--font-family--crimson-pro: 'Crimson Pro', serif;--wp--preset--font-family--dm-mono: 'DM Mono', monospace;--wp--preset--font-family--dm-sans: 'DM Sans', sans-serif;--wp--preset--font-family--dm-serif-display: 'DM Serif Display', serif;--wp--preset--font-family--domine: Domine, serif;--wp--preset--font-family--eb-garamond: 'EB Garamond', serif;--wp--preset--font-family--epilogue: Epilogue, sans-serif;--wp--preset--font-family--fahkwang: Fahkwang, sans-serif;--wp--preset--font-family--figtree: Figtree, sans-serif;--wp--preset--font-family--fira-sans: 'Fira Sans', sans-serif;--wp--preset--font-family--fjalla-one: 'Fjalla One', sans-serif;--wp--preset--font-family--fraunces: Fraunces, serif;--wp--preset--font-family--gabarito: Gabarito, system-ui;--wp--preset--font-family--ibm-plex-mono: 'IBM Plex Mono', monospace;--wp--preset--font-family--ibm-plex-sans: 'IBM Plex Sans', sans-serif;--wp--preset--font-family--ibarra-real-nova: 'Ibarra Real Nova', serif;--wp--preset--font-family--instrument-serif: 'Instrument Serif', serif;--wp--preset--font-family--inter: Inter, sans-serif;--wp--preset--font-family--josefin-sans: 'Josefin Sans', sans-serif;--wp--preset--font-family--jost: Jost, sans-serif;--wp--preset--font-family--libre-baskerville: 'Libre Baskerville', serif;--wp--preset--font-family--libre-franklin: 'Libre Franklin', sans-serif;--wp--preset--font-family--literata: Literata, serif;--wp--preset--font-family--lora: Lora, serif;--wp--preset--font-family--merriweather: Merriweather, serif;--wp--preset--font-family--montserrat: Montserrat, sans-serif;--wp--preset--font-family--newsreader: Newsreader, serif;--wp--preset--font-family--noto-sans-mono: 'Noto Sans Mono', sans-serif;--wp--preset--font-family--nunito: Nunito, sans-serif;--wp--preset--font-family--open-sans: 'Open Sans', sans-serif;--wp--preset--font-family--overpass: Overpass, sans-serif;--wp--preset--font-family--pt-serif: 'PT Serif', serif;--wp--preset--font-family--petrona: Petrona, serif;--wp--preset--font-family--piazzolla: Piazzolla, serif;--wp--preset--font-family--playfair-display: 'Playfair Display', serif;--wp--preset--font-family--plus-jakarta-sans: 'Plus Jakarta Sans', sans-serif;--wp--preset--font-family--poppins: Poppins, sans-serif;--wp--preset--font-family--raleway: Raleway, sans-serif;--wp--preset--font-family--roboto: Roboto, sans-serif;--wp--preset--font-family--roboto-slab: 'Roboto Slab', serif;--wp--preset--font-family--rubik: Rubik, sans-serif;--wp--preset--font-family--rufina: Rufina, serif;--wp--preset--font-family--sora: Sora, sans-serif;--wp--preset--font-family--source-sans-3: 'Source Sans 3', sans-serif;--wp--preset--font-family--source-serif-4: 'Source Serif 4', serif;--wp--preset--font-family--space-mono: 'Space Mono', monospace;--wp--preset--font-family--syne: Syne, sans-serif;--wp--preset--font-family--texturina: Texturina, serif;--wp--preset--font-family--urbanist: Urbanist, sans-serif;--wp--preset--font-family--work-sans: 'Work Sans', sans-serif;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-albert-sans-font-family{font-family: var(--wp--preset--font-family--albert-sans) !important;}.has-alegreya-font-family{font-family: var(--wp--preset--font-family--alegreya) !important;}.has-arvo-font-family{font-family: var(--wp--preset--font-family--arvo) !important;}.has-bodoni-moda-font-family{font-family: var(--wp--preset--font-family--bodoni-moda) !important;}.has-bricolage-grotesque-font-family{font-family: var(--wp--preset--font-family--bricolage-grotesque) !important;}.has-cabin-font-family{font-family: var(--wp--preset--font-family--cabin) !important;}.has-chivo-font-family{font-family: var(--wp--preset--font-family--chivo) !important;}.has-commissioner-font-family{font-family: var(--wp--preset--font-family--commissioner) !important;}.has-cormorant-font-family{font-family: var(--wp--preset--font-family--cormorant) !important;}.has-courier-prime-font-family{font-family: var(--wp--preset--font-family--courier-prime) !important;}.has-crimson-pro-font-family{font-family: var(--wp--preset--font-family--crimson-pro) !important;}.has-dm-mono-font-family{font-family: var(--wp--preset--font-family--dm-mono) !important;}.has-dm-sans-font-family{font-family: var(--wp--preset--font-family--dm-sans) !important;}.has-dm-serif-display-font-family{font-family: var(--wp--preset--font-family--dm-serif-display) !important;}.has-domine-font-family{font-family: var(--wp--preset--font-family--domine) !important;}.has-eb-garamond-font-family{font-family: var(--wp--preset--font-family--eb-garamond) !important;}.has-epilogue-font-family{font-family: var(--wp--preset--font-family--epilogue) !important;}.has-fahkwang-font-family{font-family: var(--wp--preset--font-family--fahkwang) !important;}.has-figtree-font-family{font-family: var(--wp--preset--font-family--figtree) !important;}.has-fira-sans-font-family{font-family: var(--wp--preset--font-family--fira-sans) !important;}.has-fjalla-one-font-family{font-family: var(--wp--preset--font-family--fjalla-one) !important;}.has-fraunces-font-family{font-family: var(--wp--preset--font-family--fraunces) !important;}.has-gabarito-font-family{font-family: var(--wp--preset--font-family--gabarito) !important;}.has-ibm-plex-mono-font-family{font-family: var(--wp--preset--font-family--ibm-plex-mono) !important;}.has-ibm-plex-sans-font-family{font-family: var(--wp--preset--font-family--ibm-plex-sans) !important;}.has-ibarra-real-nova-font-family{font-family: var(--wp--preset--font-family--ibarra-real-nova) !important;}.has-instrument-serif-font-family{font-family: var(--wp--preset--font-family--instrument-serif) !important;}.has-inter-font-family{font-family: var(--wp--preset--font-family--inter) !important;}.has-josefin-sans-font-family{font-family: var(--wp--preset--font-family--josefin-sans) !important;}.has-jost-font-family{font-family: var(--wp--preset--font-family--jost) !important;}.has-libre-baskerville-font-family{font-family: var(--wp--preset--font-family--libre-baskerville) !important;}.has-libre-franklin-font-family{font-family: var(--wp--preset--font-family--libre-franklin) !important;}.has-literata-font-family{font-family: var(--wp--preset--font-family--literata) !important;}.has-lora-font-family{font-family: var(--wp--preset--font-family--lora) !important;}.has-merriweather-font-family{font-family: var(--wp--preset--font-family--merriweather) !important;}.has-montserrat-font-family{font-family: var(--wp--preset--font-family--montserrat) !important;}.has-newsreader-font-family{font-family: var(--wp--preset--font-family--newsreader) !important;}.has-noto-sans-mono-font-family{font-family: var(--wp--preset--font-family--noto-sans-mono) !important;}.has-nunito-font-family{font-family: var(--wp--preset--font-family--nunito) !important;}.has-open-sans-font-family{font-family: var(--wp--preset--font-family--open-sans) !important;}.has-overpass-font-family{font-family: var(--wp--preset--font-family--overpass) !important;}.has-pt-serif-font-family{font-family: var(--wp--preset--font-family--pt-serif) !important;}.has-petrona-font-family{font-family: var(--wp--preset--font-family--petrona) !important;}.has-piazzolla-font-family{font-family: var(--wp--preset--font-family--piazzolla) !important;}.has-playfair-display-font-family{font-family: var(--wp--preset--font-family--playfair-display) !important;}.has-plus-jakarta-sans-font-family{font-family: var(--wp--preset--font-family--plus-jakarta-sans) !important;}.has-poppins-font-family{font-family: var(--wp--preset--font-family--poppins) !important;}.has-raleway-font-family{font-family: var(--wp--preset--font-family--raleway) !important;}.has-roboto-font-family{font-family: var(--wp--preset--font-family--roboto) !important;}.has-roboto-slab-font-family{font-family: var(--wp--preset--font-family--roboto-slab) !important;}.has-rubik-font-family{font-family: var(--wp--preset--font-family--rubik) !important;}.has-rufina-font-family{font-family: var(--wp--preset--font-family--rufina) !important;}.has-sora-font-family{font-family: var(--wp--preset--font-family--sora) !important;}.has-source-sans-3-font-family{font-family: var(--wp--preset--font-family--source-sans-3) !important;}.has-source-serif-4-font-family{font-family: var(--wp--preset--font-family--source-serif-4) !important;}.has-space-mono-font-family{font-family: var(--wp--preset--font-family--space-mono) !important;}.has-syne-font-family{font-family: var(--wp--preset--font-family--syne) !important;}.has-texturina-font-family{font-family: var(--wp--preset--font-family--texturina) !important;}.has-urbanist-font-family{font-family: var(--wp--preset--font-family--urbanist) !important;}.has-work-sans-font-family{font-family: var(--wp--preset--font-family--work-sans) !important;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-10-1' href='https://s0.wp.com/_static/??-eJydj70OgzAMhF+oqfsDZar6KFUxFgQSx8KOUN++AXXo0InldDd8dzpYxGFiIzaI2UnIvWeFkUxeOH0zaGZ4ekboiWn2BdD/9oiqB/jptIEiKUhuwXNHQkXYXMnB60Czu4DaO9AesCDQhoTTrtn1zjbtFsEU14pHvJ+ba3Or6lNdjR/JRGmL&cssminify=yes' type='text/css' media='all' /> <style id='independent-publisher-2-style-inline-css'> .cat-links, .post-tags, .tags-links { clip: rect(1px, 1px, 1px, 1px); height: 1px; position: absolute; overflow: hidden; width: 1px; } </style> <style id='akismet-widget-style-inline-css'> .a-stats { --akismet-color-mid-green: #357b49; --akismet-color-white: #fff; --akismet-color-light-grey: #f6f7f7; max-width: 350px; width: auto; } .a-stats * { all: unset; box-sizing: border-box; } .a-stats strong { font-weight: 600; } .a-stats a.a-stats__link, .a-stats a.a-stats__link:visited, .a-stats a.a-stats__link:active { background: var(--akismet-color-mid-green); border: none; box-shadow: none; border-radius: 8px; color: var(--akismet-color-white); cursor: pointer; display: block; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen-Sans', 'Ubuntu', 'Cantarell', 'Helvetica Neue', sans-serif; font-weight: 500; padding: 12px; text-align: center; text-decoration: none; transition: all 0.2s ease; } /* Extra specificity to deal with TwentyTwentyOne focus style */ .widget .a-stats a.a-stats__link:focus { background: var(--akismet-color-mid-green); color: var(--akismet-color-white); text-decoration: none; } .a-stats a.a-stats__link:hover { filter: brightness(110%); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06), 0 0 2px rgba(0, 0, 0, 0.16); } .a-stats .count { color: var(--akismet-color-white); display: block; font-size: 1.5em; line-height: 1.4; padding: 0 13px; white-space: nowrap; } </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-12-1' href='https://s1.wp.com/_static/??-eJzTLy/QTc7PK0nNK9HPLdUtyClNz8wr1i9KTcrJTwcy0/WTi5G5ekCujj52Temp+bo5+cmJJZn5eSgc3bScxMwikFb7XFtDE1NLExMLc0OTLACohS2q&cssminify=yes' type='text/css' media='all' /> <link crossorigin='anonymous' rel='stylesheet' id='print-css-13-1' href='https://s1.wp.com/wp-content/mu-plugins/global-print/global-print.css?m=1465851035i&cssminify=yes' type='text/css' media='print' /> <style id='jetpack-global-styles-frontend-style-inline-css'> :root { --font-headings: unset; --font-base: unset; --font-headings-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; --font-base-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;} </style> <link crossorigin='anonymous' rel='stylesheet' id='all-css-16-1' href='https://s2.wp.com/wp-content/themes/h4/global.css?m=1420737423i&cssminify=yes' type='text/css' media='all' /> <script type="text/javascript" id="wpcom-actionbar-placeholder-js-extra"> /* <![CDATA[ */ var actionbardata = {"siteID":"3379246","postID":"0","siteURL":"https:\/\/herbsutter.com","xhrURL":"https:\/\/herbsutter.com\/wp-admin\/admin-ajax.php","nonce":"7f4d393db3","isLoggedIn":"","statusMessage":"","subsEmailDefault":"instantly","proxyScriptUrl":"https:\/\/s0.wp.com\/wp-content\/js\/wpcom-proxy-request.js?ver=20211021","i18n":{"followedText":"New posts from this site will now appear in your <a href=\"https:\/\/wordpress.com\/reader\">Reader<\/a>","foldBar":"Collapse this bar","unfoldBar":"Expand this bar","shortLinkCopied":"Shortlink copied to clipboard."}}; /* ]]> */ </script> <script type="text/javascript" id="jetpack-mu-wpcom-settings-js-before"> /* <![CDATA[ */ var JETPACK_MU_WPCOM_SETTINGS = {"assetsUrl":"https:\/\/s1.wp.com\/wp-content\/mu-plugins\/jetpack-mu-wpcom-plugin\/sun\/jetpack_vendor\/automattic\/jetpack-mu-wpcom\/src\/build\/"}; /* ]]> */ </script> <script crossorigin='anonymous' type='text/javascript' src='https://s2.wp.com/_static/??-eJzTLy/QzcxLzilNSS3WzwKiwtLUokoopZebmaeXVayjj0+Rbm5melFiSSqy4uT8vJLUvBJMA8sLkvNzdQuK8isqdYtSgWLFJVj0FOWUQNQA5exzbQ3NjQxMjQ3MLCyzAMS4QKo='></script> <script type="text/javascript" id="rlt-proxy-js-after"> /* <![CDATA[ */ rltInitialize( {"token":null,"iframeOrigins":["https:\/\/widgets.wp.com"]} ); /* ]]> */ </script> <link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://herbsutter.wordpress.com/xmlrpc.php?rsd" /> <meta name="generator" content="WordPress.com" /> <!-- Jetpack Open Graph Tags --> <meta property="og:type" content="website" /> <meta property="og:title" content="April 2018 &#8211; Sutter’s Mill" /> <meta property="og:site_name" content="Sutter’s Mill" /> <meta property="og:image" content="https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=200&#038;ts=1740574670" /> <meta property="og:image:width" content="200" /> <meta property="og:image:height" content="200" /> <meta property="og:image:alt" content="" /> <meta property="og:locale" content="en_US" /> <meta name="twitter:creator" content="@herbsutter" /> <!-- End Jetpack Open Graph Tags --> <link rel="shortcut icon" type="image/x-icon" href="https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=32" sizes="16x16" /> <link rel="icon" type="image/x-icon" href="https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=32" sizes="16x16" /> <link rel="apple-touch-icon" href="https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=114" /> <link rel='openid.server' href='https://herbsutter.com/?openidserver=1' /> <link rel='openid.delegate' href='https://herbsutter.com/' /> <link rel="search" type="application/opensearchdescription+xml" href="https://herbsutter.com/osd.xml" title="Sutter’s Mill" /> <link rel="search" type="application/opensearchdescription+xml" href="https://s1.wp.com/opensearch.xml" title="WordPress.com" /> <style type="text/css"> .recentcomments a { display: inline !important; padding: 0 !important; margin: 0 !important; } table.recentcommentsavatartop img.avatar, table.recentcommentsavatarend img.avatar { border: 0px; margin: 0; } table.recentcommentsavatartop a, table.recentcommentsavatarend a { border: 0px !important; background-color: transparent !important; } td.recentcommentsavatarend, td.recentcommentsavatartop { padding: 0px 0px 1px 0px; margin: 0px; } td.recentcommentstextend { border: none !important; padding: 0px 0px 2px 10px; } .rtl td.recentcommentstextend { padding: 0px 10px 2px 0px; } td.recentcommentstexttop { border: none; padding: 0px 0px 0px 10px; } .rtl td.recentcommentstexttop { padding: 0px 10px 0px 0px; } </style> <meta name="description" content="1 post published by Herb Sutter during April 2018" /> </head> <body class="archive date wp-embed-responsive customizer-styles-applied has-sidebar jetpack-reblog-enabled categories-hidden tags-hidden"> <div id="page" class="hfeed site"> <a class="skip-link screen-reader-text" href="#content">Skip to content</a> <div id="hero-header" class="site-hero-section"> <header id="masthead" class="site-header" role="banner"> <div class="inner"> <div class="site-branding"> <a class="site-logo-link" href="https://herbsutter.com/"> <img alt='' src='https://0.gravatar.com/avatar/928f5830f12d8977791539452bfc25c92912322476f0725253697ee1c45ce036?s=80&#038;d=identicon&#038;r=G' srcset='https://0.gravatar.com/avatar/928f5830f12d8977791539452bfc25c92912322476f0725253697ee1c45ce036?s=80&#038;d=identicon&#038;r=G 1x, https://0.gravatar.com/avatar/928f5830f12d8977791539452bfc25c92912322476f0725253697ee1c45ce036?s=120&#038;d=identicon&#038;r=G 1.5x, https://0.gravatar.com/avatar/928f5830f12d8977791539452bfc25c92912322476f0725253697ee1c45ce036?s=160&#038;d=identicon&#038;r=G 2x, https://0.gravatar.com/avatar/928f5830f12d8977791539452bfc25c92912322476f0725253697ee1c45ce036?s=240&#038;d=identicon&#038;r=G 3x, https://0.gravatar.com/avatar/928f5830f12d8977791539452bfc25c92912322476f0725253697ee1c45ce036?s=320&#038;d=identicon&#038;r=G 4x' class='avatar avatar-80 site-logo-image' height='80' width='80' loading='eager' decoding='async' /> </a><!-- .site-logo-link --> <p class="site-title"><a href="https://herbsutter.com/" rel="home">Sutter’s Mill</a></p> <p class="site-description">Herb Sutter on software development</p> </div><!-- .site-branding --> </div><!-- .inner --> </header><!-- #masthead --> </div> <div id="content-wrapper" class="content-wrapper"> <div id="content" class="site-content"> <div id="primary" class="content-area"> <main id="main" class="site-main" role="main"> <header class="page-header"> <h1 class="page-title">Month: <span>April 2018</span></h1> </header><!-- .page-header --> <article id="post-3664" class="post-3664 post type-post status-publish format-standard hentry category-c"> <header class="entry-header"> <h1 class="entry-title"><a href="https://herbsutter.com/2018/04/02/trip-report-winter-iso-c-standards-meeting-jacksonville/" rel="bookmark">Trip report: Winter ISO C++ standards meeting&nbsp;(Jacksonville)</a></h1> </header><!-- .entry-header --> <div class="entry-content"> <p><em>[Edited to add C++20 schedule at end]</em></p> <p>On Saturday March 17, the ISO C++ committee completed its winter meeting in Jacksonville, Florida, USA, hosted with thanks by the <a href="http://isocpp.org/about">Standard C++ Foundation</a> and <a href="https://peren.com/">Perennial</a>. We had some 140 people at the meeting, representing 8 national bodies. As usual, we met for six days Monday through Saturday, including all evenings.</p> <p>A special highlight was on Thursday evening (the only non-officially-working evening) when Bjarne Stroustrup personally hosted the entire committee for a celebratory dinner to share the <a href="https://isocpp.org/blog/2018/02/bjarne-stroustrup-receives-draper-prize-engineerings-top-u.s.-honor">2018 Charles Stark Draper Prize</a>, the U.S.’s top engineering honor, which this year was awarded for a programming language for only the second time in its history. Although the prize was awarded to Bjarne personally, he made it clear that he considered this an award for the whole C++ community, without whom C++ would never have been successful, and so he hosted the dinner for the committee as a representative proxy for the entire worldwide C++ community. — So to all C++ programmers and contributors who are reading this: Thank you, from Bjarne and from us, for your support, and consider yourselves part of this year’s Draper Prize.</p> <p>The following are some highlights of what we achieved this week. You can find a brief summary of ISO procedures <a href="https://isocpp.org/std/iso-iec-jtc1-procedures">here</a>. The main things to note are:</p> <ul> <li>“IS” means “international standard.” In our case, it’s the core C++ standard itself. Think of this as “trunk.”</li> <li>“TS” means “technical specification,” a document separate from the main standard where we can gain experience with new features before putting them into the IS. We have several of these, summarized on the <a href="http://isocpp.org/std/status">status page</a>. Think of these as “beta branches.”</li> </ul> <h2>Leading up to this meeting</h2> <p>As I reported in my <a href="https://herbsutter.com/2017/11/11/trip-report-fall-iso-c-standards-meeting-albuquerque/">previous trip report</a> for the fall meeting (Albuquerque 2017), last time we almost completed addressing the comments received from national bodies in the Modules comment ballot that ran last summer. The rest were addressed in a series of teleconferences between meetings, and the <strong>Modules TS</strong> was finalized and shipped to ISO at the end of January.</p> <p>One of the highlights in the pre-meeting mailing was <a href="http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p0939r0.pdf"><strong>“Direction for ISO C++” (Beman Dawes, Howard Hinnant, Bjarne Stroustrup, Daveed Vandevoorde, Michael Wong)</strong></a>. Although non-binding, it’s the first set of recommendations from our recently created advisory Direction Group, a small subgroup of respected long-time participants that currently consists of those paper authors and is chaired this year by Bjarne Stroustrup.</p> <h2>Features adopted for C++20</h2> <p>We adopted several new features into the draft standard.</p> <p><a href="https://wg21.link/p0840"><strong><em>[[no_unique_address]]</em> (Richard Smith).</strong></a> You know the empty base optimization (EBO)? If you do, can you remember the (probably many) times you’ve artificially made another class a base of your class, instead of just a data member, just so you could get EBO? And, every time that happened, you wished C++ had the empty member optimization (let&#8217;s call it &#8220;EMO&#8221;)? In C++20, it does, and you opt in via <em>[[no_unique_address]]</em>. Here’s an example from the paper:</p> <pre>template&lt;typename Key, typename Value,          typename Hash, typename Pred, typename Allocator&gt; class hash_map { <span style="color:#339966;">  [[no_unique_address]]</span> Hash hasher;         // EMOji <span style="color:#339966;">  [[no_unique_address]]</span> Pred pred;           // EMOji <span style="color:#339966;">  [[no_unique_address]]</span> Allocator alloc;     // EMOji   Bucket *buckets;   // ... public:   // ... };</pre> <p><a href="https://wg21.link/p0479r2"><strong><em>[[likely]]</em> and </strong><strong><em>[[unlikely]]</em> (Clay Trychta).</strong></a> (The link is to R2 of the paper, which contains more description. The R4 version is the one that was adopted.) Many compilers already allow you to “hint” whether a branch is likely or unlikely to be true, which can help optimizations. This standardizes that. Here’s an example from the paper:</p> <pre>if (foo()) <span style="color:#339966;">[[unlikely]]</span> return false; if (bar()) <span style="color:#339966;">[[unlikely]]</span> return false; baz();</pre> <p>Major disclaimer: This feature comes with the same warning label as the existing compiler extensions, which is “measure, measure, measure!” Compilers already know which branches are likely, usually better than you do (especially with profile-guided optimization, aka PGO). A major reason to use this feature is not actually to optimize (though it can help if you don’t have PGO), but to control which path gets optimized for other reasons. For example, for some code it is essential to make the <em>uncommon</em> path faster so that it is faster when you do hit it — and in such cases you would actually use this attribute in the inverted sense, so please also write a comment nearby to document that intent otherwise some hapless reader (more than likely your future self) will be temporarily confused.</p> <p><a href="https://wg21.link/p0355r7"><strong>Extending </strong><strong><em>&lt;chrono&gt;</em> to calendars and time zones (Howard Hinnant, Tomasz Kamiński).</strong></a> This is a much-loved (and huger-than-you-think) library addition that will help a lot of users, and really exercises modern C++ features like user-defined literals.</p> <p><a href="https://wg21.link/p0122r7"><strong><em>span</em>: Bounds-safe views for sequences of objects (Neil MacIntosh, Stephan T. Lavavej).</strong></a> This one comes directly from the C++ Core Guidelines’ Guideline Support Library (GSL), and is intended to be a replacement especially for unsafe C-style (pointer,length) parameter pairs. We expect to be used pervasively as a vocabulary type for function parameters in particular.</p> <h2>Cleanup adopted for C++20</h2> <p>We also made some improvements to existing features.</p> <p><a href="https://wg21.link/p0634"><strong>“Down with </strong><strong><em>typename</em>!” (Nina Ranns, Daveed Vandevoorde).</strong></a> Are you tired of writing <em>typename</em> redundantly in places where the compiler should know only a type was possible? So were the proposal authors. Now <em>typename</em> is required in fewer places.</p> <p><a href="https://wg21.link/p0780"><strong>Lambda capture initializers can now expand variadic parameter packs (Barry Revzin).</strong></a> An example, taken from the paper:</p> <pre>template&lt;class F, class... Args&gt; auto delay_invoke(F f, Args... args) {     return [f=std::move(f), <span style="color:#339966;">...args=std::move(args)</span>]() -&gt; decltype(auto) {         return std::invoke(f, args...);     }; }</pre> <p>The now-allowed expansion is the one in the third line.</p> <p><a href="https://wg21.link/p0962"><strong>Consistent <em>begin</em>/<em>end</em> for range-<em>for</em> (Ville Voutilainen).</strong></a> The range-based <em>for</em> loop is already customizable, and can handle ranges that have both member <em>rng.begin()</em>/<em>rng.end()</em> functions or ones that have non-member <em>begin(rng)</em>/<em>end(rng)</em> functions. But what if it relies on the non-member functions, but happens to also have one member named either <em>begin</em> or <em>end</em> (such as, say, <em>end</em> in <em>ios_base</em>)? That’s now legal, we ignore the one-off member and use the non-member pair. Here’s an example from the paper that is not legal in C++17 but now works in C++20:</p> <pre>struct X : std::stringstream { /*...*/ }; std::istream_iterator&lt;char&gt; begin(X&amp; x)   { return std::istream_iterator&lt;char&gt;(x); } std::istream_iterator&lt;char&gt; end(X&amp; x)   { return std::istream_iterator&lt;char&gt;(); } int main() {     X x; <span style="color:#339966;">    for (auto&amp;&amp; i : x) {   // works in C++20 </span>      // ...     } }</pre> <p>Interesting tidbit: This is one of those “new functionality” features created by removing wording in the standard, namely removing a restriction. The entire wording change was to change “either (or both) finds” to “both find” in one place.</p> <p><a href="https://wg21.link/p0969"><strong>Structured bindings can access accessible members (Timur Doumler).</strong></a> In C++17, you could use structured bindings to bind to class members as long as they were public. But what if you’re inside a member or friend of the class? Shouldn’t you be able to use structured bindings on members, which are visible (i.e., accessible) to you even if they aren’t public to everyone, just like we can do any other normal thing with those members? In C++17 that didn&#8217;t work, but it was an oversight and now we can do that:</p> <pre>class X {     int i;     int j; public:     friend void f(); }; void f() {     X x; <span style="color:#339966;">    auto [myi, myj] = x;   // now ok</span> }</pre> <p>We also adopted some other fixes, including:</p> <ul> <li><a href="https://wg21.link/p0961"><strong>Structured bindings </strong><strong><em>get&lt;&gt;</em> lookup relaxations (Ville Voutilainen)</strong></a> to make the <em>get&lt;&gt;</em> customization point a little more general and easier to use, such as for types that happens to also have an unrelated member non-template <em>.get()</em> (like smart pointers).</li> <li><a href="https://wg21.link/p0905r1"><strong>Symmetry for spaceship (Tomasz Kamiński, Herb Sutter, Richard Smith)</strong></a> to make <em>&lt;=&gt;</em> itself symmetric the way <em>&lt;=&gt;</em> already made the two-way comparisons symmetric.</li> <li><a href="https://wg21.link/p0551r3"><strong>Thou shalt not specialize </strong><strong><em>std</em> function templates! (Walter E. Brown)</strong></a>, which should be read with the addendum “or take their addresses” (that last part continues to be discussed).</li> <li><a href="https://wg21.link/p0754r2"><strong><em>&lt;version&gt;</em> (Alan Talbot)</strong></a> described as “for those people who dislike <em>&lt;iso646&gt;</em>.”</li> </ul> <p>&#8230; and a few more including a couple of small extensions to <strong>coroutines</strong> and <strong>networking</strong>. Note that those two TSes were already published, and are not yet merged into the C++ draft standard, but we are still maintaining those experimental TS “branches” with fixes and updates, so that those will be done and ready once we are ready to merge those TS branches into the C++ “trunk” project itself.</p> <h2>Other major full committee approvals</h2> <p>We approved <strong>Parallelism TS 2</strong> to be extended with the (huge) extensions in <a href="https://wg21.link/p0214r9"><strong>Data-parallel vector types and operations (Matthias Kretz)</strong></a> and declared it <strong>feature-complete</strong>: It is now being sent out for its main ISO comment ballot.</p> <p>We also decided to officially open a <strong>Reflection TS</strong> work item, which means that the committee as a whole is taking ownership of the proposal and intends to progress it as a TS. The initial content is from the paper <a href="https://wg21.link/p0194r6"><strong>“Static reflection” (Matúš Chochlík, Axel Naumann, David Sankel)</strong></a> but everyone should understand that the surface syntax will change. The primary point of the TS is in the underlying “engine” and functionality, and the intention is to replace the placeholder template-metaprogramming-like <em>reflexpr</em> syntax with an object-like model that looks like “more <em>constexpr</em> code” — regular C++ code that is able to be run at compile time.</p> <h2>Language/library evolution subgroup approvals</h2> <p>Here is a list of proposals that achieved Evolution or Library Evolution working group (EWG or LEWG) design approval. This means that the subgroup responsible for approving the design has done so (sometimes provisionally, with a few “revision is expected” notes below), and the next step is that they now enter wording review in the Core or Library working group (CWG or LWG), and are slated to be proposed for formal adoption in C++20 at a future meeting. Thanks to Olivier Giroux, Ville Voutilainen, Titus Winters for their notes that contributed to this summary.</p> <p>For <strong>contracts</strong>, EWG discussed a clarification to what the result of observable side-effects in contract pre/post-conditions is, and the guidance is that it’s undefined behavior.</p> <p>For <strong>reflection</strong> and related facilities, EWG approved some papers that are significant milestones for compile-time programming:</p> <ul> <li><a href="https://wg21.link/p0670"><strong>“Static reflection of functions” (Matúš Chochlík, Axel Naumann, David Sankel)</strong></a>, which would extend the reflection proposal to functions and parameters.</li> <li><a href="https://wg21.link/p0784"><strong>“Standard containers and </strong><strong><em>constexpr</em>” (Louis Dionne, Richard Smith, Nina Ranns, Daveed Vandevoorde)</strong></a> which would permit <em>constexpr</em> objects to have destructors and use dynamic memory allocation — stop, pause, and reflect[sic] on just what those two features imply: compile-time resource-managing types like <em>constexpr vector&lt;std::metainfo&gt;</em>. Sends shivers down your spine (in a good way), doesn’t it?</li> <li><a href="https://wg21.link/p0732"><strong>“Class types in non-type template parameters” (Jeff Snyder)</strong></a>, which would permit template non-type parameters of user-defined type, and enables instantiating templates with values such as compile-time strings.</li> </ul> <p>EWG also approved:</p> <ul> <li><a href="https://wg21.link/p0482"><strong>“</strong><strong><em>char8_t</em>: A type for UTF-8 characters and strings” (Tom Honermann)</strong></a></li> <li><a href="https://wg21.link/p0892"><strong>“</strong><strong><em>explicit(bool)</em>” (Barry Revzin)</strong></a></li> <li><a href="https://wg21.link/p0929"><strong>“Checking for abstract class types” (Jens Maurer)</strong></a></li> </ul> <p>We also decided to pursue putting in writing two statements about <strong>how we evolve C++</strong>:</p> <ul> <li>EWG decided to pursue turning <a href="https://wg21.link/p0684"><strong>“C++ Stability, Velocity, and Deployment Plans” (Titus Winters)</strong></a> into a Standing Document, with the expectation is that the document will be revised and reviewed again. Titus Winters will be the main author, and Gabriel Dos Reis, Bjarne Stroustrup, and Mike Spertus will assist.</li> <li>EWG also supports turning <a href="https://wg21.link/p0921"><strong>“Standard library compatibility promises” (Titus Winters)</strong></a> into a Standing Document, and to add the promises also to the standard’s own Library Introduction clause. Titus Winters will be the main author, with help from Ashley Hedberg, Nevin Liber, Bjarne Stroustrup, James Dennett, Walter E. Brown, Gor Nishanov, Alisdair Meredith, Mike Spertus, Robert Steagall and Daveed Vandevoorde.</li> </ul> <p>We decided to launch a systematic effort to drive out the remaining uses of <strong>macros</strong> by providing replacements for those uses. We requested an analysis paper listing all the remaining use cases for macros are, a description of the status of the non-macro solutions for those problems, and possible solutions. This paper will be led by Ville Voutilainen, assisted by Bjarne Stroustrup, Gabriel Dos Reis, James Dennett, and Vittorio Romeo.</p> <p>Somewhat stunningly (to me), we decided to pursue some <strong>cleanup to the C fundamental types</strong> that would be a breaking change to certain kinds of C and C++17 code. It came up via the discussion of <a href="https://wg21.link/p0946"><strong>“Towards consistency between </strong><strong><em>&lt;=&gt;</em> and other comparison operators” (Richard Smith)</strong></a>, which observed that when we added <em>&lt;=&gt;</em> to C++20, in <em>&lt;=&gt;</em> only we deliberately decided not to repeat the well-known issues that we did not want to perpetuate with C’s two-way comparisons for fundamental types (e.g., signed-unsigned comparison surprises like <em>-1 &lt; 0u</em> giving the “wrong” answer)… which naturally meant that we now have inconsistencies between the preexisting two-way comparison operators and the shiny new three-way <em>&lt;=&gt;</em> operator. When faced with this, the subgroup discovered that we had a consensus in the room that enough really was enough, and we decided to seriously investigate doing some housecleaning and fix those things even though that would include breaking changes to (mostly ill-behaved) C and C++17 code. For example, we are now on a path to pursue deprecating or outright removing the ability to compare two unrelated enumerations (which is just plain suspicious code), and to require <em>-1 &lt; 0u</em> to give the mathematically correct answer even when in the worst case that means generating two comparison machine instructions instead of just one (any code that does such ill-advised things would change from being a correctness problem into “just” a one-extra-instruction performance problem). — We have made no decisions about actually doing this or the ship vehicle for such changes, which likely would have to be rolled out in stages via deprecation followed by removel, and we expect more data to be gathered before Rapperswil regarding how much code could be affected. But as far as I can recall, this is the most breaking-change cleanup to C’s fundamental types that we have ever been willing to seriously consider.</p> <p>LEWG approved <a href="https://wg21.link/p0898"><strong>Standard library concepts (Casey Carter)</strong></a>. This is the first part of the Ranges TS to be on track for merging into C++20 at an upcoming meeting, and contains the core concepts from the Ranges TS. It is also the first appearance of the <strong>concepts</strong> language feature in the standard library.</p> <h2>Other progress</h2> <p>Also for <strong>concepts</strong>, at this meeting EWG approved pursuing a direction based on my paper <a href="https://wg21.link/p0745"><strong>“Concepts in-place syntax” (Herb Sutter)</strong></a> to have a shorthand syntax for declaring constrained templates.</p> <p>At this meeting, we considered further improvements to the <strong>modules</strong> design, including a renewed proposal focusing on a bridge to help existing header-based code move toward a modules-enabled world. By the end of the meeting, the main participants had hammered out a plan to, over the next few meetings:</p> <ul> <li>move a core set of modules functionality into C++20 that is “clean” and uncompromised by legacy concerns; and</li> <li>concurrently update the remaining modules TS with features specific to transitioning header-based code to modules, which might include support for macros.</li> </ul> <p>There’s a lot of work remaining, but we’ll know in the next few meetings how the objectives are progressing.</p> <p>After several years of incubation, <strong>executors</strong> are now making strong progress and are on track to become a TS in the C++20 timeframe. (Let me explicitly say “<strong>thread pools</strong>” for the benefit of those who are Ctrl-F&#8217;ing to find out how C++ intends to support modern thread pools such as in Windows 10 and Grand Central Dispatch. You&#8217;re now in the right place: Modern thread pool support is coming as part of executors.)</p> <p>Note that there is a dependency on executors before we can merge the <strong>networking</strong> TS and the future.then feature in the <strong>concurrency</strong> TS into the C++ draft standard, which means that all of those features are likely to be merged early in the C++23 cycle rather than in C++20.</p> <p>We are going to try to ship <strong>coroutines</strong> in C++20.</p> <p>We are opening a new work item for <strong>Library Fundamentals TS3</strong>, the third batch of library additions, even as we will soon be starting to fold in material from the recently-published Library Fundamentals TS2 into C++20.</p> <p><strong>SG15 (Tooling) (Titus Winters)</strong> had its first meeting, and there is a shared belief that we need to take concrete steps toward enabling better support for tools for two things in particular: modules, and C++ library package managers. That coincided very nicely with the <a href="https://isocpp.org/blog/2018/03/results-summary-cpp-foundation-developer-survey-lite-2018-02">2018-02 isocpp.org survey</a>, where on the open-ended question 10, the #1 write-in answer was to request “dependencies / package manager” (15% of all write-ins mentioned that). Clearly there is interest in this area, and it will be interesting to see how this develops into proposals over the coming meetings.</p> <p>We also created a new study group <strong>SG16 (Unicode)</strong> with Tom Honermann as the SG chair.</p> <h2>What’s next</h2> <p>Whew! Here is a cheat-sheet summary of our current expectations for some of the major pieces of work that are not already in draft C++20. Note that this is an estimate only.</p> <p style="text-align:center;"><img data-attachment-id="3665" data-permalink="https://herbsutter.com/2018/04/02/trip-report-winter-iso-c-standards-meeting-jacksonville/cpp11147020-201803/" data-orig-file="https://herbsutter.com/wp-content/uploads/2018/04/cpp11147020-201803.png" data-orig-size="1357,678" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="cpp11147020 &#8211; 201803" data-image-description="" data-image-caption="" data-medium-file="https://herbsutter.com/wp-content/uploads/2018/04/cpp11147020-201803.png?w=300" data-large-file="https://herbsutter.com/wp-content/uploads/2018/04/cpp11147020-201803.png?w=1024" class="alignnone size-full wp-image-3665" src="https://herbsutter.com/wp-content/uploads/2018/04/cpp11147020-201803.png?w=1100" alt="cpp11147020 - 201803" srcset="https://herbsutter.com/wp-content/uploads/2018/04/cpp11147020-201803.png 1357w, https://herbsutter.com/wp-content/uploads/2018/04/cpp11147020-201803.png?w=150&amp;h=75 150w, https://herbsutter.com/wp-content/uploads/2018/04/cpp11147020-201803.png?w=300&amp;h=150 300w, https://herbsutter.com/wp-content/uploads/2018/04/cpp11147020-201803.png?w=768&amp;h=384 768w, https://herbsutter.com/wp-content/uploads/2018/04/cpp11147020-201803.png?w=1024&amp;h=512 1024w" sizes="(max-width: 1357px) 100vw, 1357px" /></p> <p>And here is an updated snapshot of where we are on the timeline for C++20 and the TSes that are completed, in flight, or expected to begin:</p> <p style="text-align:center;"><img data-attachment-id="3666" data-permalink="https://herbsutter.com/2018/04/02/trip-report-winter-iso-c-standards-meeting-jacksonville/wg21-timeline-2018-03/" data-orig-file="https://herbsutter.com/wp-content/uploads/2018/04/wg21-timeline-2018-03.png" data-orig-size="1214,838" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="wg21-timeline-2018-03" data-image-description="" data-image-caption="" data-medium-file="https://herbsutter.com/wp-content/uploads/2018/04/wg21-timeline-2018-03.png?w=300" data-large-file="https://herbsutter.com/wp-content/uploads/2018/04/wg21-timeline-2018-03.png?w=1024" class="alignnone size-full wp-image-3666" src="https://herbsutter.com/wp-content/uploads/2018/04/wg21-timeline-2018-03.png?w=1100" alt="wg21-timeline-2018-03.png" srcset="https://herbsutter.com/wp-content/uploads/2018/04/wg21-timeline-2018-03.png 1214w, https://herbsutter.com/wp-content/uploads/2018/04/wg21-timeline-2018-03.png?w=150&amp;h=104 150w, https://herbsutter.com/wp-content/uploads/2018/04/wg21-timeline-2018-03.png?w=300&amp;h=207 300w, https://herbsutter.com/wp-content/uploads/2018/04/wg21-timeline-2018-03.png?w=768&amp;h=530 768w, https://herbsutter.com/wp-content/uploads/2018/04/wg21-timeline-2018-03.png?w=1024&amp;h=707 1024w" sizes="(max-width: 1214px) 100vw, 1214px" /></p> <p>Finally, here is the schedule for the C++20 cycle approved by unanimous consent at this meeting:</p> <p style="text-align:center;"><img data-attachment-id="3671" data-permalink="https://herbsutter.com/2018/04/02/trip-report-winter-iso-c-standards-meeting-jacksonville/wg21-schedule-2018-03/" data-orig-file="https://herbsutter.com/wp-content/uploads/2018/04/wg21-schedule-2018-03.png" data-orig-size="1479,814" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="wg21-schedule-2018-03" data-image-description="" data-image-caption="" data-medium-file="https://herbsutter.com/wp-content/uploads/2018/04/wg21-schedule-2018-03.png?w=300" data-large-file="https://herbsutter.com/wp-content/uploads/2018/04/wg21-schedule-2018-03.png?w=1024" class="alignnone size-full wp-image-3671" src="https://herbsutter.com/wp-content/uploads/2018/04/wg21-schedule-2018-03.png?w=1100" alt="wg21-schedule-2018-03" srcset="https://herbsutter.com/wp-content/uploads/2018/04/wg21-schedule-2018-03.png 1479w, https://herbsutter.com/wp-content/uploads/2018/04/wg21-schedule-2018-03.png?w=150&amp;h=83 150w, https://herbsutter.com/wp-content/uploads/2018/04/wg21-schedule-2018-03.png?w=300&amp;h=165 300w, https://herbsutter.com/wp-content/uploads/2018/04/wg21-schedule-2018-03.png?w=768&amp;h=423 768w, https://herbsutter.com/wp-content/uploads/2018/04/wg21-schedule-2018-03.png?w=1024&amp;h=564 1024w" sizes="(max-width: 1479px) 100vw, 1479px" /></p> <p>Thank you again to the approximately 140 experts who attended this meeting, and the many more who participate in standardization through their national bodies! Have a good spring… we look forward now to our next meetings in June (Rapperswil, Switzerland) and November (San Diego, CA, USA).</p> </div><!-- .entry-content --> <footer class="entry-footer"> <div class="entry-meta"> <span class="byline"> <a href="https://herbsutter.com/author/herbsutter/" title="Posts by Herb Sutter" rel="author">Herb Sutter</a> </span> <span class="cat-links"> <a href="https://herbsutter.com/category/c/" rel="category tag">C++</a> </span><!-- .cat-links --> <span class="comments-link"><a href="https://herbsutter.com/2018/04/02/trip-report-winter-iso-c-standards-meeting-jacksonville/#comments">17 Comments</a></span><!-- .comments-link --> <span class="published-on"> <a href="https://herbsutter.com/2018/04/02/trip-report-winter-iso-c-standards-meeting-jacksonville/" rel="bookmark"><time class="entry-date published" datetime="2018-04-02T18:06:02-08:00">2018-04-02</time><time class="updated" datetime="2018-04-03T03:32:02-08:00">2018-04-03</time></a> </span> <span class="word-count">12 Minutes</span> </div><!-- .entry-meta --> </footer><!-- .entry-footer --> </article><!-- #post-## --> </main><!-- #main --> </div><!-- #primary --> <div id="secondary" class="widget-area" role="complementary"> <aside id="search-4" class="widget widget_search"><form role="search" method="get" class="search-form" action="https://herbsutter.com/"> <label> <span class="screen-reader-text">Search for:</span> <input type="search" class="search-field" placeholder="Search &hellip;" value="" name="s" /> </label> <input type="submit" class="search-submit" value="Search" /> </form></aside><aside id="blog_subscription-3" class="widget widget_blog_subscription jetpack_subscription_widget"><h1 class="widget-title"><label for="subscribe-field">Follow by email</label></h1> <div class="wp-block-jetpack-subscriptions__container"> <form action="https://subscribe.wordpress.com" method="post" accept-charset="utf-8" data-blog="3379246" data-post_access_level="everybody" id="subscribe-blog" > <p id="subscribe-email"> <label id="subscribe-field-label" for="subscribe-field" class="screen-reader-text" > Email Address: </label> <input type="email" name="email" style="width: 95%; padding: 1px 10px" placeholder="Email Address" value="" id="subscribe-field" required /> </p> <p id="subscribe-submit" > <input type="hidden" name="action" value="subscribe"/> <input type="hidden" name="blog_id" value="3379246"/> <input type="hidden" name="source" value="https://herbsutter.com/2018/04/"/> <input type="hidden" name="sub-type" value="widget"/> <input type="hidden" name="redirect_fragment" value="subscribe-blog"/> <input type="hidden" id="_wpnonce" name="_wpnonce" value="19c10c9de2" /> <button type="submit" class="wp-block-button__link" > Subscribe </button> </p> </form> </div> </aside><aside id="block-2" class="widget widget_block widget_media_image"> <figure class="wp-block-image size-medium is-resized is-style-default"><a href="https://herbsutter.files.wordpress.com/2024/03/herb-cppcon-2021.jpg"><img loading="lazy" width="300" height="230" src="https://herbsutter.files.wordpress.com/2024/03/herb-cppcon-2021.jpg?w=300" alt="" class="wp-image-5065" style="width:248px;height:auto" srcset="https://herbsutter.files.wordpress.com/2024/03/herb-cppcon-2021.jpg?w=300 300w, https://herbsutter.files.wordpress.com/2024/03/herb-cppcon-2021.jpg?w=600 600w, https://herbsutter.files.wordpress.com/2024/03/herb-cppcon-2021.jpg?w=150 150w" sizes="(max-width: 300px) 100vw, 300px" /></a></figure> </aside><aside id="block-3" class="widget widget_block widget_text"> <p class="has-small-font-size">I'm an author and speaker, and a programming language nerd whose focus is on enabling our program code to be both clean <em>and</em> fast. I've been writing about programming since 1993, usually about C++ or about concurrency and parallelism. I'm the designer or co-designer of a number of standardized ISO C++ language and library features. I've served as the chair of the <a href="https://isocpp.org/std/the-committee">ISO C++ standards committee</a> since 2002, and as the chair of the <a href="https://isocpp.org/about">Standard C++ Foundation</a> since 2012. I'm a technical fellow at <a href="https://www.citadelsecurities.com/">Citadel Securities</a>. This personal website expresses the opinions of none of those organizations.</p> </aside><aside id="archives-4" class="widget widget_archive"><h1 class="widget-title">Archives</h1> <ul> <li><a href='https://herbsutter.com/2025/02/'>February 2025</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2025/01/'>January 2025</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2024/12/'>December 2024</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2024/11/'>November 2024</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2024/10/'>October 2024</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2024/09/'>September 2024</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2024/08/'>August 2024</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2024/07/'>July 2024</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2024/06/'>June 2024</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2024/04/'>April 2024</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2024/03/'>March 2024</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2024/02/'>February 2024</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2023/11/'>November 2023</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2023/10/'>October 2023</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2023/09/'>September 2023</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2023/08/'>August 2023</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2023/06/'>June 2023</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2023/04/'>April 2023</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2023/02/'>February 2023</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2022/12/'>December 2022</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2022/11/'>November 2022</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2022/10/'>October 2022</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2022/09/'>September 2022</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2021/10/'>October 2021</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2021/06/'>June 2021</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2021/05/'>May 2021</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2021/03/'>March 2021</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2021/02/'>February 2021</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2021/01/'>January 2021</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2020/12/'>December 2020</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2020/11/'>November 2020</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2020/10/'>October 2020</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2020/09/'>September 2020</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2020/07/'>July 2020</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2020/06/'>June 2020</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2020/05/'>May 2020</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2020/04/'>April 2020</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2020/03/'>March 2020</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2020/02/'>February 2020</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2019/11/'>November 2019</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2019/10/'>October 2019</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2019/09/'>September 2019</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2019/07/'>July 2019</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2019/06/'>June 2019</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2019/05/'>May 2019</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2019/04/'>April 2019</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2019/02/'>February 2019</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2018/11/'>November 2018</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2018/09/'>September 2018</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2018/07/'>July 2018</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2018/04/' aria-current="page">April 2018</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2017/11/'>November 2017</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2017/10/'>October 2017</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2017/09/'>September 2017</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2017/07/'>July 2017</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2017/06/'>June 2017</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2017/03/'>March 2017</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2017/02/'>February 2017</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2016/11/'>November 2016</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2016/09/'>September 2016</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2016/06/'>June 2016</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2016/03/'>March 2016</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2015/10/'>October 2015</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2015/09/'>September 2015</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2015/07/'>July 2015</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2015/06/'>June 2015</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2015/05/'>May 2015</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2015/04/'>April 2015</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2015/01/'>January 2015</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2014/12/'>December 2014</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2014/11/'>November 2014</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2014/10/'>October 2014</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2014/09/'>September 2014</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2014/08/'>August 2014</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2014/07/'>July 2014</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2014/05/'>May 2014</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2014/04/'>April 2014</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2014/03/'>March 2014</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2014/02/'>February 2014</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2014/01/'>January 2014</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2013/12/'>December 2013</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2013/11/'>November 2013</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2013/10/'>October 2013</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2013/09/'>September 2013</a>&nbsp;(6)</li> <li><a href='https://herbsutter.com/2013/08/'>August 2013</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2013/07/'>July 2013</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2013/06/'>June 2013</a>&nbsp;(7)</li> <li><a href='https://herbsutter.com/2013/05/'>May 2013</a>&nbsp;(22)</li> <li><a href='https://herbsutter.com/2013/04/'>April 2013</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2013/03/'>March 2013</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2013/02/'>February 2013</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2013/01/'>January 2013</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2012/12/'>December 2012</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2012/11/'>November 2012</a>&nbsp;(6)</li> <li><a href='https://herbsutter.com/2012/10/'>October 2012</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2012/09/'>September 2012</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2012/08/'>August 2012</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2012/07/'>July 2012</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2012/06/'>June 2012</a>&nbsp;(7)</li> <li><a href='https://herbsutter.com/2012/05/'>May 2012</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2012/04/'>April 2012</a>&nbsp;(17)</li> <li><a href='https://herbsutter.com/2012/03/'>March 2012</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2012/02/'>February 2012</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2012/01/'>January 2012</a>&nbsp;(7)</li> <li><a href='https://herbsutter.com/2011/12/'>December 2011</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2011/11/'>November 2011</a>&nbsp;(6)</li> <li><a href='https://herbsutter.com/2011/10/'>October 2011</a>&nbsp;(10)</li> <li><a href='https://herbsutter.com/2011/09/'>September 2011</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2011/08/'>August 2011</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2011/07/'>July 2011</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2011/06/'>June 2011</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2011/05/'>May 2011</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2011/04/'>April 2011</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2011/03/'>March 2011</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2011/01/'>January 2011</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2010/12/'>December 2010</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2010/10/'>October 2010</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2010/09/'>September 2010</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2010/08/'>August 2010</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2010/07/'>July 2010</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2010/06/'>June 2010</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2010/05/'>May 2010</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2010/04/'>April 2010</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2010/03/'>March 2010</a>&nbsp;(9)</li> <li><a href='https://herbsutter.com/2010/02/'>February 2010</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2010/01/'>January 2010</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2009/12/'>December 2009</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2009/11/'>November 2009</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2009/10/'>October 2009</a>&nbsp;(6)</li> <li><a href='https://herbsutter.com/2009/09/'>September 2009</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2009/08/'>August 2009</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2009/07/'>July 2009</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2009/06/'>June 2009</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2009/05/'>May 2009</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2009/04/'>April 2009</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2009/03/'>March 2009</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2009/02/'>February 2009</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2009/01/'>January 2009</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2008/12/'>December 2008</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2008/11/'>November 2008</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2008/10/'>October 2008</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2008/09/'>September 2008</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2008/08/'>August 2008</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2008/07/'>July 2008</a>&nbsp;(6)</li> <li><a href='https://herbsutter.com/2008/06/'>June 2008</a>&nbsp;(6)</li> <li><a href='https://herbsutter.com/2008/05/'>May 2008</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2008/04/'>April 2008</a>&nbsp;(6)</li> <li><a href='https://herbsutter.com/2008/03/'>March 2008</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2008/02/'>February 2008</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2008/01/'>January 2008</a>&nbsp;(7)</li> <li><a href='https://herbsutter.com/2007/12/'>December 2007</a>&nbsp;(5)</li> <li><a href='https://herbsutter.com/2007/11/'>November 2007</a>&nbsp;(4)</li> <li><a href='https://herbsutter.com/2007/10/'>October 2007</a>&nbsp;(1)</li> <li><a href='https://herbsutter.com/2007/09/'>September 2007</a>&nbsp;(6)</li> <li><a href='https://herbsutter.com/2007/08/'>August 2007</a>&nbsp;(6)</li> <li><a href='https://herbsutter.com/2007/07/'>July 2007</a>&nbsp;(6)</li> <li><a href='https://herbsutter.com/2007/06/'>June 2007</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2007/05/'>May 2007</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2007/04/'>April 2007</a>&nbsp;(2)</li> <li><a href='https://herbsutter.com/2007/03/'>March 2007</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2007/02/'>February 2007</a>&nbsp;(3)</li> <li><a href='https://herbsutter.com/2007/01/'>January 2007</a>&nbsp;(6)</li> <li><a href='https://herbsutter.com/2006/12/'>December 2006</a>&nbsp;(2)</li> </ul> </aside></div><!-- #secondary --> </div><!-- #content --> <footer id="colophon" class="site-footer" role="contentinfo"> <div class="site-info"> <a href="https://wordpress.com/?ref=footer_blog" rel="nofollow">Blog at WordPress.com.</a> </div><!-- .site-info --> </footer><!-- #colophon --> </div><!-- #content-wrapper --> </div><!-- #page --> <!-- --> <script type="text/javascript" src="//0.gravatar.com/js/hovercards/hovercards.min.js?ver=2025097d8bf6c02970a26c6b0c26b0fcfc89796aa30f84307cffd8fd28d2bcca53dd7a" id="grofiles-cards-js"></script> <script type="text/javascript" id="wpgroho-js-extra"> /* <![CDATA[ */ var WPGroHo = {"my_hash":""}; /* ]]> */ </script> <script crossorigin='anonymous' type='text/javascript' src='https://s2.wp.com/wp-content/mu-plugins/gravatar-hovercards/wpgroho.js?m=1610363240i'></script> <script> // Initialize and attach hovercards to all gravatars ( function() { function init() { if ( typeof Gravatar === 'undefined' ) { return; } if ( typeof Gravatar.init !== 'function' ) { return; } Gravatar.profile_cb = function ( hash, id ) { WPGroHo.syncProfileData( hash, id ); }; Gravatar.my_hash = WPGroHo.my_hash; Gravatar.init( 'body', '#wp-admin-bar-my-account', { i18n: { 'Edit your profile →': 'Edit your profile →', 'View profile →': 'View profile →', 'Contact': 'Contact', 'Send money': 'Send money', 'Sorry, we are unable to load this Gravatar profile.': 'Sorry, we are unable to load this Gravatar profile.', 'Profile not found.': 'Profile not found.', 'Too Many Requests.': 'Too Many Requests.', 'Internal Server Error.': 'Internal Server Error.', }, } ); } if ( document.readyState !== 'loading' ) { init(); } else { document.addEventListener( 'DOMContentLoaded', init ); } } )(); </script> <div style="display:none"> <div class="grofile-hash-map-c0ba56bfd231f8f04feb057728975181"> </div> </div> <div id="actionbar" dir="ltr" style="display: none;" class="actnbr-pub-independent-publisher-2 actnbr-has-follow actnbr-has-actions"> <ul> <li class="actnbr-btn actnbr-hidden"> <a class="actnbr-action actnbr-actn-follow " href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path clip-rule="evenodd" d="m4 4.5h12v6.5h1.5v-6.5-1.5h-1.5-12-1.5v1.5 10.5c0 1.1046.89543 2 2 2h7v-1.5h-7c-.27614 0-.5-.2239-.5-.5zm10.5 2h-9v1.5h9zm-5 3h-4v1.5h4zm3.5 1.5h-1v1h1zm-1-1.5h-1.5v1.5 1 1.5h1.5 1 1.5v-1.5-1-1.5h-1.5zm-2.5 2.5h-4v1.5h4zm6.5 1.25h1.5v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25z" fill-rule="evenodd"></path></svg> <span>Subscribe</span> </a> <a class="actnbr-action actnbr-actn-following no-display" href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M16 4.5H4V15C4 15.2761 4.22386 15.5 4.5 15.5H11.5V17H4.5C3.39543 17 2.5 16.1046 2.5 15V4.5V3H4H16H17.5V4.5V12.5H16V4.5ZM5.5 6.5H14.5V8H5.5V6.5ZM5.5 9.5H9.5V11H5.5V9.5ZM12 11H13V12H12V11ZM10.5 9.5H12H13H14.5V11V12V13.5H13H12H10.5V12V11V9.5ZM5.5 12H9.5V13.5H5.5V12Z" fill="#008A20"></path><path class="following-icon-tick" d="M13.5 16L15.5 18L19 14.5" stroke="#008A20" stroke-width="1.5"></path></svg> <span>Subscribed</span> </a> <div class="actnbr-popover tip tip-top-left actnbr-notice" id="follow-bubble"> <div class="tip-arrow"></div> <div class="tip-inner actnbr-follow-bubble"> <ul> <li class="actnbr-sitename"> <a href="https://herbsutter.com"> <img loading='lazy' alt='' src='https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png' srcset='https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1x, https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=75&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1.5x, https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=100&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 2x, https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=150&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 3x, https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=200&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 4x' class='avatar avatar-50' height='50' width='50' /> Sutter’s Mill </a> </li> <div class="actnbr-message no-display"></div> <form method="post" action="https://subscribe.wordpress.com" accept-charset="utf-8" style="display: none;"> <div class="actnbr-follow-count">Join 5,292 other subscribers</div> <div> <input type="email" name="email" placeholder="Enter your email address" class="actnbr-email-field" aria-label="Enter your email address" /> </div> <input type="hidden" name="action" value="subscribe" /> <input type="hidden" name="blog_id" value="3379246" /> <input type="hidden" name="source" value="https://herbsutter.com/2018/04/" /> <input type="hidden" name="sub-type" value="actionbar-follow" /> <input type="hidden" id="_wpnonce" name="_wpnonce" value="19c10c9de2" /> <div class="actnbr-button-wrap"> <button type="submit" value="Sign me up"> Sign me up </button> </div> </form> <li class="actnbr-login-nudge"> <div> Already have a WordPress.com account? <a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fherbsutter.com%252F2018%252F04%252F02%252Ftrip-report-winter-iso-c-standards-meeting-jacksonville%252F">Log in now.</a> </div> </li> </ul> </div> </div> </li> <li class="actnbr-ellipsis actnbr-hidden"> <svg class="gridicon gridicons-ellipsis" height="24" width="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g><path d="M7 12c0 1.104-.896 2-2 2s-2-.896-2-2 .896-2 2-2 2 .896 2 2zm12-2c-1.104 0-2 .896-2 2s.896 2 2 2 2-.896 2-2-.896-2-2-2zm-7 0c-1.104 0-2 .896-2 2s.896 2 2 2 2-.896 2-2-.896-2-2-2z"/></g></svg> <div class="actnbr-popover tip tip-top-left actnbr-more"> <div class="tip-arrow"></div> <div class="tip-inner"> <ul> <li class="actnbr-sitename"> <a href="https://herbsutter.com"> <img loading='lazy' alt='' src='https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png' srcset='https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=50&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1x, https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=75&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 1.5x, https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=100&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 2x, https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=150&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 3x, https://secure.gravatar.com/blavatar/fe7f5b0b83dba894afe26c42bcab33fe2d1246d9730ef182c72c0bff0dc26acb?s=200&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Flogo%2Fwpcom-gray-white.png 4x' class='avatar avatar-50' height='50' width='50' /> Sutter’s Mill </a> </li> <li class="actnbr-folded-follow"> <a class="actnbr-action actnbr-actn-follow " href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path clip-rule="evenodd" d="m4 4.5h12v6.5h1.5v-6.5-1.5h-1.5-12-1.5v1.5 10.5c0 1.1046.89543 2 2 2h7v-1.5h-7c-.27614 0-.5-.2239-.5-.5zm10.5 2h-9v1.5h9zm-5 3h-4v1.5h4zm3.5 1.5h-1v1h1zm-1-1.5h-1.5v1.5 1 1.5h1.5 1 1.5v-1.5-1-1.5h-1.5zm-2.5 2.5h-4v1.5h4zm6.5 1.25h1.5v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25z" fill-rule="evenodd"></path></svg> <span>Subscribe</span> </a> <a class="actnbr-action actnbr-actn-following no-display" href=""> <svg class="gridicon" height="20" width="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill-rule="evenodd" clip-rule="evenodd" d="M16 4.5H4V15C4 15.2761 4.22386 15.5 4.5 15.5H11.5V17H4.5C3.39543 17 2.5 16.1046 2.5 15V4.5V3H4H16H17.5V4.5V12.5H16V4.5ZM5.5 6.5H14.5V8H5.5V6.5ZM5.5 9.5H9.5V11H5.5V9.5ZM12 11H13V12H12V11ZM10.5 9.5H12H13H14.5V11V12V13.5H13H12H10.5V12V11V9.5ZM5.5 12H9.5V13.5H5.5V12Z" fill="#008A20"></path><path class="following-icon-tick" d="M13.5 16L15.5 18L19 14.5" stroke="#008A20" stroke-width="1.5"></path></svg> <span>Subscribed</span> </a> </li> <li class="actnbr-signup"><a href="https://wordpress.com/start/">Sign up</a></li> <li class="actnbr-login"><a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fherbsutter.com%252F2018%252F04%252F02%252Ftrip-report-winter-iso-c-standards-meeting-jacksonville%252F">Log in</a></li> <li class="flb-report"> <a href="https://wordpress.com/abuse/?report_url=https://herbsutter.com" target="_blank" rel="noopener noreferrer"> Report this content </a> </li> <li class="actnbr-reader"> <a href="https://wordpress.com/reader/feeds/171936"> View site in Reader </a> </li> <li class="actnbr-subs"> <a href="https://subscribe.wordpress.com/">Manage subscriptions</a> </li> <li class="actnbr-fold"><a href="">Collapse this bar</a></li> </ul> </div> </div> </li> </ul> </div> <script> window.addEventListener( "load", function( event ) { var link = document.createElement( "link" ); link.href = "https://s0.wp.com/wp-content/mu-plugins/actionbar/actionbar.css?v=20250116"; link.type = "text/css"; link.rel = "stylesheet"; document.head.appendChild( link ); var script = document.createElement( "script" ); script.src = "https://s0.wp.com/wp-content/mu-plugins/actionbar/actionbar.js?v=20250204"; script.defer = true; document.body.appendChild( script ); } ); </script> <div id="jp-carousel-loading-overlay"> <div id="jp-carousel-loading-wrapper"> <span id="jp-carousel-library-loading">&nbsp;</span> </div> </div> <div class="jp-carousel-overlay" style="display: none;"> <div class="jp-carousel-container"> <!-- The Carousel Swiper --> <div class="jp-carousel-wrap swiper-container jp-carousel-swiper-container jp-carousel-transitions" itemscope itemtype="https://schema.org/ImageGallery"> <div class="jp-carousel swiper-wrapper"></div> <div class="jp-swiper-button-prev swiper-button-prev"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskPrev" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="9" height="12"> <path d="M16.2072 16.59L11.6496 12L16.2072 7.41L14.8041 6L8.8335 12L14.8041 18L16.2072 16.59Z" fill="white"/> </mask> <g mask="url(#maskPrev)"> <rect x="0.579102" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </div> <div class="jp-swiper-button-next swiper-button-next"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskNext" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="8" height="12"> <path d="M8.59814 16.59L13.1557 12L8.59814 7.41L10.0012 6L15.9718 12L10.0012 18L8.59814 16.59Z" fill="white"/> </mask> <g mask="url(#maskNext)"> <rect x="0.34375" width="23.8822" height="24" fill="#FFFFFF"/> </g> </svg> </div> </div> <!-- The main close buton --> <div class="jp-carousel-close-hint"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskClose" mask-type="alpha" maskUnits="userSpaceOnUse" x="5" y="5" width="15" height="14"> <path d="M19.3166 6.41L17.9135 5L12.3509 10.59L6.78834 5L5.38525 6.41L10.9478 12L5.38525 17.59L6.78834 19L12.3509 13.41L17.9135 19L19.3166 17.59L13.754 12L19.3166 6.41Z" fill="white"/> </mask> <g mask="url(#maskClose)"> <rect x="0.409668" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </div> <!-- Image info, comments and meta --> <div class="jp-carousel-info"> <div class="jp-carousel-info-footer"> <div class="jp-carousel-pagination-container"> <div class="jp-swiper-pagination swiper-pagination"></div> <div class="jp-carousel-pagination"></div> </div> <div class="jp-carousel-photo-title-container"> <h2 class="jp-carousel-photo-caption"></h2> </div> <div class="jp-carousel-photo-icons-container"> <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-info" aria-label="Toggle photo metadata visibility"> <span class="jp-carousel-icon"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskInfo" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12.7537 2C7.26076 2 2.80273 6.48 2.80273 12C2.80273 17.52 7.26076 22 12.7537 22C18.2466 22 22.7046 17.52 22.7046 12C22.7046 6.48 18.2466 2 12.7537 2ZM11.7586 7V9H13.7488V7H11.7586ZM11.7586 11V17H13.7488V11H11.7586ZM4.79292 12C4.79292 16.41 8.36531 20 12.7537 20C17.142 20 20.7144 16.41 20.7144 12C20.7144 7.59 17.142 4 12.7537 4C8.36531 4 4.79292 7.59 4.79292 12Z" fill="white"/> </mask> <g mask="url(#maskInfo)"> <rect x="0.8125" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> </span> </a> <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-comments" aria-label="Toggle photo comments visibility"> <span class="jp-carousel-icon"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="maskComments" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> <path fill-rule="evenodd" clip-rule="evenodd" d="M4.3271 2H20.2486C21.3432 2 22.2388 2.9 22.2388 4V16C22.2388 17.1 21.3432 18 20.2486 18H6.31729L2.33691 22V4C2.33691 2.9 3.2325 2 4.3271 2ZM6.31729 16H20.2486V4H4.3271V18L6.31729 16Z" fill="white"/> </mask> <g mask="url(#maskComments)"> <rect x="0.34668" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> <span class="jp-carousel-has-comments-indicator" aria-label="This image has comments."></span> </span> </a> </div> </div> <div class="jp-carousel-info-extra"> <div class="jp-carousel-info-content-wrapper"> <div class="jp-carousel-photo-title-container"> <h2 class="jp-carousel-photo-title"></h2> </div> <div class="jp-carousel-comments-wrapper"> <div id="jp-carousel-comments-loading"> <span>Loading Comments...</span> </div> <div class="jp-carousel-comments"></div> <div id="jp-carousel-comment-form-container"> <span id="jp-carousel-comment-form-spinner">&nbsp;</span> <div id="jp-carousel-comment-post-results"></div> <form id="jp-carousel-comment-form"> <label for="jp-carousel-comment-form-comment-field" class="screen-reader-text">Write a Comment...</label> <textarea name="comment" class="jp-carousel-comment-form-field jp-carousel-comment-form-textarea" id="jp-carousel-comment-form-comment-field" placeholder="Write a Comment..." ></textarea> <div id="jp-carousel-comment-form-submit-and-info-wrapper"> <div id="jp-carousel-comment-form-commenting-as"> <fieldset> <label for="jp-carousel-comment-form-email-field">Email (Required)</label> <input type="text" name="email" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-email-field" /> </fieldset> <fieldset> <label for="jp-carousel-comment-form-author-field">Name (Required)</label> <input type="text" name="author" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-author-field" /> </fieldset> <fieldset> <label for="jp-carousel-comment-form-url-field">Website</label> <input type="text" name="url" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-url-field" /> </fieldset> </div> <input type="submit" name="submit" class="jp-carousel-comment-form-button" id="jp-carousel-comment-form-button-submit" value="Post Comment" /> </div> </form> </div> </div> <div class="jp-carousel-image-meta"> <div class="jp-carousel-title-and-caption"> <div class="jp-carousel-photo-info"> <h3 class="jp-carousel-caption" itemprop="caption description"></h3> </div> <div class="jp-carousel-photo-description"></div> </div> <ul class="jp-carousel-image-exif" style="display: none;"></ul> <a class="jp-carousel-image-download" href="#" target="_blank" style="display: none;"> <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="3" y="3" width="19" height="18"> <path fill-rule="evenodd" clip-rule="evenodd" d="M5.84615 5V19H19.7775V12H21.7677V19C21.7677 20.1 20.8721 21 19.7775 21H5.84615C4.74159 21 3.85596 20.1 3.85596 19V5C3.85596 3.9 4.74159 3 5.84615 3H12.8118V5H5.84615ZM14.802 5V3H21.7677V10H19.7775V6.41L9.99569 16.24L8.59261 14.83L18.3744 5H14.802Z" fill="white"/> </mask> <g mask="url(#mask0)"> <rect x="0.870605" width="23.8823" height="24" fill="#FFFFFF"/> </g> </svg> <span class="jp-carousel-download-text"></span> </a> <div class="jp-carousel-image-map" style="display: none;"></div> </div> </div> </div> </div> </div> </div> <link crossorigin='anonymous' rel='stylesheet' id='all-css-0-2' href='https://s2.wp.com/_static/??-eJydjEEKgCAQAD+UrR6KLtFbTJfQdJXWxe9HUB/oOMMw0KtyhRpSgyyqJjkCMURs1brzZWAhyMVLQgZnryKMCbiHipfahXzC0TEP8H/2NZ94fltezbxMxkx61vEGx+U/hQ==&cssminify=yes' type='text/css' media='all' /> <script type="text/javascript" src="https://s1.wp.com/wp-content/js/mobile-useragent-info.js?m=1609849039i&amp;ver=20241018" id="mobile-useragent-info-js" defer="defer" data-wp-strategy="defer"></script> <script type="text/javascript" id="jetpack-carousel-js-extra"> /* <![CDATA[ */ var jetpackSwiperLibraryPath = {"url":"https:\/\/s2.wp.com\/wp-content\/mu-plugins\/jetpack-plugin\/sun\/_inc\/build\/carousel\/swiper-bundle.min.js"}; var jetpackCarouselStrings = {"widths":[370,700,1000,1200,1400,2000],"is_logged_in":"","lang":"en","ajaxurl":"https:\/\/herbsutter.com\/wp-admin\/admin-ajax.php","nonce":"cde8d2270c","display_exif":"1","display_comments":"1","single_image_gallery":"1","single_image_gallery_media_file":"","background_color":"black","comment":"Comment","post_comment":"Post Comment","write_comment":"Write a Comment...","loading_comments":"Loading Comments...","image_label":"Open image in full-screen.","download_original":"View full size <span class=\"photo-size\">{0}<span class=\"photo-size-times\">\u00d7<\/span>{1}<\/span>","no_comment_text":"Please be sure to submit some text with your comment.","no_comment_email":"Please provide an email address to comment.","no_comment_author":"Please provide your name to comment.","comment_post_error":"Sorry, but there was an error posting your comment. Please try again later.","comment_approved":"Your comment was approved.","comment_unapproved":"Your comment is in moderation.","camera":"Camera","aperture":"Aperture","shutter_speed":"Shutter Speed","focal_length":"Focal Length","copyright":"Copyright","comment_registration":"0","require_name_email":"1","login_url":"https:\/\/herbsutter.wordpress.com\/wp-login.php?redirect_to=https%3A%2F%2Fherbsutter.com%2F2018%2F04%2F02%2Ftrip-report-winter-iso-c-standards-meeting-jacksonville%2F","blog_id":"3379246","meta_data":["camera","aperture","shutter_speed","focal_length","copyright"],"stats_query_args":"blog=3379246&v=wpcom&tz=-8&user_id=0&subd=herbsutter","is_public":"1"}; /* ]]> */ </script> <script type="text/javascript" id="custom-content-types-data-js-before"> /* <![CDATA[ */ var CUSTOM_CONTENT_TYPE__INITIAL_STATE; typeof CUSTOM_CONTENT_TYPE__INITIAL_STATE === "object" || (CUSTOM_CONTENT_TYPE__INITIAL_STATE = JSON.parse(decodeURIComponent("%7B%22active%22%3Atrue%2C%22over_ride%22%3Afalse%2C%22should_show_testimonials%22%3Atrue%2C%22should_show_portfolios%22%3Atrue%7D"))); /* ]]> */ </script> <script crossorigin='anonymous' type='text/javascript' src='https://s1.wp.com/_static/??-eJydj9EOgjAMRX/I2SBB44PxU8wYBTq2bqGb+PliFGPwSV+anOae2xSmqEzghJwg9ehRIOYaiBuMOA9OamZH0uOodmAFWF+p04kCb61s4GdfBorKEQ+qDSaLaun2RxGxATEjxaSmaIJfV/isossdsYDFFLUZXgySGS4Pvc7kGjB6DFnQvWPLYuvp68OP1iX2PL/C2Tv7U3Eoy2Oxr8rK3gEmc4Xv'></script> <script type="text/javascript"> (function () { var wpcom_reblog = { source: 'toolbar', toggle_reblog_box_flair: function (obj_id, post_id) { // Go to site selector. This will redirect to their blog if they only have one. const postEndpoint = `https://wordpress.com/post`; // Ideally we would use the permalink here, but fortunately this will be replaced with the // post permalink in the editor. const originalURL = `${ document.location.href }?page_id=${ post_id }`; const url = postEndpoint + '?url=' + encodeURIComponent( originalURL ) + '&is_post_share=true' + '&v=5'; const redirect = function () { if ( ! window.open( url, '_blank' ) ) { location.href = url; } }; if ( /Firefox/.test( navigator.userAgent ) ) { setTimeout( redirect, 0 ); } else { redirect(); } }, }; window.wpcom_reblog = wpcom_reblog; })(); </script> <script src="//stats.wp.com/w.js?68" defer></script> <script type="text/javascript"> _tkq = window._tkq || []; _stq = window._stq || []; _tkq.push(['storeContext', {'blog_id':'3379246','blog_tz':'-8','user_lang':'en','blog_lang':'en','user_id':'0'}]); _stq.push(['view', {'blog':'3379246','v':'wpcom','tz':'-8','user_id':'0','subd':'herbsutter'}]); _stq.push(['extra', {'crypt':'UE40eW5QN0p8M2Y/RE1mNzc2NTVTamdsd0xoLz9RQkM2K298TXY9bERQMXc2MjhEaVZfb2wwakRoSj0mUkp1THptM1NdbkV1WjZIcU9mVWQmPUIvMlN6Jk8wW3NYVEJ3dWZOWExuWD9CbmxqLENKeHZKRG9sOWtMPXxsPzZaPWE9UDdDckNaeEFMRTd6X01ITlUsWnlbaT9+ZDF4Y1MzK3VMNVJEdHppaXVrfjhBRFRfcFZkUXNQUHhBOTM3TnBUWDNZOV81LlZRY2ExXXorOC05eStzempraGZLRnw4P3kzZGFFLE05dG1YSDg3X3VYQnFsbHJsW0xSalV4T0Q4dzJbQU1HXyZQMExNbzdOa3VRWkwxRldwb2JlLk55bVVIWWlWOWx+dlQ2QkNmZGZIQXozNX56TXlDVEQ='}]); _stq.push([ 'clickTrackerInit', '3379246', '0' ]); </script> <noscript><img src="https://pixel.wp.com/b.gif?v=noscript" style="height:1px;width:1px;overflow:hidden;position:absolute;bottom:1px;" alt="" /></noscript> <script defer id="bilmur" data-customproperties="{&quot;enq_jquery&quot;:&quot;1&quot;,&quot;logged_in&quot;:&quot;0&quot;,&quot;wptheme&quot;:&quot;pub\/independent-publisher-2&quot;,&quot;wptheme_is_block&quot;:&quot;0&quot;}" data-provider="wordpress.com" data-service="simple" data-site-tz="Etc/GMT+8" src="/wp-content/js/bilmur-3-4-combined.min.js?i=12&m=202509"></script><script> ( function() { function getMobileUserAgentInfo() { if ( typeof wpcom_mobile_user_agent_info === 'object' ) { wpcom_mobile_user_agent_info.init(); var mobileStatsQueryString = ''; if ( wpcom_mobile_user_agent_info.matchedPlatformName !== false ) { mobileStatsQueryString += '&x_' + 'mobile_platforms' + '=' + wpcom_mobile_user_agent_info.matchedPlatformName; } if ( wpcom_mobile_user_agent_info.matchedUserAgentName !== false ) { mobileStatsQueryString += '&x_' + 'mobile_devices' + '=' + wpcom_mobile_user_agent_info.matchedUserAgentName; } if ( wpcom_mobile_user_agent_info.isIPad() ) { mobileStatsQueryString += '&x_' + 'ipad_views' + '=' + 'views'; } if ( mobileStatsQueryString != '' ) { new Image().src = document.location.protocol + '//pixel.wp.com/g.gif?v=wpcom-no-pv' + mobileStatsQueryString + '&baba=' + Math.random(); } } } document.addEventListener( 'DOMContentLoaded', getMobileUserAgentInfo ); } )(); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10