Imagine que você tem o seguinte trecho de código:
struct S
{
S() = default();
S(S const&){std::cout << "copy ctor" << '\n';};
S& operator=(S const&) { std::cout << "copy assignment" << '\n'; return *this; }
~S();
};
S createS(){return s{};}
int main()
{
S s{};
s = createS();
}
Embora seja contra a regra dos cinco, o que acontece na atribuição de s
na main()
função? createS()
retorna um valor-r. Assim, o compilador procurará um operador de atribuição de movimento e, como ele não é gerado e excluído automaticamente, retornará ao operador de atribuição de cópia. No entanto, um valor-r semanticamente não se vincula a uma operação de cópia, pois não possui um identificador e não pode ser reutilizado (pelo que entendi).
Minha pergunta é: como o operador de atribuição lida com essa situação e distingue entre valor r e valor l?