c ++ 0x: сопоставление ссылочного параметра Rvalue для классов с неявными константными конструкторами char * - PullRequest
0 голосов
/ 16 мая 2011

У меня есть класс с неявным конструктором 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));
}

Это соответствует Str && t версии foo для всего остального. Почему он ведет себя иначе в неявном случае "v"? И что я должен изменить, чтобы соответствовать && версии foo? (представьте, что foo является, например, функцией vector :: push_back - я бы не стал явно приводить все мои строковые литералы.)

1 Ответ

1 голос
/ 16 мая 2011

Это известная проблема со спецификацией ссылок на rvalue, которая теперь исправлена, но не была обнаружена, когда MSVC10 реализовал их.По сути, при принятии решения о привязке к ссылкам lvalue или rvalue учитывается исходная lvalueness или rvalueness аргумента, not после любых преобразований, если они требуются.Это связано с тем, что исходные ссылки на rvalue были слишком жадными в отношении привязки к lvalue, и была введена некоторая строгая формулировка для обеспечения безопасности ссылок на rvalue, но она оказалась немного чрезмерной.Вам не нужен пользовательский тип, чтобы продемонстрировать это - простой std::string подойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...