Форум программистов, компьютерный форум CyberForum.ru

Баг компилятора? Или я чего то не догоняю? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Bers
Заблокирован
08.11.2011, 20:36     Баг компилятора? Или я чего то не догоняю? #1
Компилил в 2008 студии. Вопрос: ПОЧЕМУ ЭТОТ КОД КОМПИЛИРУЕТСЯ?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Bee
{
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>&)
    {
        return *this;
    }
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<float> bee2;  
    bee1 = bee2;
 
    return 0;
}
/зы
Данный код не мой. Случайно нашёл в интернете. Заинтриговало. Решил поделится с народом.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2011, 20:36     Баг компилятора? Или я чего то не догоняю?
Посмотрите здесь:

Баг компилятора???????? C++
C++ помогите определить баг или недочёт в программе.
Вложенные CMap или CArray-объекты. Ошибка компилятора или неправильная работа. C++
C++ Ошибка или баг в Dev C++?
Баг компилятора? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
09.11.2011, 20:23  [ТС]     Баг компилятора? Или я чего то не догоняю? #21
Цитата Сообщение от DKOI Посмотреть сообщение
В общем, писать мелкомягким баг манифест и призвать их к ответу
За моральный ущерб трясти будим?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DKOI
 Аватар для DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 20:24     Баг компилятора? Или я чего то не догоняю? #22
А то, мы их на такие деньги посадим, будут знать, как нарушать инкапсуляцию
Сыроежка
Заблокирован
09.11.2011, 20:27     Баг компилятора? Или я чего то не догоняю? #23
Цитата Сообщение от Bers Посмотреть сообщение
Компилил в 2008 студии. Вопрос: ПОЧЕМУ ЭТОТ КОД КОМПИЛИРУЕТСЯ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class Foo>
class Bee
{
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>&)
    {
        return *this;
    }
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<float> bee2;  
    bee1 = bee2;
 
    return 0;
}
/зы
Данный код не мой. Случайно нашёл в интернете. Заинтриговало. Решил поделится с народом.
Я подправил ваш исходный код, добавив шаблонный параметр, как уже здесь было предложено. Вообще-то, код не должен компилироваться, так как шаблонный оператор присваивания является закрытым. То есть два оператора присваивания должны участвовать в "конкурсе" на выбор наиболее подходящего - это копирующий оператор присваивания, который создан неявно компилятором, и данный шаблонный оператор присваивания. Так как лучше подходит шаблонный оператор присваивания, то он и должен быть выбран. Но так как он закрытый, то компилятор должен выдать сообщение об ошибке.
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
09.11.2011, 20:34     Баг компилятора? Или я чего то не догоняю? #24
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я подправил ваш исходный код, добавив шаблонный параметр, как уже здесь было предложено. Вообще-то, код не должен компилироваться, так как шаблонный оператор присваивания является закрытым. То есть два оператора присваивания должны участвовать в "конкурсе" на выбор наиболее подходящего - это копирующий оператор присваивания, который создан неявно компилятором, и данный шаблонный оператор присваивания. Так как лучше подходит шаблонный оператор присваивания, то он и должен быть выбран. Но так как он закрытый, то компилятор должен выдать сообщение об ошибке.
Спасибо, кэп. Вопрос в том, почему компилятор ошибки не выдает? MSVS 2008.
Сыроежка
Заблокирован
09.11.2011, 20:35     Баг компилятора? Или я чего то не догоняю? #25
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Спасибо, кэп. Вопрос в том, почему компилятор ошибки не выдает? MSVS 2008.
Это вопрос не ко мне, а к разработчикам компилятора.
Очевидно, что не выдает ошибку потому, что из двух операторов присваивания выбирает созданный им самим неявно оператор присваивания. Ведь, как я уже указал, в конкурсе участвуют два оператора присваивания.
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
09.11.2011, 20:42     Баг компилятора? Или я чего то не догоняю? #26
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это вопрос не ко мне, а к разработчикам компилятора.
Очевидно, что не выдает ошибку потому, что из двух операторов присваивания выбирает созданный им самим неявно оператор присваивания. Ведь, как я уже указал, в конкурсе участвуют два оператора присваивания.
Очевидное и невероятное.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class Foo>
class Bee
{
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>&)
    {
        cout<<"Hello!"<<endl;
        return *this;
    }
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<double> bee2;  
    bee1 = bee2;
 
    return 0;
}
Hello!
Для продолжения нажмите любую клавишу . . .
Правильно компилятор все выбирает.
Сыроежка
Заблокирован
09.11.2011, 20:50     Баг компилятора? Или я чего то не догоняю? #27
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Очевидное и невероятное.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class Foo>
class Bee
{
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>&)
    {
        cout<<"Hello!"<<endl;
        return *this;
    }
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<double> bee2;  
    bee1 = bee2;
 
    return 0;
}
Правильно компилятор все выбирает.
Я уже написал, что этот код некорректный, так как происходит обращение к закрытому члену класса. То есть выбирает оператор присваивания он правильно (если верить вам), но тем не менее код не должен компилироваться, так как отсутствует право доступа.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.11.2011, 21:18     Баг компилятора? Или я чего то не догоняю? #28
Он с любым шаблонным оператором так себя ведет. Дико странно.
DKOI
 Аватар для DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 21:24     Баг компилятора? Или я чего то не догоняю? #29
