Существует что-то не так с тем, как оператор преобразования ведет себя в следующем коде:оператор преобразования обходит конструктор производного типа и пропускает копию-инициализацию базового типа?
struct A{
A(){};
A(const A &) = delete;
};
struct B : A{
B(const B & x){};
B(int x){};
};
struct C{
operator B() {
return B(1);
};
};
void foo(const A & x){
};
int main(){
C c;
foo(c.operator B()); //1) Ok
foo(c); //2) Not Ok
return 0;
};
Я получаю сообщение об ошибке при вызове 2):
test.cpp:24:7: error: use of deleted function 'A::A(const A&)'
foo(c); //2) Not Ok
^
Так что вопрос: почему в аду он хочет скопировать-инициализировать A? Примечание. B объявляет свой собственный конструктор копирования. Я бы хотел, чтобы этот вызов 1), который преуспел, идентичен 2), но, видимо, это не так?
О практической проблеме, которую я пытаюсь решить: в классе C я хотел предоставить преобразование в сторонний класс A, который запрещает копирование. Идея состояла в том, чтобы вернуть прокси B: A, который добавит семантику перемещения поверх A. Есть ли другой способ определить оператор преобразования, чтобы получить A в стеке, подчиняясь его политике без копирования.
О, дерьмо, я выяснил, что это ошибки в gcc 4.8.3 и VS Nov_2013, но работает нормально с gcc 4.9.3 и clang-7.0.2. Поскольку, по-видимому, это проблема с компилятором, я должен ответить на вопрос? –
Нет, это правильный вопрос. Нет ничего плохого в вопросе, который оказывается ошибкой компилятора. –