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

A Crossword for CppCon 2025

14 September, 202522 September, 2025

Another year, another crossword. With some of the clues/answers vaguely themed. You can solve it online or offline with the PDF. Answers after the con.

Read More

A persistent myth about STL’s remove (and friends)

8 March, 201530 June, 2015

There seems to be a persistent myth about STL’s remove, remove_if, etc. Ask even a relatively experienced C++ programmer to explain this code. vector v = { 1,2,3,4,5 }; v.erase(remove_if(v.begin(), v.end(), [] (int i) { return (i & 1) == 0; }), v.end()); They’ll recognize the erase-remove idiom and correctly…

Read More

The C++ <random> Lame List

7 December, 2015

Network programmers of a certain age may remember the Windows Sockets Lame List. I previously wrote a short “don’t-do-that-do-this” guide for modern C++ randomness, and I was recently reading another Reddit exchange featuring STL, author of many parts of Microsoft’s STL implementation, when it struck me that use of C++…

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