#include <iostream>
#include <type_traits>
template <bool Condition, class T = void>
using enable_if = typename std::enable_if<Condition, T>::type;
template <class T>
struct is_modifiable_rval
: std::is_same<typename std::remove_const<typename std::remove_reference<T>::type>::type&&, T&&> {};
template <class T>
void fn(T const& x)
{
std::cout << "not a modifiable temporary" << std::endl;
}
template <class T>
enable_if<is_modifiable_rval<T>{}> fn(T&& x)
{
std::cout << "a modifiable temporary" << std::endl;
}
template <class T>
T expr()
{
static typename std::decay<T>::type t;
return t;
}
int main()
{
fn(expr<std::string&>());
fn(expr<const std::string&>());
fn(expr<std::string>());
fn(expr<const std::string>());
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgoKdGVtcGxhdGUgPGJvb2wgQ29uZGl0aW9uLCBjbGFzcyBUID0gdm9pZD4KdXNpbmcgZW5hYmxlX2lmID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Q29uZGl0aW9uLCBUPjo6dHlwZTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpzdHJ1Y3QgaXNfbW9kaWZpYWJsZV9ydmFsCiAgICA6IHN0ZDo6aXNfc2FtZTx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGU+Ojp0eXBlJiYsIFQmJj4ge307CgoKdGVtcGxhdGUgPGNsYXNzIFQ+CnZvaWQgZm4oVCBjb25zdCYgeCkKewogICAgc3RkOjpjb3V0IDw8ICJub3QgYSBtb2RpZmlhYmxlIHRlbXBvcmFyeSIgPDwgc3RkOjplbmRsOwp9CnRlbXBsYXRlIDxjbGFzcyBUPgplbmFibGVfaWY8aXNfbW9kaWZpYWJsZV9ydmFsPFQ+e30+IGZuKFQmJiB4KQp7CiAgICBzdGQ6OmNvdXQgPDwgImEgbW9kaWZpYWJsZSB0ZW1wb3JhcnkiIDw8IHN0ZDo6ZW5kbDsKfQoKCnRlbXBsYXRlIDxjbGFzcyBUPgpUIGV4cHIoKQp7CiAgICBzdGF0aWMgdHlwZW5hbWUgc3RkOjpkZWNheTxUPjo6dHlwZSB0OwogICAgcmV0dXJuIHQ7Cn0KCmludCBtYWluKCkKewogICAgZm4oZXhwcjxzdGQ6OnN0cmluZyY+KCkpOwogICAgZm4oZXhwcjxjb25zdCBzdGQ6OnN0cmluZyY+KCkpOwogICAgZm4oZXhwcjxzdGQ6OnN0cmluZz4oKSk7CiAgICBmbihleHByPGNvbnN0IHN0ZDo6c3RyaW5nPigpKTsKfQ==