?

Log in

No account? Create an account

Кто у нас тут language lawyer? - Общество дровосеков Бердичева по изучению Мишны

Apr. 11th, 2013

07:19 pm - Кто у нас тут language lawyer?

Previous Entry Share Next Entry

[сиплюсплюсное, так штааа...]

struct B {};
struct A {
        A() { }
        A(B) { }
};

struct C {
        operator A() { return A(); }
        operator B() { return B(); }
};

int main() {
        C c;
        A a1 = c; // OK
        A a2(c);  // WTF???
}

GCC 4.7.2:
class.cc: In function ‘int main()’:
class.cc:15:8: error: call of overloaded ‘A(C&)’ is ambiguous
class.cc:15:8: note: candidates are:
class.cc:4:2: note: A::A(B)
class.cc:2:8: note: A::A(const A&)

А в предыдущей строке, значит, не ambiguous? В чем разница?

Comments:

[User Picture]
From:yatur
Date:April 12th, 2013 03:23 am (UTC)
(Link)
Хм... Я по наивности думал, что

T x = y;

и

T x(y);

имеет один и тот же смысл.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:April 12th, 2013 03:27 am (UTC)
(Link)
Аналогично, потому и пост.
(Reply) (Parent) (Thread)
[User Picture]
From:yatur
Date:April 12th, 2013 03:29 am (UTC)
(Link)
Я бы задал вопрос на Stackoverflow. Или на каком-нибудь форуме GCC.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:dvv
Date:April 12th, 2013 04:51 am (UTC)
(Link)
Найди Вижуал, ему скорми. А я в выходные попытаюсь в Стандарте чего найти на эту тему. Сейчас не до девушек.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:April 12th, 2013 05:18 am (UTC)
(Link)
Где ж я его найду? Когда-то я в качестве second opinion пользовался онлайн-компилятором имени Comeau Computing, но он что-то сдох. Я clang только что попробовал - точно так же себя ведет.
(Reply) (Parent) (Thread)
[User Picture]
From:dvv
Date:April 12th, 2013 11:02 am (UTC)
(Link)
Тенденция, однако.
(Reply) (Parent) (Thread)
[User Picture]
From:vmtcom
Date:April 12th, 2013 05:55 am (UTC)
(Link)
Visual вроде не ругается.
(Reply) (Thread)
[User Picture]
From:vmtcom
Date:April 12th, 2013 05:58 am (UTC)
(Link)
И он-лайн Visual http://rise4fun.com/vcpp тоже не ругается
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:spamsink
Date:April 12th, 2013 05:59 am (UTC)
(Link)
Вот и мое мнение, что в обоих случаях не надо бы, т.к. каст к желаемому типу должен считаться ближе, чем к произвольному.
(Reply) (Parent) (Thread)
[User Picture]
From:lider
Date:April 12th, 2013 06:02 am (UTC)

так даже интереснее ;)

(Link)
struct B {};
struct A {
A(B) { }
private:
A();
};

struct C {
operator A() const { return A(B(*this)); }
operator B() const { return B(); }
};

int main() {
C c;
A a1 = c; // OK
A a2(c); // WTF???
}


Edited at 2013-04-12 06:08 am (UTC)
(Reply) (Thread)
[User Picture]
From:spamsink
Date:April 12th, 2013 06:09 am (UTC)

Re: так даже интереснее ;)

(Link)
После нахождения неоднозначности компилятору не до ерунды, завершаться надо.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:beldmit
Date:April 12th, 2013 08:18 am (UTC)
(Link)
У Саттера это где-то разбирается. Если я не путаю, то причина в том, что строка

A a2(c); // WTF???

может быть интерпретирована как декларация функции, а не как инициализация.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:April 12th, 2013 03:02 pm (UTC)
(Link)
Насчет декларации функции - это про пустые скобки.
(Reply) (Parent) (Thread)
[User Picture]
From:fatoff
Date:April 14th, 2013 01:54 am (UTC)
(Link)
Когда я слегка поддерживал некий местечковый C компиллятор, и возникал подобный WTF, который логически необъясним, мы смотрели, что там получается после препроцессора (?).
(Reply) (Thread)
[User Picture]
From:spamsink
Date:April 14th, 2013 03:36 am (UTC)
(Link)
Никаких препроцессоров, компилятору дается ровно то, что написано.
(Reply) (Parent) (Thread) (Expand)