Com o código abaixo
#include <algorithm>
#include <vector>
bool MyComparator(const int lhs, const int rhs) {
// More logic included here
return lhs < rhs;
}
template <typename T, typename Comp = std::less<T>>
class seq_forward_comparator
{
const std::vector<T>& vec;
const Comp& comp;
public:
static const std::size_t npos = ((std::size_t)-1);
seq_forward_comparator(const std::vector<T>& vec, const Comp& comp = {}) : vec(vec), comp(comp) { }
bool operator() (int idx1, int idx2)
{
// More logic here
return std::ranges::lexicographical_compare(vec.begin()+idx1,vec.end(), vec.begin() + idx2, vec.end(), comp);
}
};
int main() {
std::vector<int> vec = { 1, 2, 3, 4 };
seq_forward_comparator<int, decltype(MyComparator)> less2(vec, MyComparator);
seq_forward_comparator<int> less1(vec);
}
No MSVC++ estou recebendo avisos:
<source>(13): warning C4180: qualifier applied to function type has no meaning; ignored
<source>(13): note: the template instantiation context (the oldest one first) is
<source>(29): note: see reference to class template instantiation 'seq_forward_comparator<int,bool (int,int)>' being compiled
<source>(17): warning C4180: qualifier applied to function type has no meaning; ignored
enquanto CLang não emite aviso.
Caso eu substitua
seq_forward_comparator<int, decltype(MyComparator)> less2(vec, MyComparator);
com
seq_forward_comparator<int, decltype(MyComparator)*> less2(vec, MyComparator);
MSVC++ 2022 para de avisar.
Isso é falso-positivo?
Caso contrário, qual problema potencial são os sinais, exceto "excessivos" const
e de que maneira mudar o tipo de função (que é um ponteiro para uma função, de qualquer maneira) para um ponteiro para uma função resolve isso?
Em caso afirmativo, qual seria a melhor maneira de evitá-lo, exceto suprimir o aviso e passar um ponteiro explícito para a função?
Atualizar
É claro que a solução com a substituição decltype(MyComparator)
de decltype(MyComparator)*
está errada ou, neste caso, pelo menos o ponteiro para a função deve ser passado como um predicado, como afirma este tipo.
Não, para um function-type
Comp
,const Comp&
é o mesmo queComp&
. Isso pode ser visto em dcl.fct#11 :Um tipo de ponteiro é um tipo de objeto e pode ser modificado para um tipo de ponteiro
const&Comp
eComp&
não são iguais.