Skip to content
Why is a raven like a writing desk?

Thoughts both confusing and enlightening.

Why is a raven like a writing desk?

Thoughts both confusing and enlightening.

const_cast: A Necessary Evil

elbeno, 29 July, 2026

We don’t like const_cast much. It’s ugly, and can even lead to undefined behaviour. But unfortunately sometimes it’s needed. Even aside from interacting with C libraries which don’t respect const, there is at least one place in the C++ standard that requires you to use it.

If you have a std::priority_queue of move-only objects, how do you get objects out of it? (Because It’s not a Roach Motel®, neither is it Hotel California…)

The pop function returns void. No help there.

With other container adapters like std::stack and std::queue, the top/front/back functions return mutable references. Those container adapters don’t have invariants to uphold that depend on the state of the contained objects.

But the top function on std::priority_queue returns a reference-to-const. std::priority_queue can’t give you a mutable reference to anything inside it, because if it did that, you could alter objects inside it, and that means you could break the heap invariant.

So the only thing you can do is use const_cast, temporarily and forcibly break the invariant, and then restore it.

// top can only give us a reference to const
const T& obj = q.top();

// we must cast away const to move the object out,
// breaking the queue's invariant
T exfiltrated_obj = std::move(const_cast<T&>(obj));

// now we should immediately restore the queue invariant
q.pop();

Container adapters don’t get much love in the standard: this has been broken since C++11. Hold your nose, I guess.

C++

Post navigation

Previous post
Next post

Related Posts

C++ Tuples: the missing functionality

6 April, 201530 June, 2015

C++ provides a strange mix of compile-time and runtime functionality for dealing with tuples. There are some interesting parts, like std::tie to destructure a tuple, and std::tuple_cat to join together several tuples into one. So there is evidence that the standard has been influenced by some functional programming ideas, but…

Read More

Formatted Diagnostics with C++20

10 December, 202410 December, 2024

C++26 adds formatted diagnostics with static_assert, something like this: The benefit of course is that when such an assertion fails, the compiler outputs a diagnostic that we control. But can this be done in C++20? Well, this is C++! So the answer is a qualified yes – we can get…

Read More

Remember the Vasa! or, plus ça change, plus c’est la même chose

12 August, 201915 September, 2021

I’ve been programming in C++ for almost a quarter of a century now. I grew up, professionally, with C++, and in many ways, it grew up along with me. For someone who is used to C++, even used to recently-standardised C++, it’s hard not to feel apprehension when looking at…

Read More
©2026 Why is a raven like a writing desk? | WordPress Theme by SuperbThemes