Tentei usar ambos como padrão operator==
em operator<=>
uma classe simples que contém um membro de referência como este:
#include <iostream>
#include <string>
class Simple
{
public:
Simple(const std::string& data)
: data_(data)
{
}
auto operator<=>(const Simple&) const = default;
private:
const std::string& data_;
};
int main(int argc, char** argv)
{
std::string str1 = "one";
Simple s1(str1);
std::string str2 = "two";
Simple s2(str2);
std::cout << (s1 < s2) << std::endl; // compiler error
return 0;
}
O compilador clang afirma que
warning: explicitly defaulted three-way comparison operator is implicitly deleted
note: defaulted 'operator<=>' is implicitly deleted because class 'Simple' has a reference member
Não recebi nenhum aviso de outros compiladores (por exemplo, MSVC), mas quando tento usá-lo, recebo erros de compilação:
<source>(62): error C2280: 'auto Simple::operator <=>(const Simple &) const': attempting to reference a deleted function
<source>(49): note: see declaration of 'Simple::operator <=>'
<source>(49): note: 'auto Simple::operator <=>(const Simple &) const': function was implicitly deleted because 'Simple' data member 'Simple::data_' of type 'const std::string &' is a reference type
<source>(52): note: see declaration of 'Simple::data_'
Outras funções padrão, como atribuição de cópia, serão excluídas, porque não são possíveis com um membro de referência.
Mas por que o conteúdo de uma referência não pode ser comparado automaticamente?
E qual é o caminho mais curto para implementá-lo manualmente?