H
HN HRCB stories | rights | sources | trends | system | about
home / www.collabora.com / item 43907820
+0.40 Matt Godbolt sold me on Rust by showing me C++ (www.collabora.com)
611 points by LorenDB 296 days ago | 658 comments on HN | Moderate positive Editorial · v3.7 ·
Summary No Dominant HR Theme Neutral
This technical blog post compares C++ and Rust programming languages, analyzing type safety and compiler-enforced error prevention through practical code examples. The content has minimal engagement with human rights themes, with only structural signals of free expression evident through the blog's allowance of diverse and critical reader commentary.
Article Heatmap
Preamble: ND — Preamble Preamble: No Data — Preamble P Article 1: ND — Freedom, Equality, Brotherhood Article 1: No Data — Freedom, Equality, Brotherhood 1 Article 2: ND — Non-Discrimination Article 2: No Data — Non-Discrimination 2 Article 3: ND — Life, Liberty, Security Article 3: No Data — Life, Liberty, Security 3 Article 4: ND — No Slavery Article 4: No Data — No Slavery 4 Article 5: ND — No Torture Article 5: No Data — No Torture 5 Article 6: ND — Legal Personhood Article 6: No Data — Legal Personhood 6 Article 7: ND — Equality Before Law Article 7: No Data — Equality Before Law 7 Article 8: ND — Right to Remedy Article 8: No Data — Right to Remedy 8 Article 9: ND — No Arbitrary Detention Article 9: No Data — No Arbitrary Detention 9 Article 10: ND — Fair Hearing Article 10: No Data — Fair Hearing 10 Article 11: ND — Presumption of Innocence Article 11: No Data — Presumption of Innocence 11 Article 12: ND — Privacy Article 12: No Data — Privacy 12 Article 13: ND — Freedom of Movement Article 13: No Data — Freedom of Movement 13 Article 14: ND — Asylum Article 14: No Data — Asylum 14 Article 15: ND — Nationality Article 15: No Data — Nationality 15 Article 16: ND — Marriage & Family Article 16: No Data — Marriage & Family 16 Article 17: ND — Property Article 17: No Data — Property 17 Article 18: ND — Freedom of Thought Article 18: No Data — Freedom of Thought 18 Article 19: +0.40 — Freedom of Expression 19 Article 20: ND — Assembly & Association Article 20: No Data — Assembly & Association 20 Article 21: ND — Political Participation Article 21: No Data — Political Participation 21 Article 22: ND — Social Security Article 22: No Data — Social Security 22 Article 23: ND — Work & Equal Pay Article 23: No Data — Work & Equal Pay 23 Article 24: ND — Rest & Leisure Article 24: No Data — Rest & Leisure 24 Article 25: ND — Standard of Living Article 25: No Data — Standard of Living 25 Article 26: ND — Education Article 26: No Data — Education 26 Article 27: ND — Cultural Participation Article 27: No Data — Cultural Participation 27 Article 28: ND — Social & International Order Article 28: No Data — Social & International Order 28 Article 29: ND — Duties to Community Article 29: No Data — Duties to Community 29 Article 30: ND — No Destruction of Rights Article 30: No Data — No Destruction of Rights 30
Negative Neutral Positive No Data
Aggregates
Weighted Mean +0.40 Unweighted Mean +0.40
Max +0.40 Article 19 Min +0.40 Article 19
Signal 1 No Data 30
Confidence 2% Volatility 0.00 (Low)
Negative 0 Channels E: 0.6 S: 0.4
SETL ND
FW Ratio 60% 3 facts · 2 inferences
Evidence: High: 0 Medium: 1 Low: 0 No Data: 30
Theme Radar
Foundation Security Legal Privacy & Movement Personal Expression Economic & Social Cultural Order & Duties Foundation: 0.00 (0 articles) Security: 0.00 (0 articles) Legal: 0.00 (0 articles) Privacy & Movement: 0.00 (0 articles) Personal: 0.00 (0 articles) Expression: 0.40 (1 articles) Economic & Social: 0.00 (0 articles) Cultural: 0.00 (0 articles) Order & Duties: 0.00 (0 articles)
HN Discussion 20 top-level · 30 replies
favorited 2025-05-06 18:04 UTC link
Side note, if anyone is interested in hearing more from Matt, he has a programming podcast with Ben Rady called Two's Complement.

