Resolução de sobrecarga com qualificadores ref
Ao trabalhar com sobrecargas de funções qualificadas por ref, estou obtendo resultados diferentes deGCC (4.8.1) eClang (2.9 e tronco). Considere o seguinte código:
#include <iostream>
#include <utility>
struct foo
{
int& bar() &
{
std::cout << "non-const lvalue" << std::endl;
return _bar;
}
//~ int&& bar() &&
//~ {
//~ std::cout << "non-const rvalue" << std::endl;
//~ return std::move(_bar);
//~ }
int const& bar() const &
{
std::cout << "const lvalue" << std::endl;
return _bar;
}
int const&& bar() const &&
{
std::cout << "const rvalue" << std::endl;
return std::move(_bar);
}
int _bar;
};
int main(int argc, char** argv)
{
foo().bar();
}
Clang compila e saídas"const rvalue"
, enquantoGCC acha que esta é uma chamada ambígua com as duas funções const-qualificadas sendo ambas as melhores candidatas viáveis. Se eu fornecer todas as 4 sobrecargas, então ambos os compiladores saem"non-const rvalue"
.
Eu gostaria de saber qual compilador--caso existam-- está fazendo a coisa certa, e quais são as peças padrão relevantes em jogo.
Nota: A razão pela qual isso realmente importa é que o código real declara ambas as funções qualificadas comoconstexpr
. Claro, não há saída parastd::cout
estatic_cast
é usado em vez destd::move
, para que sejam válidosconstexpr
definições. E desde entãoC ++ 11 constexpr
ainda implicaconst
, a sobrecarga comentada no código de exemplo não pode ser fornecida, pois redefiniria a sobrecarga rvalue qualificada para const.