Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Использование -> вместо . - почему компилятор пропускает этот случай?

24.02.2019, 10:33. Показов 2784. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
    node_t(const node_t<T>& target)
    {
        init(target->value, target->ptr_next);
    }
Почему использование -> позволяется? Разве не должна быть ошибка компиляции и требоваться . вместо ->? Что также сбивает с толку - анализатор кода реагирует без проблем на оба случая - показывая члены node_t.
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2019, 10:33
Ответы с готовыми решениями:

Почему компилятор жалуется на неправильное использование оператора ?:
Query = &quot;INSERT INTO Transport (IsIn) VALUES('&quot; + Convert.ToBoolean(this.IsInCheckBox.IsChecked) ? '1' : '0'; +&quot;') Пользуюсь ?: так...

Почему компилятор ругается на использование шаблона (template)?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;chrono&gt; #include &lt;ctime&gt; #include &lt;thread&gt; #include...

Компилятор пропускает getline
добрый вечер, пишу лабу для 10 класса по переводу числа из одной СС в другую. По неведомой мне причине компилятор пропускает строчку с...

26
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
24.02.2019, 10:40
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Почему использование -> позволяется?
Из-за шаблона, компилятор не знает что ему будет передано, поэтому он игнорирует такие вещи
2
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.02.2019, 10:40
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Использование -> вместо . - почему компилятор пропускает этот случай?
интересный вопрос
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
24.02.2019, 10:42  [ТС]
Avaddon74, это можно считать багом компилятора? Или это так и надо? Но, кстати говоря, ему же известно, что передаётся ссылка, а не указатель.
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
24.02.2019, 10:45
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Или это так и надо?
Так надо Как на этапе компиляции можно знать, какой вид будет передан в метод? нет, конечно в некоторых случаях можно, но это будет сложная логика для компилятора и чревата ошибками, поэтому, наверно, от этого и избавились, шаблонные функции проверяются меньше на подобного рода ошибки
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.02.2019, 10:47
Цитата Сообщение от _stanislav Посмотреть сообщение
интересный вопрос
Он мне напомнил про другой вопрос Обращение к static полю
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
24.02.2019, 10:49  [ТС]
Avaddon74, но если даже это не проверяется компилятором, почему программа не падает во время выполнения как неверная?

Добавлено через 47 секунд
_stanislav, очень на баг Ваш вопрос напоминает.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
24.02.2019, 10:49
Ниже в коде может быть специализация класса с перегруженным оператором ->.
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
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
template <class T>
class node_t {
public:
    node_t() = default;
 
    node_t(const node_t<T>& target) {
        std::cout << target->value << "\n";
    }
 
private:
    T value = T();
};
 
// Для появления ошибки компиляции - убрать специализацию
#if 1
 
template <>
class node_t<float> {
public:
    node_t<float>& operator->() { return *this; }
 
private:
    float value;
};
 
#endif
 
int main() {
    node_t<int> n1; // Конструктор копирования не используется, нет ошибки
    
    node_t<float> n2;
    node_t<float> n3(n2); // Нет ошибки, если есть специализация.
}
1
24.02.2019, 10:55

Не по теме:

Соколиный глаз, Я смотрю у вас в статусе преписка C#, вы с шарпов переходите на ++?
P.S. я просто подумываю изучить шарп, вот и думаю стоит ли игра свеч? почему решили перейти на плюсы?

0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
24.02.2019, 11:00  [ТС]
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Я смотрю у вас в статусе преписка C#, вы с шарпов переходите на ++
Мой основной язык - C#. А C++ я хочу уверенно знать, чтобы быть универсалом и было легче в университете. Да и
подчерпнуть что-нибудь для себя из C++ хочу, чтобы лучше в программировании как таковом разбираться. Вообще, на мой взгляд, хорошо знать языки, которые имеют разные принципы построения программ. Кругозор развивается. Я бы Вам еще посоветовал Python.
Цитата Сообщение от Avaddon74 Посмотреть сообщение
я просто подумываю изучить шарп, вот и думаю стоит ли игра свеч?
Смотря для каких целей. Хотите использовать WPF, Windows Forms - C# - для Вас. Лично я скажу, что - стоит. Язык хороший.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
24.02.2019, 11:11
Выше я привел некорректный пример. При наличии специализации конструктор копирования все равно не вызывается.

Проще:
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
25
26
27
#include <iostream>
 
template <class T>
struct node_t {
    T value = T();
};
 
template <>
struct node_t<float> {
    const node_t<float>* operator->() const { return this; }
 
    float value = 42;
};
 
template <class T>
void f(const node_t<T>& target) {
    std::cout << target->value << "\n";
}
 
int main() {
    node_t<int> n1;
    node_t<float> n2;
    
    // Ошибка будет только в случае инстанцирования f для int.
    //f(n1);
    f(n2);
}
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.02.2019, 12:49

