Arthur O’Dwyer
Stuff mostly about C++
- Posts
- 686 from 13 Mar 2018 to 17 Oct 2026
- Posting
- weekly (49 in the last year)
- Kind
- personal blog
- Feed
- https://quuxplusone.github.io/blog/feed.xml
2026 39
- _Paradise Lost_, diffed
- Is a sized random-access range always common?
- Recursive `make` and `-j`
- Spelling the type of a “self” parameter with Reflection
- Color Wheel combinatorics
- Tennyson and Babbage? No! Trevelyan
- Data members that want to use `size()`
- Colourfields
- Möbius-strip crosswords
- Kinton Ford’s _Canto I_
- How old is Ann?
- A crosswording miscellany (2026-07-28)
- Interconverting std::function with copyable_function (2026-07-26)
- Egerton MS 1995 (2026-07-16)
- Some recent discoveries (2026-07-01)
- Katakana and Cypriot (2026-06-12)
- C++26 Reflection gives us universal template parameters (2026-06-07)
- Branchless sorting of trivially relocatable types (2026-06-05)
- Does bulk memmove speed up std::remove_if? (No.) (2026-05-23)
- The Book of St Albans (1486) (2026-05-22)
- std::is_heap could be faster (2026-05-11)
- Two-Minute Iolanthe (2026-05-08)
- C++ Alignment Chart (2026-05-06)
- ELF’s ways to combine potentially non-unique objects (2026-05-05)
- Adventure: Is there light in the cobble crawl? (2026-04-30)
- Adventure: Walking on the ceiling (2026-04-28)
- Things C++26 define_static_array can’t do (2026-04-24)
- auto{x} != auto(x) (2026-04-11)
- The “macro overloading” idiom (2026-04-02)
- Seven Types of Ambiguity (1930) (2026-03-19)
- Chromium’s span-over-initializer-list success story (2026-03-19)
- MSVC’s /experimental:constevalVfuncNoVtable is non-conforming (2026-03-12)
- A dialogue on trivial-abi and trivially relocatable (2026-03-02)
- What I’m reading lately: Graves on caves (2026-02-15)
- has_unique_object_representations versus __is_trivially_equality_comparable (2026-02-14)
- KenKen with Roman numerals (2026-02-10)
- Mysteries of the map, partly answered (2026-01-19)
- Divergence in instantiating unused functions of unevaluated lambdas (2026-01-17)
- Sirius XM’s AI call center gives good deals (2026-01-03)
2025 50
- What I watched and read this year (2025-12-31)
- LONG0751: Mysteries of Donovan’s map (2025-12-30)
- LONG0751 has been found! (2025-12-29)
- map::operator[] should be nodiscard (2025-12-18)
- Recent miscellany: 1D glider, flags, stripes, and telephony (2025-12-07)
- Two kinds of tag types: foo_t and foo_tag (2025-12-03)
- When should a =delete’d constructor be explicit? (2025-11-24)
- Picked shrimps (2025-11-22)
- How my papers did at Kona (2025-11-18)
- Thoughts on P3858R0 restart_lifetime<T> (2025-10-18)
- The C++26 NB comments have arrived (2025-10-12)
- Implicit operator bool participates in comparison (2025-10-10)
- What breaks without implicit T*-to-bool conversion? (2025-10-05)
- Bill and Ted’s Godot: It’s awful (2025-09-25)
- PSA: views::single doesn’t really view (2025-09-16)
- Parallel epigrams in Borges and Butler (2025-09-09)
- A poem all in dactylic noun substantives, part 3 (2025-09-06)
- A poem all in dactylic noun substantives, part 2 (2025-08-30)
- A poem all in dactylic noun substantives, part 1 (2025-08-28)
- Counting polybar polyominoes (2025-08-23)
- Whenever a library clause uses CTAD or list-initialization, it’s wrong (2025-08-22)
- Varaldo’s Shahrazad and Chiti’s Centunesimo Canto (2025-08-11)
- On the art of correcting manuscripts, etc. (2025-08-03)
- True names matter in C++ (2025-08-01)
- D. C. Phillips’ The Promised One (1915) (2025-07-17)
- Explainable Minesweeper and solvable nonograms (2025-07-06)
- Animating moving juggling patterns (2025-06-22)
- Winning 4x4x4 tic-tac-toe by consulting an oracle (2025-06-02)
- Array member-initializers in GCC (2025-05-27)
- Wordle-like games require two word lists (2025-05-23)
- Pernicious Rumor and “falling” stars (2025-05-11)
- Non-constexpr Optional and trivial relocation (2025-05-09)
- Constexpr Optional and trivial relocation (2025-05-08)
- Type-erasure, trivial relocation, and lethal sirens (2025-05-01)
- Names of the tetrominoes (2025-04-19)
- Phrase origin: Why do we “call” functions? (2025-04-04)
- Essays on Modern C++ released (2025-03-30)
- Constexpr factors_of (2025-03-14)
- NYPL Musical of the Month (2025-03-10)
- Grab bag: Spartan sayings, Jack Pointey (2025-03-01)
- Both sides of the shield (2025-02-28)
- Better diagnostics through operator-precedence parsing (2025-02-27)
- How my papers did at Hagenberg (2025-02-18)
- Like (2025-02-09)
- Dante’s hypersphere in THREE.js (2025-02-02)
- The crossword from Bored to Death S2E5 (2025-01-28)
- “Trivially relocatable” versus “trivially destructible after move” (2025-01-10)
- Semantically ordered arguments, round 2 (2025-01-05)
- Fully Schrödinger crosswords (2025-01-03)
- Does v.clear() free the allocation? (2025-01-02)
2024 53
- What I watched and read this year (2024-12-31)
- “Cumbersome” labeled loops and the C preprocessor (2024-12-22)
- Labeled loop syntax in many languages (2024-12-20)
- Field-testing -Wassign-to-class-rvalue (2024-12-13)
- When ranges::for_each behaves differently from for (2024-12-09)
- std::expected should be nodiscard (2024-12-08)
- The Elements of Programming Style (1974) (2024-11-27)
- Shifting objects by less than sizeof(T) (2024-11-08)
- Wolf (1906) on the false Quijotes of Avellaneda and Lesage (2024-11-02)
- Martin Gardner Scientific American Index; Rule 110 challenge (2024-10-21)
- What I’m reading lately: Greppability, Hebb’s dictum (2024-10-15)
- Why don’t compilers warn for const T f()? (2024-10-07)
- Playing A Serf’s Tale (1986) (2024-09-30)
- The red right arm of Jove (2024-09-09)
- Nash equilibria in Ballmer’s binary-search interview game (2024-09-04)
- The little bird attacks the snake (2024-08-26)
- Boost.Interprocess, and sg14::inplace_vector (2024-08-23)
- Andries Brouwer on the OOM killer (2024-08-22)
- noexcept affects libstdc++’s unordered_set (2024-08-16)
- Make things simpler than possible (2024-08-04)
- Counting distinct n-state DFAs (2024-07-27)
- Why can’t I specialize std::hash inside my own namespace? (2024-07-15)
- A priority_tag-like pattern for type-based metaprogramming (2024-07-07)
- std::try_cast and (const&&)=delete (2024-07-03)
- How my papers did at St Louis (2024-06-30)
- How the STL uses explicit (2024-06-25)
- Because Internet (2019) (2024-06-19)
- Who uses P2786 and P1144 for trivial relocation? (2024-06-15)
- Tangent circles of integer radius (2024-06-10)
- Topsys & Turvys (1893) (2024-05-23)
- Types that falsely advertise P2786 trivial relocatability (2024-05-18)
- Types that falsely advertise trivial copyability (2024-05-15)
- Using Wikipedia’s API to find inconsistently hyphenated French names (2024-05-04)
- Reverse the List of Integers (2024-04-22)
- A case study in not-quite-move-semantic library design (2024-04-18)
- Name lookup in multiple base classes (2024-04-17)
- Help wanted: Compile your codebase with P1144 and P2786 relocatability! (2024-04-10)
- The Mummy! (1827) (2024-04-08)
- Johnson’s definition of network (2024-04-05)
- Trivial, but not trivially default constructible (2024-04-02)
- Ed Catmur’s Triliteral esolang (2024-03-31)
- Some St. Patrick’s Day math (2024-03-17)
- The 2024 Google Summer of Code idea lists are out (2024-03-05)
- The algebraic structure of Infinite Craft (2024-03-03)
- Sorting at compile time, part 2 (2024-02-20)
- Sorting integer_sequence at compile time (2024-02-19)
- Feature requests for the Auto macro (2024-02-14)
- Infinite Craft (2024-02-08)
- A note on feature-test macros (2024-02-06)
- Fun with “deducing this” lambdas (2024-01-23)
- Pentoprimality (2024-01-15)
- What I’m reading lately: Africa, liberty, economics (2024-01-12)
- Should assignment affect is_trivially_relocatable? (2024-01-02)
2023 66
- Acorns and honey in the Golden Age (2023-12-26)
- Holiday puzzle: Anagrams modulo two (2023-12-24)
- Two kinds of function template parameters (2023-12-17)
- Moving via relocate-and-construct (2023-12-06)
- A Dissertation Upon Roast Pig (1822) (2023-11-20)
- How to type-pun via catching by non-const reference (2023-11-17)
- How my papers did at Kona (2023-11-12)
- Guard nouns or guard verbs? (2023-11-11)
- Map of NYC Michelin stars, 2023 (2023-11-08)
- My muscle-memory git toolbox (2023-10-30)
- Happy 109th birthday, Martin Gardner! (2023-10-21)
- Quuxplusone/SG14 now has inplace_vector (2023-10-20)
- Origins and purposes (2023-10-18)
- constexpr std::string update (2023-10-13)
- How boost::is_base_of matches private and/or ambiguous bases (2023-10-06)
- R.I.P. The OFloinn (2023-10-03)
- A neat technique for custom output iterators (2023-10-01)
- Succession joke chyrons (2023-09-26)
- Blog roundup: U+, Bloomfield, Stuka, Gino (2023-09-16)
- Just how constexpr is C++20’s std::string? (2023-09-08)
- Some C++20 ranges aren’t const-iterable (2023-08-13)
- The style guide must say how to do what you mustn’t do (2023-08-11)
- Fun with quadratic pack-expansions (2023-08-05)
- Kotlin AssertJ cheat sheet (2023-07-28)
- Socrates on why there’s no erase_if for span (2023-07-16)
- How “static storage for initializers” did at Varna (2023-07-05)
- What I’m reading lately: Dogs and Wolfe (2023-07-01)
- Space-filling polycube snakes (2023-06-27)
- Polymorphic types aren’t trivially relocatable (2023-06-24)
- PSA: Value-initialization is not merely default-construction (2023-06-22)
- A small C++ meme dump (2023-06-17)
- Themistocles and Alexander (2023-06-07)
- Make operator<=> ignore a data member (2023-06-05)
- P1144 PMR koans (2023-06-03)
- A not-so-quick introduction to the C++ allocator model (2023-06-02)
- Don’t forward things that aren’t forwarding references (2023-05-27)
- A deduction guide for Foo(Ts..., Ts...) (2023-05-26)
- Triangular Tetris (2023-05-19)
- Implementation divergence with a moved-from set comparator (2023-05-10)
- Polymorphic types and -Wdeprecated-copy-dtor (2023-05-05)
- Fun with flat_map’s non-explicit constructors (2023-04-28)
- std::format from scratch, part 3 (2023-04-23)
- std::format from scratch, part 2 (2023-04-22)
- std::format from scratch, part 1 (2023-04-21)
- Trivial functions can still be non-nothrow (modulo compiler bugs) (2023-04-17)
- Most C++ constructors should be explicit (2023-04-08)
- Escheresque parquet deformations of an aperiodic monotile (2023-03-30)
- Mathematical golf (2023-03-23)
- The epitaph of Adrian’s horse (2023-03-22)
- Iterating and inverting a const views::filter (2023-03-13)
- Should the compiler sometimes reject a [[trivially_relocatable]] warrant? (2023-03-10)
- Computing OEIS A360447 (2023-03-05)
- Update on my trivial swap prize offer (2023-03-04)
- STL algorithms for trivial relocation (2023-03-03)
- Making priority_queue and flat_set work with move-only types (2023-03-01)
- Trivial relocation, std::swap, and a $2000 prize (2023-02-24)
- -Ought words (2023-02-20)
- How my papers did at Issaquah (2023-02-17)
- The jargon treadmill (2023-02-04)
- Simple C++20 input and output iterators (2023-01-27)
- Always read the first error message first (2023-01-21)
- P1967 #embed and D2752 “Static storage for initializer_list” are now on Compiler Explorer (2023-01-13)
- Happy birthday, Donald Knuth! and lamp-trolls (2023-01-10)
- In search of Adventure ]I[ (1981-ish) (2023-01-09)
- Pangrams and Scrabblegrams (2023-01-02)
- Milner’s lamp (2023-01-01)
2022 57
- Hash-colliding string literals on MSVC (2022-12-31)
- Benchmarking Clang’s -fbuiltin-std-forward (2022-12-24)
- API design advice from Anakin and Obi-Wan (2022-12-17)
- Copy semantics, per Plato’s Sophist (2022-12-15)
- Replacing std::lock_guard with a factory function (2022-12-14)
- Lego polycube snakes (2022-12-11)
- Polyomino strips, snakes, and ouroboroi (2022-12-08)
- Techniques for post-facto multiple inheritance (2022-12-01)
- Polycube snakes and ouroboroi (2022-11-18)
- The game of Zendo (2022-11-13)
- What I’m reading lately: tunnel edition (2022-11-12)
- Refactoring with =delete (2022-11-11)
- Bit-vector manipulations in standard C++ (2022-11-05)
- Style Invitational Week 1509: Two-Reelers (2022-11-03)
- Map of NYC Michelin stars, 2022 (2022-10-25)
- Issachar Styrke’s Alcestis Burlesqued (2022-10-24)
- Notes on Sonia Greene’s Alcestis (2022-10-23)
- Sonia Greene’s Alcestis (2022-10-22)
- Prefer core-language features over library facilities (2022-10-16)
- Thoughts on -Wctad-maybe-unsupported (2022-10-07)
- A “pick two” triangle for std::vector (2022-09-30)
- What I’m reading lately: Borges, Jung, Hitchcock (2022-09-24)
- The game of Lielow (2022-09-02)
- What is the “vector pessimization”? (2022-08-26)
- Playing The Search for Almazar (1981) (2022-08-13)
- Beware CTAD on reverse_iterator (2022-08-02)
- Type-erased InplaceUniquePrintable benefits from noexcept (2022-07-30)
- What I’m reading lately: Scholar’s Stage, Popper, Grug (2022-07-26)
- Google Timer is dead; long live BigTimer (2022-07-25)
- Fun with lifetime-extended results of assignment (2022-07-09)
- An example where inline constexpr makes a difference (2022-07-08)
- void versus [[noreturn]] (2022-06-29)
- unordered_multiset’s API affects its big-O (2022-06-23)
- Three Men Discuss Relativity (1926) (2022-06-17)
- C++20’s parenthesized aggregate initialization has some downsides (2022-06-03)
- Blessed nuns fret not at their narrow rooms (2022-05-23)
- Heavy Planet (2022-05-22)
- std::relocate’s implementation is cute (2022-05-18)
- Two more musings on Clang diagnostics (2022-05-05)
- To enable ADL, add a using-declaration (2022-04-30)
- The humble potato (2022-04-25)
- PSA: ADL requires that unqualified lookup has found a function (2022-04-14)
- Larson wine limericks (2022-03-30)
- Kafka, math jokes, triangle dissection (2022-03-24)
- TIL: nullopt_t is not equality-comparable, but monostate is (2022-03-07)
- History of non-standard-layout class layouts (2022-03-04)
- What if vector<T>::iterator were just T*? (2022-03-03)
- Evirdle (2022-02-27)
- Birdle (2022-02-20)
- “Universal reference” or “forwarding reference”? (2022-02-02)
- A minimally interesting typo-bug (2022-01-29)
- volatile means it really happens (2022-01-28)
- const all the things? (2022-01-23)
- The economist’s $100 bill, and the virtue of consistency (2022-01-20)
- The best engineering interview question I’ve ever gotten, Part 2 (2022-01-07)
- The best engineering interview question I’ve ever gotten, Part 1 (2022-01-06)
- Test an expression for constexpr-friendliness (2022-01-04)
2021 78
- Completeness preconditions considered harmful (2021-12-27)
- I sweded the LLVM Bugzilla migration (2021-12-11)
- A note on namespace __cpo (2021-12-07)
- view_interface types are boolean-testable (2021-12-06)
- Underseeding mt19937; introducing xoshiro256ss (2021-11-23)
- Is path convertible to string_view?: a war story (2021-11-21)
- A footnote on “Three reasons to pass std::string_view by value” (2021-11-19)
- Cryptic poems, Mahabharata, means of production (2021-11-18)
- Image rotation by shifting pixels (2021-11-13)
- Image rotation by three affine transformations (2021-11-26)
- Three reasons to pass std::string_view by value (2021-11-09)
- The Fourth Dimension and the Bible (1922) (2021-11-05)
- C++ Pub Quiz at CppCon 2021, Game Two (2021-10-29)
- Overload arrangement puzzles (2021-10-29)
- C++ Pub Quiz at CppCon 2021, Game One (2021-10-28)
- Don’t reopen namespace std (2021-10-27)
- operator<=> doesn’t obsolete the hidden friend idiom (2021-10-22)
- Back to Basics at CppCon 2021 (2021-10-21)
- Rolling 2d6 with playing cards (2021-10-21)
- Book Review: Fedor Pikus’ The Art of Writing Efficient Programs (2021-10-19)
- What =delete means (2021-10-17)
- Lineup for next week’s Celebration of Mind (2021-10-16)
- Evasive Maneuvers (1994) (2021-10-08)
- A macro for migrating to static operator() (2021-10-07)
- std::span should have a converting constructor from initializer_list (2021-10-03)
- The peasants are revolting (2021-09-30)
- A class without a copy constructor (2021-09-17)
- A compile-time benchmark for enable_if and requires, part 2 (2021-09-14)
- Bit patterns of float (2021-09-05)
- A compile-time benchmark for enable_if and requires (2021-09-04)
- Two old crosswords of mine (2021-08-24)
- Two counterintuitive results (2021-08-12)
- Field-testing P2266 “Simpler Implicit Move” (2021-08-07)
- Don’t explicitly instantiate std templates (2021-08-06)
- Perfect forwarding call wrappers need =delete (2021-07-30)
- Buddhabrot (2021-07-27)
- Cratylus on choosing good names (2021-07-15)
- An iterator IS-NOT-A const_iterator (2021-07-14)
- priority_tag for ad-hoc tag dispatch (2021-07-09)
- Implementation divergence on swapping bools within vectors (2021-06-27)
- Another requires-clause syntax pitfall (2021-06-09)
- Tag dispatch versus concept overloading (2021-06-07)
- A Night of Serious Drinking and operationalism (2021-06-04)
- C++ On Sea 2021 schedule announced (2021-05-27)
- Overly interoperable libraries, part 3 (2021-05-26)
- The Fishspear priority queue algorithm (2021-05-23)
- Overly interoperable libraries, part 2 (2021-05-22)
- A metaprogramming puzzle: Overly interoperable libraries (2021-05-19)
- “Modern STL Programming” at C++ On Sea 2021 (2021-05-17)
- Play The Search for Almazar online (2021-05-16)
- Nifty notebooks, and Almazar (2021-05-13)
- An interview with Arthur O’Dwyer (2021-05-11)
- Removing an empty base class can break ABI (2021-05-07)
- Semantically ordered arguments should be lexically ordered too (2021-05-05)
- P2266’s interaction with decltype(auto) (2021-05-04)
- Optimizing string::append is harder than it looks (2021-04-17)
- Lineup for next week’s Celebration of Mind (2021-04-15)
- Antisocial Homeworlds, and a solitaire challenge (2021-04-04)
- static constexpr unsigned long is C++’s “lovely little old French whittling knife” (2021-04-03)
- Observations on Castlequest’s code (2021-03-21)
- Playing Castlequest (1980), Part 2 (2021-03-20)
- Playing Castlequest (1980), Part 1 (2021-03-19)
- Does throw x implicit-move? Let’s ask SFINAE (2021-03-18)
- C’s removal of gets could have been done better (2021-03-12)
- Making Castlequest compilable (2021-03-11)
- Castlequest exhumed! (2021-03-09)
- Escape analysis hates copy elision (2021-03-07)
- Don’t blindly prefer emplace_back to push_back (2021-03-03)
- Adventure 448 (SWEN0448): All the easter eggs (2021-02-27)
- When your loop unroller works harder than your infinite loop detector (2021-02-26)
- Homeworlds: Analysis of an Opening Gambit (2021-02-21)
- A hole in Clang’s -Wsuggest-override (2021-02-19)
- When can the C++ compiler devirtualize a call? (2021-02-15)
- Blog roundup: Auftragstaktik, files, lesser-known cryptocurrencies (2021-02-13)
- decltype of a non-static member (2021-02-10)
- What are X-macros? (2021-02-01)
- Fun with conversion-operator name lookup (2021-01-13)
- It’s not always obvious when tail-call optimization is allowed (2021-01-09)
2020 96
- The Box of Delights (2020-12-27)
- Thoughts on “Does GPT-2 Know Your Phone Number?” (2020-12-27)
- A better 404 polyglot (2020-12-23)
- How do C++ using-directives work? (2020-12-21)
- The STL is more than std::accumulate (2020-12-14)
- Bubblesort, rocksort, and cocktail-shaker sort (2020-12-13)
- Tips re operator() (2020-12-12)
- An example of the Barton–Nackman trick (2020-12-09)
- “Flash of unstyled base class” (2020-12-09)
- How to use a private member from outside the class (2020-12-03)
- Loop variable may not be declared static (2020-12-03)
- How different compilers deal with provably unused entities (2020-12-02)
- Arrays aren’t pointers (2020-11-25)
- Type-erased UniquePrintable and PrintableRef (2020-11-24)
- Flavors of Base64 encoding (2020-11-17)
- Lifetime extension applies to whole objects (2020-11-16)
- Some thoughts on U.S. politics (2020-11-05)
- SFINAE and E1.E2 (2020-11-01)
- Colonel Blimp and An Inspector Calls (2020-11-01)
- while (auto x=y; z) (2020-10-28)
- Homeworlds Puzzle: Mercury in Retrograde (2020-10-28)
- Homeworlds Puzzle: Burnt Umber (2020-10-25)
- std::once_flag is a glass hill (2020-10-23)
- Scott Kim’s rotational ambigrams for the Celebration of Mind (2020-10-18)
- Thoughts on OEIS A125508 (2020-10-18)
- Conway’s Soldiers (2020-10-17)
- Site reliability engineering at Ardeer; eyewitnesses to Hiroshima (2020-10-17)
- A case study in implementation inheritance (2020-10-15)
- Left-folding and right-folding an arbitrary callable (2020-10-12)
- Grab bag (2020-10-12)
- A very short war story on too much overloading (2020-10-11)
- Inheritance is for sharing an interface (and so is overloading) (2020-10-09)
- Solo-player rules for Colossal Cave: The Board Game (2020-10-02)
- Classically polymorphic visit replaces some uses of dynamic_cast (2020-09-29)
- September blog roundup (2020-09-26)
- Why do I get a linker error with static const and value_or? (2020-09-19)
- C++ Pub Quiz at CppCon 2020, Game Two (2020-09-18)
- C++ Pub Quiz at CppCon 2020, Game One (2020-09-16)
- “Classic STL” at CppCon 2020 (2020-09-12)
- For what inputs is std::sort unstable? (2020-09-11)
- Two musings on the design of compiler warnings (2020-09-02)
- -Wrange-loop-bind-reference and auto&& (2020-08-26)
- Phantoms vs Phantoms (Geister) (2020-08-22)
- MathJax v3 in Jekyll (2020-08-19)
- What I’m reading lately: New York, The Atlantic, The Three-Body Problem (2020-08-15)
- Back to Basics at CppCon 2020 (2020-08-11)
- Concepts can’t do quantifiers (2020-08-10)
- The “array size constant” antipattern (2020-08-06)
- What I’m reading lately: The Ring of Words (2020-08-05)
- An obvious guideline on function-call style (2020-07-23)
- A Parody on Iolanthe (2020-07-20)
- What is the std::swap two-step? (2020-07-11)
- How to erase from an STL container (2020-07-08)
- What I’m reading lately: ACOUP, Kitbashed, the Atlantic (2020-07-06)
- Decompiling GOET0580 (2020-06-30)
- The Star Wars cellular automaton (2020-06-29)
- Homeworlds Puzzle: The Prestige (2020-06-16)
- Lovecraft on Hitler (2020-06-09)
- Homeworlds Puzzle: War Games (2020-05-30)
- The Case of Willie the Wisp (2020-05-29)
- Homeworlds Puzzle: Mini Doomsday Machine (2020-05-29)
- The “OO” Antipattern (2020-05-28)
- Folding over operator= (2020-05-07)
- C++Now 2020: A C++ Magic Trick (2020-05-04)
- Connect Fifteen (2020-05-03)
- Default function arguments are the devil (2020-04-18)
- Precedence of a proposed |> operator (2020-04-10)
- Hello Muddah, Hello Faddah (Coronavirus Version) (2020-04-08)
- What I’m reading lately: The Compleat Boucher (2020-04-05)
- A seasonal followup to “When is *x also &x?” (2020-04-01)
- When is *x also &x? (2020-03-31)
- Discrete Peaceful Encampments, Bernie Sanders version (2020-03-21)
- c_str-correctness (2020-03-20)
- Ways C++ prevents you from doing X (2020-03-17)
- The Tau Manifesto (2020-03-14)
- Contra char *argv[] (2020-03-12)
- The Design of Everyday Things (2020-03-07)
- Thoughts on “The C++ Rvalue Lifetime Disaster” (2020-03-04)
- Field-testing “Down with lifetime extension!” (2020-03-04)
- The abstraction penalty for wide integer math on x86-64 (2020-02-13)
- How to replace __FILE__ with source_location in a logging macro (2020-02-12)
- Two approaches to secret sharing: math vs. blockchain (2020-02-12)
- “Myths about /dev/urandom” and “What Is JavaScript Made Of?” (2020-02-09)
- A bug in Adventure’s endgame (2020-02-06)
- SFINAE special members or support incomplete types: Pick at most one (2020-02-05)
- OpenSSL client and server from scratch, part 5 (2020-01-28)
- OpenSSL client and server from scratch, part 4 (2020-01-27)
- OpenSSL client and server from scratch, part 3 (2020-01-26)
- OpenSSL client and server from scratch, part 2 (2020-01-25)
- OpenSSL client and server from scratch, part 1 (2020-01-24)
- Hidden reinterpret_casts (2020-01-22)
- Canonicalizing {0,1}-matrices with Nauty (2020-01-11)
- A quirk of qualified member lookup (2020-01-11)
- Wolves and Sheep, with tables (2020-01-10)
- Namespaces are for preventing name collisions (2020-01-07)
- The Story of Mel (2020-01-05)
2019 107
- Comparative TMP #1: MPL, Mp11, Kvasir, Hana, Metal (2019-12-28)
- Holiday fun with template<class> and template<typename> (2019-12-27)
- De Canibus Britannicis (2019-12-17)
- Implementation divergence with const int i; and mutable (2019-12-04)
- Setup and teardown routines in non-flat class hierarchies (2019-12-03)
- Sorrows and So You Want to Be a Wizard (2019-11-30)
- Slack’s new WYSIWYG input box is really terrible (2019-11-20)
- Throwback Saturday: Three variants on 2048 (2019-11-16)
- How to build LLVM from source, monorepo version (2019-11-09)
- Hello World with C++2a modules (2019-11-07)
- PSA: <random>’s distributions are stateful (2019-10-22)
- CppCon 2019 talks are up (2019-10-18)
- Discrete Peaceful Encampments, with tables (2019-10-18)
- An unexpected brush with “strong typedefs” (2019-10-10)
- Why doesn’t C++ have networking support? (2019-10-09)
- What is the virtual table table? (2019-09-30)
- ADL can interfere even with uglified names (2019-09-26)
- Thoughts on Herb Sutter’s CppCon keynote (2019-09-24)
- C++ Pub Quiz at CppCon 2019 (2019-09-21)
- A trivially copyable ticket for a unique_ptr (2019-09-21)
- Seen on the CppCon whiteboard (2019-09-18)
- Back to Basics at CppCon 2019 (2019-09-12)
- Implementation divergence with friend (2019-09-10)
- Transcription of All Of Them Witches (2019-08-26)
- Church booleans in Befunge-98 (2019-08-24)
- Self-assignment and the Rule of Zero (2019-08-20)
- The post-Cologne mailing is out (2019-08-18)
- Dragonflight, and running DosBox in the browser (2019-08-11)
- Mangling dependent parameter types, or, what happened to std::default_order (2019-08-08)
- Confessions of a Justified Sinner (2019-08-06)
- A C++ acronym glossary (2019-08-02)
- What is 8÷2(2+2)? (2019-08-01)
- A cellular automaton that makes beautiful little patterns (2019-07-27)
- Making floppy disk images under OS X (2019-07-26)
- Prince Rupert’s Lego Cube (2019-07-23)
- Notes on Prince Rupert’s Problem (2019-07-22)
- Concept definition-checking and its woes (2019-07-22)
- What I’m reading lately (2019-07-19)
- C++2a Coroutines and dangling references (2019-07-10)
- Conditional explicit is not the same thing as forwarding explicit (2019-07-05)
- Enums break strong structural equality (2019-07-04)
- P1616R0 and health insurance (2019-07-03)
- Announcing Quuxplusone/coro, single-header C++2a example code (2019-07-03)
- C++Now video tidbits (2019-07-02)
- Contra P0339 “polymorphic_allocator<> as a vocabulary type” (2019-07-02)
- In support of P1485 “Better keywords for coroutines” (2019-06-26)
- My C++Now 2019 talks are captioned (2019-06-25)
- “The STL From Scratch” is back! (2019-06-21)
- “Exception Handling: A False Sense of Security” (2019-06-17)
- Dealing with Dragons (2019-06-09)
- “Understanding Real-World Concurrency Bugs in Go” (2019-06-06)
- MapView can be faster than MapRef (2019-05-27)
- A faster WG21 CWG issue browser (2019-05-22)
- MSVC can’t handle move-only exception types (2019-05-11)
- On function_ref and string_view (2019-05-10)
- Befunge and Flobnar (2019-05-02)
- The wit of Macaulay, who wrote of Frederick II (2019-04-29)
- What is ADL? (2019-04-26)
- This one weird trick for customization by class template (partial) specialization (2019-04-26)
- Puzzle: Wolves and sheep (2019-04-17)
- Fork considered harmful; paint splatters considered Perl (2019-04-13)
- How hana::type<T> “disables ADL” (2019-04-09)
- ADL insanity (2019-04-08)
- Booth bits; modern cuisine (2019-03-28)
- The space of design choices for std::function (2019-03-27)
- Map of NYC Michelin stars, 2019 (2019-03-26)
- How my papers did at Kona (2019-03-20)
- What is Type Erasure? (2019-03-18)
- README for my Peaceful Encampments visualizer (2019-03-18)
- RFM: Request for mashups (2019-03-17)
- Value category is not lifetime (2019-03-11)
- PSA: shared_ptr<T>() is not make_shared<T>() (2019-03-06)
- Four versions of Eric’s Famous Pythagorean Triples Code (2019-03-06)
- Is __int128 integral? A survey (2019-02-28)
- Thoughts on P1306 “Expansion Statements” (2019-02-28)
- Fetishizing class invariants (2019-02-24)
- Not variadic expression templates (2019-02-23)
- P1144 case study: Moving a fixed_capacity_vector (2019-02-22)
- What library types are trivially_relocatable in practice? (2019-02-20)
- The Knightmare of Initialization in C++ (2019-02-18)
- compressed_vector_traits (2019-02-16)
- Quick and unscientific trivially_relocatable benchmark (2019-02-12)
- Packs of packs (2019-02-11)
- shared_ptr(&w, _1) (2019-02-06)
- C++ idiom of the day: arrow_proxy (2019-02-06)
- Hot takes on P1452, P1470, P0408, and P0843 (2019-02-03)
- On teaching Unicode in C++ (2019-02-03)
- Contra P0429R6 flat_map (2019-01-29)
- Hot takes on flat_map, resize_default_init, and ranges::to (2019-01-28)
- Colossal Cave Adventure: open world challenge (2019-01-28)
- nodiscard philosophies (2019-01-25)
- Discrete Peaceful Encampments (2019-01-24)
- Peaceful Encampments, round 2 (2019-01-21)
- Pointer comparisons with std::less<void>: a horror story (2019-01-20)
- Covariance and contravariance in C++ (2019-01-20)
- requires-expression grammar trivia (2019-01-17)
- Is this std::vector? (2019-01-17)
- Measuring adoption of C++17 and CTAD in real codebases (2019-01-16)
- On choosing the exact right terminology (2019-01-15)
- Why do we require requires requires? (2019-01-15)
- Les Fleurs de Tarbes (2019-01-14)
- The blow-up problem (2019-01-14)
- Happy birthday, Donald Knuth! and Peaceful Encampments (2019-01-10)
- 37 percent of HyperRogue’s compilation time is due to std::function (2019-01-06)
- Booth on Cassio (2019-01-05)
- const is a contract (2019-01-03)
- Should foo be move-only? (2019-01-02)
2018 140
- for (auto&& elt : range) Still Always Works (2018-12-27)
- Against the Grain: Contraception, abortion, and slow death (2018-12-26)
- Against the Grain: Pitcher plant (2018-12-25)
- Fictional islands that are neither fictional nor islands (2018-12-16)
- for (auto&& elt : range) Always Works (2018-12-15)
- Don’t inherit from standard types (2018-12-11)
- Contra CTAD (2018-12-09)
- Don’t put -Weverything in your build flags (2018-12-06)
- Pitfalls and decision points in implementing const_iterator (2018-12-01)
- Remember the ifstream (2018-11-26)
- How DNS got so complicated (2018-11-20)
- Meta-sudoku, round 4: A valid meta-puzzle (2018-11-20)
- “Counterfactual mugging” a.k.a. “charity” (2018-11-19)
- Meta-sudoku, round 3: D’oh! (2018-11-19)
- Meta-sudoku, round 2 (2018-11-18)
- Execution-agent-local storage (2018-11-14)
- Callee-destroy versus caller-destroy parameter lifetimes (2018-11-12)
- [[trivially_relocatable]] in San Diego: call for reader feedback (2018-11-11)
- An argument pro liberal use of [[nodiscard]] (2018-11-06)
- WG21: Avoid creating ADL situations on functions with semi-common names (2018-11-04)
- Cheaply relocatable, but not trivially relocatable (2018-10-26)
- C++2a idioms for library feature detection (2018-10-26)
- Puzzle: Sudoku Stories (2018-10-26)
- I won’t be in San Diego (2018-10-20)
- The “Red Clause” (2018-10-05)
- Trivially Relocatable FAQ (2018-10-04)
- Trivially Relocatable versus Destructive Movable (2018-09-28)
- Pray-Mister-Babbage problems (2018-09-26)
- “Perfect backwarding” (2018-09-25)
- Concepts as door-opening robots (2018-09-24)
- A simpler SUBSUMES() macro (2018-09-23)
- A use-case for member concepts and/or template concept parameters (2018-09-17)
- Data race when catching by non-const reference (2018-09-16)
- Homeworlds: The Yellowbird Mistake, Part II (2018-09-15)
- Homeworlds: The Yellowbird Mistake (2018-09-10)
- Constrained forwarding references considered sketchy as frick (2018-09-09)
- The big problems for C++11 SFINAE (2018-09-08)
- The Mysteries of London (2018-09-05)
- make_range and reversed (2018-08-29)
- C++ doesn’t know how to do customization points that aren’t operators (2018-08-23)
- Stopping the cascade of errors (2018-08-23)
- Exploring C++ types with puts(__PRETTY_FUNCTION__) (2018-08-22)
- mutable and “trivially fooable” (2018-08-19)
- Fixing ADL, Round 2 (2018-08-14)
- Field-testing Herb Sutter’s Modest Proposal to Fix ADL (2018-08-13)
- The Auto macro (2018-08-11)
- Comparison categories for narrow-contract comparators (2018-08-07)
- The FORCE_CONSTEXPR macro (2018-08-07)
- Quantum Computing for the Determined (2018-08-05)
- MathJax in Jekyll (2018-08-05)
- Case study: Making std::any trivially relocatable (2018-08-02)
- The Three Impostors: Four-ale and six-ale (2018-07-26)
- Godspell and Max Havelaar (2018-07-23)
- Template metaprogramming: Iteration is better than recursion (2018-07-23)
- Announcing “trivially relocatable” (2018-07-18)
- What does the Standard mean by “_traits”? (2018-07-14)
- If English was written like Chinese (2018-07-13)
- When is a trivially copyable object not trivially copyable? (2018-07-13)
- operator auto (2018-07-12)
- Renowned author Dan Brown; London’s Gold-Mines (2018-07-10)
- Roll for member functions (2018-07-09)
- SCARY metafunctions (2018-07-09)
- C++ quiz of the day (2018-07-08)
- Defaulted destructor inhibits move (2018-07-07)
- Portia’s Caskets, Explained (2018-07-06)
- Thoughts on “sanely move-assignable” (2018-07-06)
- Assume a spherical politician (2018-07-04)
- Trivially-constructible-from (2018-07-03)
- CppCon 2018 Early Bird Registration closes on July 7th (2018-07-02)
- Broken Koans (2018-06-30)
- Trivially swappable (2018-06-29)
- The surprisingly high cost of static-lifetime constructors (2018-06-26)
- shields.io (2018-06-26)
- “We were defeated by one thing only—” (2018-06-22)
- Madame Scarron (2018-06-22)
- Is your constructor an object-factory or a type-conversion? (2018-06-21)
- ’Ware Wire (2018-06-20)
- The Fundamental Theorem of Software Engineering (2018-06-18)
- inplace_foo versus fixed_capacity_foo (2018-06-18)
- Avoid ADL calls to functions with common names (2018-06-17)
- Which in your case you have not got (2018-06-17)
- My C++Now 2018 talks are captioned (2018-06-13)
- Attribute noexcept_verify (2018-06-12)
- Perennial impossibilities of C++ (2018-06-12)
- Pointer to raw memory? T*. (2018-06-08)
- has_no_padding_bits (2018-06-08)
- Stone Soup (2018-06-06)
- <memory_resource> for libc++ (2018-06-05)
- My C++Now 2018 talks are up (2018-06-04)
- Setting errno in operator T (2018-06-01)
- Rubens tube (2018-05-30)
- View types with metadata cause problems (2018-05-30)
- Thoughts on Concepts, P0745, and P1079 (2018-05-28)
- In praise of make_unique (2018-05-26)
- Great Deploy Plans of History: Time Zones (2018-05-21)
- Superconstructing super elider, round 2 (2018-05-17)
- Contra implicit declarations of struct types (2018-05-16)
- The Ignorable Attributes Rule (2018-05-15)
- Puzzle: Policing Squaresville (2018-05-10)
- Default-constructibility is overrated (2018-05-10)
- A pro-default-constructibility experiment from 2007 (2018-05-10)
- Hiding template parameters from casual users (2018-05-09)
- [[trivial_abi]] 101 (2018-05-02)
- Happy birthday, Don Woods (2018-04-30)
- Contra locales (2018-04-30)
- Embedding quotes in strings (2018-04-27)
- std::priority_queue is missing an operation (2018-04-27)
- WG21 and the National Popular Vote Compact (2018-04-26)
- The Lakos Rule (2018-04-25)
- Downsides of omitting trivial destructor calls (2018-04-17)
- How to build LLVM from source (2018-04-16)
- Contra built-in library types (2018-04-15)
- Chinese fonts, and METAFONT (2018-04-15)
- Copy Elision in Throw Statements (2018-04-09)
- A modest proposal for a GCC diagnostic (2018-04-09)
- Hanabi set-packing puzzle (2018-04-09)
- The Description of a New World, Called The Blazing-World (1666) (2018-04-05)
- On lifetime extension and decltype(auto) (2018-04-05)
- The Demagogue in Politics (2018-04-03)
- Use-cases for false_v (2018-04-02)
- The Superconstructing Super Elider (2018-03-29)
- Hat-game strategies in Hanabi (2018-03-29)
- Parameter-only types, Round 2 (2018-03-28)
- std::string_view is a parameter-only type (2018-03-27)
- Johnny Eck in Tarzan Escapes (2018-03-24)
- Namespaces for UDLs (2018-03-21)
- This should exist: Markov music for radio lacunae (2018-03-21)
- P0732R0 and “trivially comparable” (2018-03-19)
- The C++Now 2018 schedule is out (2018-03-19)
- Customization point design for library functions (2018-03-19)
- Happy Saint Patrick’s Day! (2018-03-17)
- Async/await, and coloring schemes in general (2018-03-16)
- Zoological case naming (2018-03-16)
- West const (2018-03-15)
- On raise versus throw, and the Mandela Effect (2018-03-14)
- Hot take: P0947R0 “Another take on Modules” (2018-03-14)
- First post — Jekyll Now (2018-03-13)
- The “unsigned for value range” antipattern (2018-03-13)
- Using future_error for control flow (2018-03-13)
- Providentissimus Deus (2018-03-13)