Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Заблокирован

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

08.11.2011, 20:36. Показов 3358. Ответов 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;
}
/зы
Данный код не мой. Случайно нашёл в интернете. Заинтриговало. Решил поделится с народом.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2011, 20:36
Ответы с готовыми решениями:

Баг компилятора или я чего-то не понимаю?
Столкнулся с некоректной работой мк ATmego328P, хотя в C-шном коде ошибок не видно. В таких случаях обычно смотрю дизассемблированный код...

std::regex : баг на сайте или баг компилятора?
http://en.cppreference.com/w/cpp/regex/regex_match этот код выкидывает throw... Добавлено через 35 секунд компилятор gcc 4.8

Баг компилятора или я дурак?
До:https://www.cyberforum.ru/attachment.php?attachmentid=840160&amp;stc=1&amp;d=1496427343 ...

33
Заблокирован
09.11.2011, 20:23  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DKOI Посмотреть сообщение
В общем, писать мелкомягким баг манифест и призвать их к ответу
За моральный ущерб трясти будим?
0
 Аватар для DKOI
24 / 24 / 0
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 20:24
А то, мы их на такие деньги посадим, будут знать, как нарушать инкапсуляцию
0
Заблокирован
09.11.2011, 20:27
Цитата Сообщение от 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;
}
/зы
Данный код не мой. Случайно нашёл в интернете. Заинтриговало. Решил поделится с народом.
Я подправил ваш исходный код, добавив шаблонный параметр, как уже здесь было предложено. Вообще-то, код не должен компилироваться, так как шаблонный оператор присваивания является закрытым. То есть два оператора присваивания должны участвовать в "конкурсе" на выбор наиболее подходящего - это копирующий оператор присваивания, который создан неявно компилятором, и данный шаблонный оператор присваивания. Так как лучше подходит шаблонный оператор присваивания, то он и должен быть выбран. Но так как он закрытый, то компилятор должен выдать сообщение об ошибке.
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
09.11.2011, 20:34
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я подправил ваш исходный код, добавив шаблонный параметр, как уже здесь было предложено. Вообще-то, код не должен компилироваться, так как шаблонный оператор присваивания является закрытым. То есть два оператора присваивания должны участвовать в "конкурсе" на выбор наиболее подходящего - это копирующий оператор присваивания, который создан неявно компилятором, и данный шаблонный оператор присваивания. Так как лучше подходит шаблонный оператор присваивания, то он и должен быть выбран. Но так как он закрытый, то компилятор должен выдать сообщение об ошибке.
Спасибо, кэп. Вопрос в том, почему компилятор ошибки не выдает? MSVS 2008.
0
Заблокирован
09.11.2011, 20:35
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Спасибо, кэп. Вопрос в том, почему компилятор ошибки не выдает? MSVS 2008.
Это вопрос не ко мне, а к разработчикам компилятора.
Очевидно, что не выдает ошибку потому, что из двух операторов присваивания выбирает созданный им самим неявно оператор присваивания. Ведь, как я уже указал, в конкурсе участвуют два оператора присваивания.
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
09.11.2011, 20:42
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это вопрос не ко мне, а к разработчикам компилятора.
Очевидно, что не выдает ошибку потому, что из двух операторов присваивания выбирает созданный им самим неявно оператор присваивания. Ведь, как я уже указал, в конкурсе участвуют два оператора присваивания.
Очевидное и невероятное.
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!
Для продолжения нажмите любую клавишу . . .
Правильно компилятор все выбирает.
0
Заблокирован
09.11.2011, 20:50
Цитата Сообщение от 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;
}
Правильно компилятор все выбирает.
Я уже написал, что этот код некорректный, так как происходит обращение к закрытому члену класса. То есть выбирает оператор присваивания он правильно (если верить вам), но тем не менее код не должен компилироваться, так как отсутствует право доступа.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.11.2011, 21:18
Он с любым шаблонным оператором так себя ведет. Дико странно.
0
 Аватар для DKOI
24 / 24 / 0
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 21:24
Цитата Сообщение от 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;
}
Вызывается стандартный оператор, а не переопределенный.
0
Заблокирован
09.11.2011, 21:26
Цитата Сообщение от 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++ вызывается шаблонный оператор присваивания, другой говорит, что вызывается неявно определенный.

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

Но в любом случае, как я уже написал в своем первом сообщении, код не должен компилироваться.
0
 Аватар для DKOI
24 / 24 / 0
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 21:29
Цитата Сообщение от Сыроежка Посмотреть сообщение
Один говорит, что у него в MS VC++ вызывается шаблонный оператор присваивания, другой говорит, что вызывается неявно определенный.
Вы уж, плиз, указывайте конкретно, какой компилятор вы используете!
2010 студия. Но шутка не в том. Если у бии1 и бии2 разные типы передаются в шаблон - вызывается приватный, если одинаковые - стандартный, копирующий.
0
Заблокирован
09.11.2011, 21:31
Цитата Сообщение от DKOI Посмотреть сообщение
2010 студия. Но шутка не в том. Если у бии1 и бии2 разные типы передаются в шаблон - вызывается приватный, если одинаковые - стандартный, копирующий.
Так это понятно, какой оператор должен вызываться. Вопрос в том, почему компилятор вызывает закрытый шаблонный оператор присваивания! Это очевидный баг компилятора.
0
 Аватар для DKOI
24 / 24 / 0
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 21:32
А кто спорит, что баг? Пытаемся докопаться до причин, однако.
0
Заблокирован
09.11.2011, 21:36
Цитата Сообщение от DKOI Посмотреть сообщение
А кто спорит, что баг? Пытаемся докопаться до причин, однако.
Совершенно не понятно, до каких причин вы пытаетесь докопаться?! Причиной бага есть сам баг, то есть невнимательность разработчиков компилятора!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.11.2011, 21:36
Помогаю со студенческими работами здесь

Мистическая ошибка или баг компилятора?
Есть программа (шахматная), написанная на C++. Больше года все работало корректно, но неожиданно появилась мистическая ошибка. Есть...

баг компилятора, или беда с типами данных?
привет) есть задача, где нужно проверить, равна ли сумма чисел единице... проще простого не правда ли, но вот что у меня получаеться: ...

От чего зависит размер программы? От компилятора или компоновщика?
Просто размер программы - единственное, что меня не устраивает в MinGW. Подумываю написать свой линковщик, если проблема именно в нём.

Напишите задачу на паскале, пожалуйста. Чего-то не догоняю :/
Вводится натуральное число N меньшее, чем некоторое положительное целое M. Определить, является ли число N третьей степенью какого-либо...

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


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru