#include <iostream>
#include <string>
struct S {
template<typename T>
S(T t) { std::cout << "T t\n"; }
std::string value_;
};
template<>
S::S(std::string value) {
std::cout << "string\n";
value_ = std::move(value);
}
template<>
S::S(const std::string&) {
std::cout << "const string&\n";
}
int main() {
S s1(42);
std::string foo{"bar"};
const std::string& foor = foo;
S s2(foo);
S s3(foor);
}
CSNpbmNsdWRlIDxpb3N0cmVhbT4KCSNpbmNsdWRlIDxzdHJpbmc+CgkKCXN0cnVjdCBTIHsKCQl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJCVMoVCB0KSB7IHN0ZDo6Y291dCA8PCAiVCB0XG4iOyB9CgkJCgkJc3RkOjpzdHJpbmcgdmFsdWVfOwoJfTsKCQoJdGVtcGxhdGU8PgoJUzo6UyhzdGQ6OnN0cmluZyB2YWx1ZSkgewoJCXN0ZDo6Y291dCA8PCAic3RyaW5nXG4iOwoJCXZhbHVlXyA9IHN0ZDo6bW92ZSh2YWx1ZSk7Cgl9CgkKCXRlbXBsYXRlPD4KCVM6OlMoY29uc3Qgc3RkOjpzdHJpbmcmKSB7CgkJc3RkOjpjb3V0IDw8ICJjb25zdCBzdHJpbmcmXG4iOwoJfQoJCglpbnQgbWFpbigpIHsKCQlTIHMxKDQyKTsKCQoJCXN0ZDo6c3RyaW5nIGZvb3siYmFyIn07CgkJY29uc3Qgc3RkOjpzdHJpbmcmIGZvb3IgPSBmb287CgkgICAgUyBzMihmb28pOwoJICAgIFMgczMoZm9vcik7Cgl9