Этот код:
#include <iostream>
using ::std::cerr;
class Barney;
class Fred {
public:
Fred() { }
Fred(const Barney &b) { cerr << "Using conversion constructor.\n"; }
};
class Barney {
public:
Barney() { }
operator Fred() const { cerr << "Using conversion operator.\n"; return Fred(); }
};
int main(int argc, const char *argv[])
{
const Barney b;
Fred f;
f = b;
return 0;
}
генерирует эту ошибку в gcc 4.6:
g++ -O3 -Wall fred.cpp -o a.out
fred.cpp: In function ‘int main(int, const char**)’:
fred.cpp:23:8: error: conversion from ‘const Barney’ to ‘const Fred’ is ambiguous
fred.cpp:21:17: note: candidates are:
fred.cpp:16:4: note: Barney::operator Fred() const
fred.cpp:10:4: note: Fred::Fred(const Barney&)
fred.cpp:7:7: error: initializing argument 1 of ‘Fred& Fred::operator=(const Fred&)’
Compilation exited abnormally with code 1 at Sun Jun 19 04:13:53
Теперь, если я удаляю const
после operator Fred()
, он компилируется ииспользует конструктор преобразования.Если я также удаляю const
из объявления b
в main
, тогда он предпочитает оператор преобразования.
Все это соответствует правилам разрешения перегрузки.И gcc генерирует соответствующую ошибку неоднозначности, когда не может выбрать между оператором преобразования и конструктором преобразования.
Я заметил, что в приведенных вами примерах оператор преобразования пропускает const
.Это означает, что никогда не будет случая, когда использование оператора преобразования или конструктора преобразования является неоднозначным.