Меня всегда учили, что
1. Class c(arg);
и
2. Class c = arg;
- это два абсолютно эквивалентных утверждения, но посмотрите на эту ситуацию.
#include <iostream>
class Intermediary {
};
class Left {
public:
Left(const Intermediary &) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
class Right {
public:
// The argument is there just so that the example can work, see below
Right(int) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
operator Intermediary () const {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return Intermediary();
}
};
Теперь, если я сделаю это:
Left l = Right(0);
Компилятор будет жаловаться
error: conversion from Right to non-scalar type Left requested
Но если я сделаю это:
Left l(Right(0));
Тогда все компилируется и вывод
Right::Right(int)
Right::operator Intermediary() const
Left::Left(const Intermediary&)
Однако, если я сделаю это:
Left l = (Intermediary)Right(0);
, то все снова будет скомпилировано, и результат будет такой же, как и выше.
Очевидно,
1. Class c(arg);
и
2. Class c = arg;
не одинаковы, но почему бы и нет, и в чем разница?Я не мог ничего найти об этом в Интернете.