https://www.twoscomplement.org

writebetterc 2025-05-06 18:09 UTC link
Yes, Rust is better. Implicit numeric conversion is terrible. However, don't use atoi if you're writing C++ :-). The STL has conversion functions that will throw, so separate problem.
dvratil 2025-05-06 18:20 UTC link
The one thing that sold me on Rust (going from C++) was that there is a single way errors are propagated: the Result type. No need to bother with exceptions, functions returning bool, functions returning 0 on success, functions returning 0 on error, functions returning -1 on error, functions returning negative errno on error, functions taking optional pointer to bool to indicate error (optionally), functions taking reference to std::error_code to set an error (and having an overload with the same name that throws an exception on error if you forget to pass the std::error_code)...I understand there's 30 years of history, but it still is annoying, that even the standard library is not consistent (or striving for consistency).

Then you top it on with `?` shortcut and the functional interface of Result and suddenly error handling becomes fun and easy to deal with, rather than just "return false" with a "TODO: figure out error handling".

jpc0 2025-05-06 18:22 UTC link
Amazing example of how easy it is to get sucked into the rust love. Really sincerely these are really annoying parts of C++.

The conversation function is more language issue. I don’t think there is a simple way of creating a rust equivalent version because C++ has implicit conversions. You could probably create a C++ style turbofish though, parse<uint32_t>([your string]) and have it throw or return std::expected. But you would need to implement that yourself, unless there is some stdlib version I don’t know of.

Don’t conflate language features with library features.

And -Wconversion might be useful for this but I haven’t personally tried it since what Matt is describing with explicit types is the accepted best practice.

GardenLetter27 2025-05-06 18:26 UTC link
It's a shame Rust doesn't have keyword arguments or named tuples to make handling some of these things easier without Args/Options structs boilerplate.
morning-coffee 2025-05-06 18:27 UTC link
Reading "The Rust Book" sold me on Rust (after programming in C++ for over 20 years)
grumbel 2025-05-06 18:33 UTC link
There is '-Wconversion' to catch things like this. It will however not trigger in this specific case since g++ assumes converting 1000.0 to 1000 is ok due to no loss in precision.

Quantity(100) is counterproductive here, as that doesn't narrow the type, it does the opposite, it casts whatever value is given to the type, so even Quantity(100.5) will still work, while just plain 100.5 would have given an error with '-Wconversion'.

adamc 2025-05-06 18:40 UTC link
Coming from python (or Common Lisp, or...), I wasn't too impressed. In Python I normally make args for any function with more than a couple be keyword arguments, which guarantees that you are aware of how the arguments are being mapped to inputs.

Even Rust's types aren't going to help you if two arguments simply have the same types.

ModernMech 2025-05-06 18:41 UTC link
What sold me on Rust is that I'm a very bad programmer and I make a lot of mistakes. Given C++, I can't help but hold things wrong and shoot myself in the foot. My media C++ coding session is me writing code, getting a segfault immediately, and then spending time chasing down the reason for that happening, rinse and repeat.

My median Rust coding session isn't much different, I also write code that doesn't work, but it's caught by the compiler. Now, most people call this "fighting with the borrow checker" but I call it "avoiding segfaults before they happen" because when I finally get through the compiler my code usually "just works". It's that magical property Haskell has, Rust also has it to a large extent.

So then what's different about Rust vs. C++? Well Rust actually provides me a path to get to a working program whereas C++ just leaves me with an error message and a treasure map.

What this means is that although I'm a bad programmer, Rust gives me the support I need to build quite large programs on my own. And that extends to the crate ecosystem as well, where they make it very easy to build and link third party libraries, whereas with C++ ld just tells you that it had a problem and you're left on your own to figure out exactly what.