Не по теме:

Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Вообще, на мой взгляд, хорошо знать языки, которые имеют разные принципы построения программ.
ассемблер из тебя сделает гуру

0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.02.2019, 13:00
Если я правильно понимаю ситуацию

В языке Си изначально были разные операторы для обращения к полям структуры через экземпляр и через указатель (точка и стрелка соответственно). Синтаксически это было избыточно, но по каким-то причинам афторы Си на это пошли. Всё это унаследовалось в Си++. А в конечном итоге изначально кривое проектирование синтаксиса языка Си начало приводить к тому, что это усложнило людям жизнь при написании шаблонов. Скорее всего из-за этого афторы Си++ пошли на то, чтобы конкретно в этом месте игнорировать изначальное уродство синтаксиса

Могу и путать, но по-моему в джаве нет оператора стрелка, т.е. они изначально не стали добавлять в язык такую избыточность. Возможно, и в других языках тоже
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.02.2019, 13:10
Цитата Сообщение от Evg Посмотреть сообщение
Синтаксически это было избыточно, но по каким-то причинам афторы Си на это пошли.
заинтриговал, по каким причинам они на это пошли
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.02.2019, 13:26
Цитата Сообщение от _stanislav Посмотреть сообщение
заинтриговал, по каким причинам они на это пошли
А хз... То, как есть сейчас, формально более корректно. Обращение к полю от экземпляра и от указателя - это немного разные операции в плане построения машинного кода. Язык Си проектировался как высокоуровневый ассемблер или что-то типа того
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.02.2019, 13:46
Цитата Сообщение от Evg Посмотреть сообщение
То, как есть сейчас, формально более корректно. Обращение к полю от экземпляра и от указателя - это немного разные операции в плане построения машинного кода.
я думаю еще что это выглядит, более выразительно.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
24.02.2019, 15:35
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Почему использование -> позволяется?
Если это компилируется без ошибок, значит для
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
node_t<T>
Определен operator->()

Пример:

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
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
 
struct data
{
    int value = 333;
    
    data* ptr_next = {};
};
 
template <class T>
class node_t 
{
    template<class U>
        void init(U& value, T*)
    { std::cout << "init(): " << value << '\n'; }
    
public:
    node_t():value(){}
    
    node_t(const node_t<T>& target)
        :value()
    { init(target->value, target->ptr_next); }    
    
    const T* operator->() const { return &value; }    
    T* operator->() { return &value; }
private:
    T value;
};
 
int main()
{
    node_t<data> data1;
    
    node_t<data> data2 = data1;
    
    (void)data2;
}
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.02.2019, 15:47
Цитата Сообщение от _stanislav Посмотреть сообщение
я думаю еще что это выглядит, более выразительно
Но здесь аналогичной выразительности почему-то нет:

C
int a[10];
int *b;
a[3] = b[3];
Т.е. в плане выразительности какой-то несимметричный подход к структурам и массивам. На всякий случай: откуда растёт несимметрия - я прекрасно понимаю. Речь не о том, как это работает постфактум, а о том, почему афторы языка сделали именно так. А теперь по сути дела занимаются борьбой с собственной концепцией, аналогично тому, как это делается тут Зачем нужен std::launder?

При таком развитии ситуации не исключено, что C++44 будет совсем не похожим по синтаксису на Си
2
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
24.02.2019, 18:31
Цитата Сообщение от Evg Посмотреть сообщение
Синтаксически это было избыточно
Долой избыточность! Всем использовать if и goto вместо циклов!
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
24.02.2019, 18:40
Лучший ответ Сообщение было отмечено Evg как решение

Решение

Цитата Сообщение от Evg Посмотреть сообщение
Синтаксически это было избыточно, но по каким-то причинам афторы Си на это пошли.
Изначально в C эти операторы должны были иметь различное назначение.
Подробнее: https://stackoverflow.com/ques... in-c-exist

Ну а в C++ впоследствии стало возможным перегружать ->
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.02.2019, 18:40
Помогаю со студенческими работами здесь

Компилятор пропускает цикл
Здравствуйте, в общем думаю однажды, когда нибудь, у всех такая проблема возникала. В общем в отладчике искал проблему и когда...

Компилятор пропускает цикл
Здравствуйте товарищи. Столкнулся с проблемой, что компилятор пропускает цикл. Компилировал в VS2012. Потом сменил её на MinGW. Всё...

Компилятор пропускает строчки с инициализацией
здравствуйте! Копмилятор пропускает строчки с инициализацией переменных. При попытке поставить маркер, переносит этот маркер на строчку...

Компилятор пропускает две строчки
Здравствуйте! Вкратце о задании: нужно создать структуру, с помощью которой будет вводится информация о товаре. Два элемента структуры...

Компилятор пропускает строки кода
Начал писать морской бой но сталкнулся со сложность что компилятор пропускает строчки кода.Я начинающий програмист на c++. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru