У меня есть класс с неявным конструктором const char *. Моя интуиция подсказывает мне, что не должно иметь значения, явно или неявно я вызываю конструктор, но, по-видимому, это имеет значение в случае const char *, и я не понимаю, почему. Компилятор VC++ сопоставляет foo(const String &t) для первого вызова foo в приведенном ниже коде:
struct Str
{
Str(const char *c)
{
value = c[0];
}
Str(double c)
{
value = char(c);
}
char value;
};
void foo(const Str &t)
{
cout << "const Str &t matched\n";
}
void foo(const Str &&t)
{
cout << "const Str &&t matched\n";
}
void main()
{
foo("v");
foo(Str("v"));
foo(5.0);
foo(Str(5.0));
}
Во всем остальном он соответствует версии foo для Str &&t. Почему он ведет себя по-другому в неявном случае «v»? И что я должен изменить, чтобы версия && foo соответствовала? (представьте, что foo — это, например, функция vector::push_back — мне бы не хотелось явно приводить все мои строковые литералы.)