среда, 9 июля 2008 г.

implicit c-tor

Пока пробовал реакцию компиляторов на предыдущий пост обнаружил такую ошибку в gcc (версия 4.2.3 Ubuntu) — следующий код не компилируется, хотя должен:
#include <iostream>

struct type1 {
type1() {};
};

struct type2 {
type2( const type1& ) {};
};

struct sss {
sss( type2 ) {
std::cout << "type2" << std::endl;
};
};

int main() {
type1 x;
sss xxx = x; // <- тут выдается ошибка в gcc
return 0;
}

Поясню что тут должно произойти: класс sss должен конструироваться из класса type2, который, в свою очередь, неявно получается из type1. В компиляторе от Microsoft все так и работает.

Кстати, если писать явно sss xxx( x );,то работает и в gcc.

P.S. Ответ разработчиков gcc был следующим: Only a single user-defined conversion is allowed in an implicit conversion sequence, but the copy-initialization would require two.
Что в переводе означает только то, что та форма инициализации, которая вызывает ошибку, требует два неявных преобразования, а это запрещено.

Остается неясным почему это запрещено(пока не нашел в стандарте) и, если это так и есть, то почему компилятор от Microsoft не выдает ошибку?..

Комментировать в ВКонтакте