jsat 2025-05-06 19:19 UTC link
I see an article about how strict typing is better, but what would really be nice here is named parameters. I never want to go back to anonymous parameters.
kasajian 2025-05-06 19:33 UTC link
This seems a big silly. This is not a language issue. You can have a C++ library that does exactly all the things being shown here so that the application developer doesn't worry about. There would no C++ language features missing that would accomplish what you're able to do on the Rust side.

So is this really a language comparison, or what libraries are available for each language platform? If the latter, that's fine. But let's be clear about what the issue is. It's not the language, it's what libraries are included out of the box.

tumdum_ 2025-05-06 20:14 UTC link
The one thing that sold me on Rust was that I no longer had to chase down heisenbugs caused by memory corruption.
thrwyexecbrain 2025-05-06 20:15 UTC link
The C++ code I write these days is actually pretty similar to Rust: everything is explicit, lots of strong types, very simple and clear lifetimes (arenas, pools), non-owning handles instead of pointers. The only difference in practice is that the build systems are different and that the Rust compiler is more helpful (both in catching bugs and reporting errors). Neither a huge deal if you have a proper build and testing setup and when everybody on your team is pretty experienced.

By the way, using "atoi" in a code snippet in 2025 and complaining that it is "not ideal" is, well, not ideal.

mattgodbolt 2025-05-06 20:39 UTC link
Wow that guy, eh? He seems to turn up everywhere :D
brundolf 2025-05-06 23:19 UTC link
Wait, Godbolt is someone's name?
socalgal2 2025-05-07 03:11 UTC link
I already hated C++ (having written 100s of thousands of lines of it in games and at FAANG)

I'd be curious to know what if any true fixes are coming down the line.

This talk: "To Int or to Uint, This is the Question - Alex Dathskovsky - CppCon 2024" https://www.youtube.com/watch?v=pnaZ0x9Mmm0

Seems to make it clear C++ is just broken. That said, and I wish he'd covered this, he didn't mention if the flags he brings up would warn/fix these issues.

I don't want a C++ where I have to remember 1000 rules and if I get one wrong my code is exploitable. I want a C++ where I just can't break the rules except when I explicitly opt into breaking them.

speaking of which, according to another C++ talk, something like 60% of rust crates are dependent on unsafe rust. The point isn't to diss rust. The point is that a safe C++ with opt into unsafe could be similar to rust's opt into unsafe

choeger 2025-05-07 06:42 UTC link
All this has been known in the PL design community for decades if not half a century by now.

Two things are incredibly frustrating when it comes to safety in software engineering:

1. The arrogance that "practitioners" have against "theorists" (everyone with a PhD in programming languages)

2. The slowness of the adoption of well-tested and thoroughly researched language concepts (think of Haskell type classes, aka, Rust traits)

I like that Rust can pick good concepts and design coherent language from them without inventing its own "pragmatic" solution that breaks horribly in some use cases that some "practitioners" deem "too theoretical."

karel-3d 2025-05-07 08:12 UTC link
Well, if you don't want to confuse parameters, you should use Objective-C.

You would do

[orderbook sendOrderWithSymbol:"foo" buy:true quantity:100 price:1000.00]

Cannot confuse that!

(I never used swift, I think it retains this?)

quietbritishjim 2025-05-07 08:58 UTC link
I always enjoy reading articles like this. But the truth is, having written several 100s of KLOC in C++ (i.e., not an enormous amount but certainly my fair share) I just almost never have problems with this sort accidental conversion in practice. Perhaps it might trip me up occasionally, but will be noticed by literally just running the code once. Yes, that is an extra hurdle to trip over and resolve but that is trivial compared to the alternative of creating and using wrapper types - regardless of whether I'm using Rust or C++. And the cost of visual noise of wrapper types, already higher just at the writing stage, then continues to be a cost every time you read the code. It's just not worth it for the very minor benefit it brings.

