Конструктор для преобразования в Dev-cpp и Ms Visual C++

Normann

Well-known member
09.08.2007
168
1
#1
Код:
class MyClass
{
...
MyClass();
MyClass(MyClass&);
MyClass(int);
...
};

void OnButton1(void)
{
MyClass obj1 = 9;
};
В MS Visual C++ компилируется и выполняется без ошибок и предупреждений, а в Dev-Cpp выводит вот такую ошибку:
In function `void OnButton1()':
no matching function for call to `MyClass::MyClass(MyClass)'
candidates are: MyClass::MyClass(int)
MyClass::MyClass(MyClass&)
initializing temporary from result of `MyClass::MyClass(int)'
[Build Error] [ButtonsClick.o] Error 1

Почему? Исправно ли это?
 

Normann

Well-known member
09.08.2007
168
1
#3
Да, но почему такая разница, и какой компилятор скомпилировал правельнее?

Еще интересно то что obj1 = 9 в Dev-Cpp интерпретировался без проблем.
 
04.09.2006
2 566
3
#4
Есть такое правило, что если переопределен копирующий конструктор, то необходимо реализовывать и оператор присваивания.

Фича в том что ваш констуктор копирования принимает неконстантную ссылку. Вот вам цитата из стандарта:

Note: if a class X only has a copy constructor with a parameter of type X&, an initializer of type const X or volatile X cannot initialize an object of type (possibily cv-qualified) X. Example:
struct X {
X(); //default constructor
X(X&); //copy constructor with a nonconst parameter
};

const X cx;
X x = cx; // error – X::X(X&) cannot copy cx into x
 

Normann

Well-known member
09.08.2007
168
1
#5
Параметр конструктора копирования сделал константным, заработало без проблем. Но блин, не могу врубиться как конструктор копирования и конструктор для преобразования (int) конфликтуют между собой когда объект инициализируется int типом.