Я осмелюсь не согласиться с Комо в этом случае. Фактически, следующий код не может быть скомпилирован должным образом, потому что привязка значения r к ссылке на const требует доступного конструктора копирования.
class A {
};
class B : public A {
B(const B& other);
B& operator=(const B& other);
public:
explicit B(){}
};
int main()
{
A const & a = B();
}
Согласно 8.5.3 / 2, «[...] передача аргумента (5.2.2) и возврат значения функции (6.6.3) являются инициализациями», и поэтому код должен быть некорректным.
Редактировать: Я до сих пор твердо верю, что код неправильно сформирован в соответствии с C ++ 03. Тем не менее, я только что прочитал соответствующий раздел рабочего проекта для C ++ 0x, и кажется, что он больше не требует наличия конструктора копирования. Возможно, именно поэтому ваш код начал компилироваться, когда вы перешли с gcc-4.2 на gcc-4.3.
Редактировать: Чтобы уточнить, причина, по которой B::B(const B &)
должен быть доступен, связана с привязкой B()
к первому параметру A::A(const A &)
(который, конечно, вызывается, когда m_a
инициализируется).
Редактировать: Что касается разницы между C ++ 03 и C ++ 0x, litb был достаточно любезен, чтобы найти соответствующий отчет о дефектах .