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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Bers
Заблокирован
#1

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

08.11.2011, 20:36. Просмотров 1658. Ответов 33
Метки нет (Все метки)

Компилил в 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++
Почему первая программа дает 6, а вторая 11? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; int _tmain(int argc, _TCHAR* argv) { int...

Баг компилятора? - C++
Набросал вот такой код: // &lt;@r!er&gt; &lt;wtf&gt; &lt;26.05.2012&gt; #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace...

Вложенные CMap или CArray-объекты. Ошибка компилятора или неправильная работа. - C++
Имеется: struct OPER { CString name; //название CString symbol; //обозначение };

Баг или фича - C++
решил проверить на своем VS 2008 присвоение в сравнении написал char buf; char *buf1; if(buf1=buf) все прошло никакого...

Ошибка или баг в Dev C++? - C++
помогите разобраться: вот простой код #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; class card { public: ...

Ввод/вывод баг или нет? - C++
#include &lt;iostream&gt; #include &lt;iterator&gt; #include &lt;string&gt; using namespace std; ostream_iterator&lt;string&gt; oo(cout); ...

Баг VS или как? Функция в многофайловом приложении - C++
#include &quot;function.h&quot; int main(){ LoadFileToStack(); cout &lt;&lt; endl; st return 0; } void LoadFileToStack() ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
09.11.2011, 20:23  [ТС]     Баг компилятора? Или я чего то не догоняю? #21
Цитата Сообщение от 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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
09.11.2011, 21:18     Баг компилятора? Или я чего то не догоняю? #28
Он с любым шаблонным оператором так себя ведет. Дико странно.
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
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
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++
Задача ввести с клавиатуры массив и вывести на экран наибольший его элемент. Проблема заключается в if когда s&lt;mas он всё время...

Ошибка или баг Visual Studio 2015? - C++
Кто сталкивался с проблемой когда после сборки программы, зависает Visual? Даже пустой проект не может запустить, хотя раньше запускал....

Си или Си++ с чего начать? - C++
Владею только паскалем. Решил изучить новый язык, остановился на Си, но многие советуют Си++. Суть темы: На много ли С++ сложнее С? На...

Ошибка в учебнике или я чего то не понимаю - C++
В учебнике Дейтела Харви при изучении полиморфизма натолкнулся на такую вещь, создается абстрактный класс, его наследники, а потом в майн...

Endl не работает или я чего не понял? - C++
Код программы, с которой я столкнулся в клине Джесс Либерти С++ за 21 день: #include &lt;iostream.h&gt; int main() { char string0ne; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru