#include <iostream>
using namespace std;
class A {};
class B {};
class C {
public:
template <typename T>
void f() {
// T = const B&
impl_dispatch<T>(); // error: value-initialization of reference type ‘const B&’
}
protected:
virtual void impl(const A& a) {
cout << "A";
}
virtual void impl(const B& b) {
cout << "B";
}
private:
template <typename T>
void impl_dispatch();
};
template <> void C::impl_dispatch<A const &>()
{
impl(B());
}
template <> void C::impl_dispatch<B const &>()
{
impl(A());
}
int main() {
C c;
const B &b2 = B();
c.f<decltype(b2)>(); // T = const B&
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQSB7fTsKY2xhc3MgQiB7fTsKCmNsYXNzIEMgewpwdWJsaWM6CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICB2b2lkIGYoKSB7CiAgICAgICAgLy8gVCA9IGNvbnN0IEImCiAgICAgICAgaW1wbF9kaXNwYXRjaDxUPigpOyAvLyBlcnJvcjogdmFsdWUtaW5pdGlhbGl6YXRpb24gb2YgcmVmZXJlbmNlIHR5cGUg4oCYY29uc3QgQibigJkKICAgIH0KCnByb3RlY3RlZDoKICAgIHZpcnR1YWwgdm9pZCBpbXBsKGNvbnN0IEEmIGEpIHsKICAgICAgICBjb3V0IDw8ICJBIjsKICAgIH0KCiAgICB2aXJ0dWFsIHZvaWQgaW1wbChjb25zdCBCJiBiKSB7CiAgICAgICAgY291dCA8PCAiQiI7CiAgICB9CnByaXZhdGU6CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICB2b2lkIGltcGxfZGlzcGF0Y2goKTsKfTsKCnRlbXBsYXRlIDw+ICB2b2lkIEM6OmltcGxfZGlzcGF0Y2g8QSBjb25zdCAmPigpCnsKaW1wbChCKCkpOwp9Cgp0ZW1wbGF0ZSA8PiAgdm9pZCBDOjppbXBsX2Rpc3BhdGNoPEIgY29uc3QgJj4oKQp7CmltcGwoQSgpKTsKfQoKaW50IG1haW4oKSB7CiAgICBDIGM7CiAgICBjb25zdCBCICZiMiA9IEIoKTsKICAgIGMuZjxkZWNsdHlwZShiMik+KCk7IC8vIFQgPSBjb25zdCBCJgogICAgcmV0dXJuIDA7Cn0=