(Named parameters would definitely be great, though. I use little structs of parameters where I think that's useful, and set their members one line at a time.)

I know that this is an extremist view, but: I feel the same way about Rust's borrow checker. I just very rarely have problems with memory errors in C++ code bases with a little thought applied to lifetimes and use of smart pointers. Certainly, lifetime bugs are massively overshadowed by logic and algorithmic bugs. Why would I want to totally reshape the way that I code in order to fix one of the least significant problems I encounter? I actually wish there were a variant of Rust with all its nice clean improvements over C++ except for lifetime annotations and the borrow checker.

Perhaps this is a symptom of the code I tend to write: code that has a lot of tricky mathematical algorithms in it, rather than just "plumbing" data between different sources. But actually I doubt it, so I'm surprised this isn't a more common view.

bunderbunder 2025-05-07 15:18 UTC link
This is actually the point where Rust starts to frustrate me a little bit.

Not because Rust is doing anything wrong here, but because the first well-known language to really get some of these things right also happens to be a fairly low-level systems language with manual memory management.

A lot of my colleagues seem to primarily be falling in love with Rust because it's doing a good job at some basic things that have been well-known among us "academic" functional programming nerds for decades, and that's good. It arguably made inroads where functional programming languages could not because it's really more of a procedural language, and that's also good. Procedural programming is a criminally underrated and misunderstood paradigm. (As much as I love FP, that level of standoffishness about mutation and state isn't any more pragmatic than OOP being so hype about late binding that every type must support it regardless of whether it makes sense in that case.)

But they're also thoroughly nerdsniped by the borrow checker. I get it, you have to get cozy with the borrow checker if you want to use Rust. But it seems like the moral opposite of sour grapes to me. The honest truth is that, for most the software we're writing, a garbage collected heap is fine. Better, even. Shared-nothing multithreading is fine. Better, even.

So now we're doing more and more things in Rust. Which I understand. But I keep wishing that I could also have a Rust-like language that just lets me have a garbage collector for the 95% of my work where the occasional 50ms pause during run-time just isn't a big enough problem to justify a 50% increase in development and maintenance effort. And then save Rust for the things that actually do need to be unmanaged. Which is maybe 5% of my actual work, even if I have to admit that it often feels like 95% of the fun.

dvt 2025-05-06 18:27 UTC link
Maybe contrarian, but imo the `Result` type, while kind of nice, still suffers from plenty of annoyances, including sometimes not working with the (manpages-approved) `dyn Error`, sometimes having to `into()` weird library errors that don't propagate properly, or worse: `map_err()` them; I mean, at this point, the `anyhow` crate is basically mandatory from an ergonomics standpoint in every Rust project I start. Also, `?` doesn't work in closures, etc.

So, while this is an improvement over C++ (and that is not saying much at all), it's still implemented in a pretty clumsy way.

titzer 2025-05-06 18:28 UTC link
> Implicit numeric conversion is terrible.

It's bad if it alters values (e.g. rounding). Promotion from one number representation to another (as long as it preserves values) isn't bad. This is trickier than it might seem, but Virgil has a good take on this (https://github.com/titzer/virgil/blob/master/doc/tutorial/Nu...). Essentially, it only implicitly promotes values in ways that don't lose numeric information and thus are always reversible.

In the example, Virgil won't let you pass "1000.00" to an integer argument, but will let you pass "100" to the double argument.

mdf 2025-05-06 18:34 UTC link
Generally, I agree the situation with errors is much better in Rust in the ways you describe. But, there are also panics which you can catch_unwind[1], set_hook[2] for, define a #[panic_handler][3] for, etc.

[1] https://doc.rust-lang.org/std/panic/fn.catch_unwind.html

[2] https://doc.rust-lang.org/std/panic/fn.set_hook.html

[3] https://doc.rust-lang.org/nomicon/panic-handler.html

badbart14 2025-05-06 18:35 UTC link
+1, especially loved the episode from a couple months back about using AI tools in development. Really got me thinking differently about the role of AI in a developer's workflow and how software development will evolve.
jeroenhd 2025-05-06 18:40 UTC link
The result type does make for some great API design, but SerenityOS shows that this same paradigm also works fine in C++. That includes something similar to the ? operator, though it's closer to a raw function call.

SerenityOS is the first functional OS (as in "boots on actual hardware and has a GUI") I've seen that dares question the 1970s int main() using modern C++ constructs instead, and the API is simply a lot better.

I can imagine someone writing a better standard library for C++ that works a whole lot like Rust's standard library does. Begone with the archaic integer types, make use of the power your language offers!

If we're comparing C++ and Rust, I think the ease of use of enum classes/structs is probably a bigger difference. You can get pretty close, but Rust avoids a lot of boilerplate that makes them quite usable, especially when combined with the match keyword.

I think c++, the language, is ready for the modern world. However, c++, the community, seems to be struck at least 20 years in the past.

shpongled 2025-05-06 18:44 UTC link
Yep, I would love anonymous record types, ala StandardML/OCaml
zozbot234 2025-05-06 18:48 UTC link
> The one thing that sold me on Rust (going from C++) was that there is a single way errors are propagated: the Result type. No need to bother with exceptions

This isn't really true since Rust has panics. It would be nice to have out-of-the-box support for a "no panics" subset of Rust, which would also make it easier to properly support linear (no auto-drop) types.

Arnavion 2025-05-06 18:53 UTC link
The reason to introduce the Quantity wrapper is to not be able to swap the quantity and price arguments.
rq1 2025-05-06 18:58 UTC link
Just create dummy wrappers to make a type level distinction. A Height and a a Width can be two separate types even if they’re only floats basically.

Or another (dummy) example transfer(accountA, accountB). Make two types that wrap the same type but one being a TargetAccount and the other SourceAccount.

Use the type system to help you, don’t fight it.

frankus 2025-05-06 18:59 UTC link
I work all day in Swift (which makes you go out of your way to omit argument labels) and I'm surprised they aren't more common.
b5n 2025-05-06 19:04 UTC link
> -Wconversion ... assumes converting 1000.0 to 1000 is ok due to no loss in precision.

Additionally, `clang-tidy` catches this via `bugprone-narrowing-conversions` and your linter will alert if properly configured.

jsat 2025-05-06 19:17 UTC link
Had the same thought... It's backwards that any language isn't using named parameters at this point.
ujkiolp 2025-05-06 19:18 UTC link
meh, rust is still better cos it’s friendlier
fpoling 2025-05-06 19:20 UTC link
Result type still requires quite a few lines of boilerplate if one needs to add custom data to it. And as a replacement of exceptions with automatic stack trace attachment it is relatively poor.

In any case I will take Rust Result over C++ mess at any time especially given that we have two C++, one with exception support and one without making code incompatible between two.

kelnos 2025-05-06 19:27 UTC link
Yes, this is one of the few things that I think was a big mistake in Rust's language design. I used to do a lot of Scala, and really liked named parameters there.

I suppose it could still be added in the future; there are probably several syntax options that would be fully backward-compatible, without even needing a new Rust edition.

Etheryte 2025-05-06 19:42 UTC link
Just like language shapes the way we think and talk about things, programming languages shape both what libraries are written and how. You could write anything in anything so long as it's Turing complete, but in real life we see clearly that certain design decisions at the language level either advantage or disadvantage certain types of solutions. Everyone could in theory write C without any memory issues, but we all know how that turns out in practice. The language matters.
jpc0 2025-05-06 19:42 UTC link
Using your media example since I have a decent amount of experience there. Did you just use off the shelf libraries, because effectively all the libraries are written in or expose a C api. So now you not only need to deal with Rust, you need to also deal with rust ffi.

There are some places I won’t be excited to use rust, and media heavy code is one of those places…

lytedev 2025-05-06 19:45 UTC link
The core of this argument taken to its extreme kind of makes the whole discussion pointless, right? All the languages can do all the things, so why bother differentiating them?

To entertain the argument, though, it may not be a language issue, but it certainly is a selling point for the language (which to me indicates a "language issue") to me if the language takes care of this "library" (or good defaults as I might call them) for you with no additional effort -- including tight compiler and tooling integration. That's not to say Rust always has good defaults, but I think the author's point is that if you compare them apples-to-oranges, it does highlight the different focuses and feature sets.

I'm not a C++ expert by any stretch, so it's certainly a possibility that such a library exists that makes Rust's type system obsolete in this discussion around correctness, but I'm not aware of it. And I would be incredibly surprised if it held its ground in comparison to Rust in every respect!

sdenton4 2025-05-06 19:46 UTC link
If the default is a loaded gun pointed at your foot, you're going to end up with lots of people missing a foot. "just git gud" isn't a solution.
cbsmith 2025-05-06 19:49 UTC link
Yeah, I kept thinking, "doesn't mp-units basically address this entirely"?
codedokode 2025-05-06 19:57 UTC link
When there are 3-4 parameters it is too much trouble to write the names.
mixmastamyk 2025-05-06 20:14 UTC link
Am about finished, but several chapters near the end seriously put me to sleep. Will try again some other day I suppose.
yodsanklai 2025-05-06 20:20 UTC link
> The C++ code I write these days

Meaning you're in a context where you have control on the C++ code you get to write. In my company, lots of people get to update code without strict guidelines. As a result, the code is going to be complex. I'd rather have a simpler and more restrictive language and I'll always favor Rust projects to C++ ones.

taylorallred 2025-05-06 20:54 UTC link
Cool that you're using areas/pools for lifetimes. Are you also using custom data structures or stl (out of curiosity)?
LinXitoW 2025-05-06 21:21 UTC link
Sure, you can emulate some of the features and hope that everyone using your library is doing it "right". Just like you could just use a dynamic language, tag every variable with a type, and hope everyone using your library does the MANUAL work of always doing it correct. Guess we don't need types either.

And while we're at it, why not use assembly? It's all just "syntactic sugar" over bits, doesn't make any difference, right?

sophacles 2025-05-06 21:31 UTC link
Why? In 2025 we have tooling available for most every editor that will annotate that information into the display without needing them present in the file. When I autocomplete a function name, all the parameters are there for me to fill in, and annotated into the display afterwards. It seems like an unnecessary step to reify it and force the bytes to be present in the the saved file.
kanbankaren 2025-05-06 21:58 UTC link
The C++ code I wrote 20 years ago also had strong typing and clear lifetimes.

Modern C++ has reduced a lot of typing through type inference, but otherwise the language is still strongly typed and essentially the same.

kanbankaren 2025-05-06 22:02 UTC link
> Given C++, I can't help but hold things wrong and shoot myself

Give an example. I have been programming in C/C++ for close to 30 years and the places where I worked had very strict guidelines on C++ usage. We could count the number of times we shot ourselves due to the language.

roelschroeven 2025-05-06 22:24 UTC link
The numeric conversion functions in the STL are terrible. They will happily accept strings with non-numeric characters in them: they will convert "123abc" to 123 without giving an error. The std::sto* functions will also ignore leading whitespace.

Yes, you can ask the std::sto* functions for the position where they stopped because of invalid characters and see if that position is the end of the string, but that is much more complex than should be needed for something like that.

These functions don't convert a string to a number, they try to extract a number from a string. I would argue that most of the time, that's not what you want. Or at least, most of the time it's not what I need.

atoi has the same problem of course, but even worse.

im3w1l 2025-05-06 22:41 UTC link
Forcing people to explicitly casts everything all the time means that dangerous casts don't stand out as much. That's an L for rust imo.
Editorial Channel
What the content says
ND
Preamble Preamble

Content does not address human dignity, equal rights, or foundational human rights principles

ND
Article 1 Freedom, Equality, Brotherhood

Content does not discuss equal and inalienable rights

ND
Article 2 Non-Discrimination

Content does not address discrimination or equality

ND
Article 3 Life, Liberty, Security

Content does not discuss right to life, liberty, or personal security

ND
Article 4 No Slavery

Content does not address slavery or servitude

ND
Article 5 No Torture

Content does not discuss torture or cruel/degrading treatment

ND
Article 6 Legal Personhood

Content does not address recognition as person before law

ND
Article 7 Equality Before Law

Content does not discuss equal protection before law

ND
Article 8 Right to Remedy

Content does not address right to remedy for violations

ND
Article 9 No Arbitrary Detention

Content does not discuss arbitrary arrest or detention

ND
Article 10 Fair Hearing

Content does not address right to fair and public trial

ND
Article 11 Presumption of Innocence

Content does not discuss presumption of innocence

ND
Article 12 Privacy

Content does not address privacy, family, home, or correspondence

ND
Article 13 Freedom of Movement

Content does not address freedom of movement

ND
Article 14 Asylum

Content does not discuss right to asylum

ND
Article 15 Nationality

Content does not address nationality or right to change nationality

ND
Article 16 Marriage & Family

Content does not discuss marriage or family rights

ND
Article 17 Property

Content does not address property ownership rights

ND
Article 18 Freedom of Thought

Content does not discuss freedom of conscience, thought, or religion

ND
Article 19 Freedom of Expression
Medium Practice

Content does not advocate for freedom of expression but exercises and demonstrates it

ND
Article 20 Assembly & Association

Content does not address freedom of assembly or association

ND
Article 21 Political Participation

Content does not discuss political participation or voting

ND
Article 22 Social Security

Content does not address social security or economic rights

ND
Article 23 Work & Equal Pay

Content does not discuss right to work or labor standards

ND
Article 24 Rest & Leisure

Content does not address rest, leisure, or reasonable working hours

ND
Article 25 Standard of Living

Content does not discuss standard of living, health, or social services

ND
Article 26 Education

Content does not advocate for right to education, though it serves educational function

ND
Article 27 Cultural Participation

Content does not address participation in cultural or scientific life

ND
Article 28 Social & International Order

Content does not discuss social and international order

ND
Article 29 Duties to Community

Content does not address duties to community

ND
Article 30 No Destruction of Rights

Content does not discuss prevention of rights destruction

Structural Channel
What the site does
+0.20
Article 19 Freedom of Expression
Medium Practice
Structural
+0.20
Context Modifier
+0.20
SETL
ND

Blog platform enables and publishes free expression through author commentary and diverse reader comments; dissenting technical opinions are allowed and visible

ND
Preamble Preamble

No structural signals relevant to preamble themes

ND
Article 1 Freedom, Equality, Brotherhood

No structural signals regarding equality of rights

ND
Article 2 Non-Discrimination

No structural signals regarding non-discrimination

ND
Article 3 Life, Liberty, Security

No structural signals regarding personal safety

ND
Article 4 No Slavery

No structural signals regarding freedom from slavery

ND
Article 5 No Torture

No structural signals regarding torture prevention

ND
Article 6 Legal Personhood

No structural signals regarding legal personhood

ND
Article 7 Equality Before Law

No structural signals regarding legal equality

ND
Article 8 Right to Remedy

No structural signals regarding legal remedies

ND
Article 9 No Arbitrary Detention

No structural signals regarding detention rights

ND
Article 10 Fair Hearing

No structural signals regarding judicial fairness

ND
Article 11 Presumption of Innocence

No structural signals regarding criminal procedure

ND
Article 12 Privacy

Matomo analytics tracking present on page without explicit privacy safeguards observed

ND
Article 13 Freedom of Movement

No structural signals regarding movement rights

ND
Article 14 Asylum

No structural signals regarding asylum or refuge

ND
Article 15 Nationality

No structural signals regarding nationality rights

ND
Article 16 Marriage & Family

No structural signals regarding family law

ND
Article 17 Property

No structural signals regarding property

ND
Article 18 Freedom of Thought

No structural signals regarding conscience or belief

ND
Article 20 Assembly & Association

No structural signals regarding assembly or association rights

ND
Article 21 Political Participation

No structural signals regarding political participation

ND
Article 22 Social Security

No structural signals regarding social protection

ND
Article 23 Work & Equal Pay

No structural signals regarding work or employment rights

ND
Article 24 Rest & Leisure

No structural signals regarding leisure or rest

ND
Article 25 Standard of Living

No structural signals regarding living standards

ND
Article 26 Education

Blog post provides technical knowledge and learning resources freely and without access barriers

ND
Article 27 Cultural Participation

No structural signals regarding cultural participation

ND
Article 28 Social & International Order

No structural signals regarding international order

ND
Article 29 Duties to Community

No structural signals regarding community duties

ND
Article 30 No Destruction of Rights

No structural signals regarding rights protection

Supplementary Signals
Epistemic Quality
0.77
Propaganda Flags
1 techniques detected
appeal to authority
Article opens by establishing credibility through Matt Godbolt's reputation: 'Matt Godbolt, of Compiler Explorer fame, is awesome and you should scour the web for every single bit of content he puts out.'
Solution Orientation
No data
Emotional Tone
No data
Stakeholder Voice
No data
Temporal Framing
No data
Geographic Scope
No data
Complexity
No data
Transparency
No data
Event Timeline 20 events
2026-02-26 21:34 eval_success Evaluated: Neutral (0.34) - -
2026-02-26 20:01 dlq Dead-lettered after 1 attempts: Matt Godbolt sold me on Rust by showing me C++ - -
2026-02-26 20:00 dlq Dead-lettered after 1 attempts: Matt Godbolt sold me on Rust by showing me C++ - -
2026-02-26 20:00 eval_failure Evaluation failed: Error: Unknown model in registry: llama-4-scout-wai - -
2026-02-26 20:00 eval_failure Evaluation failed: Error: Unknown model in registry: llama-4-scout-wai - -
2026-02-26 19:59 rate_limit OpenRouter rate limited (429) model=llama-3.3-70b - -
2026-02-26 19:58 rate_limit OpenRouter rate limited (429) model=llama-3.3-70b - -
2026-02-26 19:57 rate_limit OpenRouter rate limited (429) model=llama-3.3-70b - -
2026-02-26 19:55 rater_validation_fail Validation failed for model llama-4-scout-wai - -
2026-02-26 19:11 dlq Dead-lettered after 1 attempts: Matt Godbolt sold me on Rust by showing me C++ - -
2026-02-26 19:10 rate_limit OpenRouter rate limited (429) model=llama-3.3-70b - -
2026-02-26 19:08 rate_limit OpenRouter rate limited (429) model=llama-3.3-70b - -
2026-02-26 19:07 rate_limit OpenRouter rate limited (429) model=llama-3.3-70b - -
2026-02-26 06:53 dlq Dead-lettered after 1 attempts: Matt Godbolt sold me on Rust by showing me C++ - -
2026-02-26 06:52 dlq Dead-lettered after 1 attempts: Matt Godbolt sold me on Rust by showing me C++ - -
2026-02-26 06:51 dlq Dead-lettered after 1 attempts: Matt Godbolt sold me on Rust by showing me C++ - -
2026-02-26 06:49 dlq Dead-lettered after 1 attempts: Matt Godbolt sold me on Rust by showing me C++ - -
2026-02-26 06:48 dlq Dead-lettered after 1 attempts: Matt Godbolt sold me on Rust by showing me C++ - -
2026-02-26 06:45 dlq Dead-lettered after 1 attempts: Matt Godbolt sold me on Rust by showing me C++ - -
2026-02-26 06:44 credit_exhausted Credit balance too low, retrying in 251s - -
About HRCB | By Right | HN Guidelines | HN FAQ | Source | UDHR | RSS
build 3e57f54+egy5 · deployed 2026-02-26 22:02 UTC · evaluated 2026-02-26 22:10:52 UTC