Почему не компилируется следующий код?Определенные пользователем и стандартные преобразования
#include <iostream>
using namespace std;
struct CL1{};
struct CL2:CL1
{
CL2(int){cout<<"int";}
};
void fnc(const CL1&)
{
}
int main()
{
fnc(5);
return 0;
}
Не работает ли две конверсии?
- определенного пользователь преобразование
int
вCL2
- стандартного преобразования производных к основанию (
CL2
кconst CL1&
)
стандарт (2003) говорит:
пользователь мог определенная последовательность преобразования состоит из начальной стандартной последовательности преобразования, за которой следует пользовательское преобразование (12.3), за которым следует secon d стандартная последовательность преобразования.
Почему это не работает?
Я не использую сам стандарт, но если это работает, компилятор должен будет проверить все допустимые (неявные) конструкторы всех подклассов класса. Это может создать некоторые интересные проблемы с кодом, который «магически» компилируется при добавлении, казалось бы, несвязанного заголовка (содержащего некоторый подкласс) или столкновений конструкторов разных классов. – user1781290
Хммм ... Я не знаю, что говорит стандарт по этому вопросу, но при том, что вы могли бы иметь несколько корней из int в CL1, если это было разрешено (скажем, если у вас CL3, который идентичен CL2), я бы предположил, что это будет жаловаться где-то еще в стандарте. – IdeaHat