Цитата Сообщение от ForEveR Посмотреть сообщение
Он с любым шаблонным оператором так себя ведет. Дико странно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template <class Foo>
class Bee
{
public:
    Bee(): m_test(555) {}
    int m_test;
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>& ist)
    {
        m_test= ist.m_test;
        return *this;
    }
    
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<int> bee2;  
    bee1 = bee2;
 
    return 0;
}
Вызывается стандартный оператор, а не переопределенный.
Сыроежка
Заблокирован
09.11.2011, 21:26     Баг компилятора? Или я чего то не догоняю? #30
Цитата Сообщение от DKOI Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template <class Foo>
class Bee
{
public:
    Bee(): m_test(555) {}
    int m_test;
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>& ist)
    {
        m_test= ist.m_test;
        return *this;
    }
    
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<int> bee2;  
    bee1 = bee2;
 
    return 0;
}
Вызывается стандартный, оператор а не переопределенный.
Один говорит, что у него в MS VC++ вызывается шаблонный оператор присваивания, другой говорит, что вызывается неявно определенный.

Вы уж, плиз, указывайте конкретно, какой компилятор вы используете!

Но в любом случае, как я уже написал в своем первом сообщении, код не должен компилироваться.
DKOI
 Аватар для DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 21:29     Баг компилятора? Или я чего то не догоняю? #31
Цитата Сообщение от Сыроежка Посмотреть сообщение
Один говорит, что у него в MS VC++ вызывается шаблонный оператор присваивания, другой говорит, что вызывается неявно определенный.
Вы уж, плиз, указывайте конкретно, какой компилятор вы используете!
2010 студия. Но шутка не в том. Если у бии1 и бии2 разные типы передаются в шаблон - вызывается приватный, если одинаковые - стандартный, копирующий.
Сыроежка
Заблокирован
09.11.2011, 21:31     Баг компилятора? Или я чего то не догоняю? #32
Цитата Сообщение от DKOI Посмотреть сообщение
2010 студия. Но шутка не в том. Если у бии1 и бии2 разные типы передаются в шаблон - вызывается приватный, если одинаковые - стандартный, копирующий.
Так это понятно, какой оператор должен вызываться. Вопрос в том, почему компилятор вызывает закрытый шаблонный оператор присваивания! Это очевидный баг компилятора.
DKOI
 Аватар для DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 21:32     Баг компилятора? Или я чего то не догоняю? #33
А кто спорит, что баг? Пытаемся докопаться до причин, однако.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2011, 21:36     Баг компилятора? Или я чего то не догоняю?
Еще ссылки по теме:

C++ Баг или фича
C++ Ввод/вывод баг или нет?
C++ std::regex : баг на сайте или баг компилятора?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
09.11.2011, 21:36     Баг компилятора? Или я чего то не догоняю? #34
Цитата Сообщение от DKOI Посмотреть сообщение
А кто спорит, что баг? Пытаемся докопаться до причин, однако.
Совершенно не понятно, до каких причин вы пытаетесь докопаться?! Причиной бага есть сам баг, то есть невнимательность разработчиков компилятора!
Yandex
Объявления
09.11.2011, 21:36     Баг компилятора? Или я чего то не догоняю?
Ответ Создать тему
Опции темы

Текущее время: 04:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru