Constrained forwarding references considered sketchy as frick

I’ll just leave this here.

template<class I> requires is_integral_v<I>
void foo(I&& i) {

template<class T> // unconstrained
void foo(T&& t) {

The intent of this code (says the casual reader) is that foo takes one parameter by forwarding reference; and if that parameter is integral, it’ll do one thing and otherwise it’ll do the other thing. But watch:

int main() {
    constexpr int zero = 0;

This prints “ONE TWO”.

This just came up in the wild, so to speak, on the Code Review StackExchange.

Posted 2018-09-09