Заранее приносим свои извинения за этот вопрос. Прошло некоторое время с тех пор, как я использовал C++, и я не могу найти точного руководства, которое отвечает на мой вопрос. У считать это пример неявного преобразования, но я не уверен.
class Square
{
public:
Square(int size) : size{size}
{
}
int getSize() const
{
return size;
}
private:
int size;
};
void doSomething(Square square)
{
cout << "doSomething called with " << square.getSize() << endl;
}
int main()
{
// Should be passing in a Square type here, but instead passing an int.
doSomething(23);
return 0;
}
doSomething called with 23
Спасибо!
Спасибо! Я пытался понять, почему происходит преобразование, но было здорово узнать, как его предотвратить.





Вкратце: поскольку Square square = 23; действителен, вызов doSomething(23) соответствует сигнатуре doSomething(Square square); вот как работает выбор функции-кандидата в разрешении перегрузки.
Если бы были другие перегрузки doSomething, которые также соответствовали вызову, то перегрузки были бы ранжированы в зависимости от того, какие преобразования требуются для каждой из них.
Код Square square = 23; действителен, потому что Square имеет конвертирующий конструктор.
Спасибо, что нашли время, чтобы объяснить это полностью!
Если бы конструктором для Square был explicit, было бы это ошибкой компиляции?
@ Стив, да; явный конструктор не является конструктором преобразования
Сделайте конструктор
Squareявный, и вы запретите неявное преобразование.