
olologin
18.10.2018
16:17:44
ну всмысле не санитайзер, но ты понял

Alexander
18.10.2018
16:18:45

Denis
18.10.2018
16:25:28
https://godbolt.org/z/JcPI21 вот такой код почему то не собирается относительно свежим гцц (7.х). Это ведь валидное использование и в гцц просто баг был или такой юзинг и правда кривоват и остальные компилеры это правильно разруливают только потому что так выглядит логично?

Google

J
18.10.2018
16:33:11
Привет всем! Дайте, пожалуйста, рабочий пример записи в реестр Windows, а то даже не знаю, в чем проблема, гуглил, толку 0

Matwey
18.10.2018
16:33:38
https://wandbox.org/permlink/1GqYxNMw37cZLTma
Господа, а почему так?

J
18.10.2018
16:34:38
и кстати, в чем может быть проблема, в реестр вроде пишется, но после перезагрузки там пусто. На C# все ок было, пробовал запускать на двух компах
вот гемор с плюсами

Alexen
18.10.2018
16:38:26

Constantine
18.10.2018
16:39:49

Alexen
18.10.2018
16:40:14

Constantine
18.10.2018
16:40:50

Alexen
18.10.2018
16:41:12
потому что так работают правила

Constantine
18.10.2018
16:41:13
т.е. я понимаю, что
using A::g;
но зачем - не понимаю

Alexen
18.10.2018
16:41:38
а как он тебе скажет что его а что не его?

Constantine
18.10.2018
16:41:51
в смысле?

Google

Denis
18.10.2018
16:42:09
сигнатура же разная?

Alexen
18.10.2018
16:42:12
в прямом - у тебя скоуп перегрузки текущий блок видимости

Ioann V
18.10.2018
16:42:23
а перекрытием или замещением

Alexen
18.10.2018
16:43:00
перекрытие это для одинаковых имён и одинаковых сигнатур
а для разных сигнатур и одинаковых имён именно перегрузка
если для g(int) есть видимость в текущем блоке, то для g() нет и компилятор не знает как ему дальше быть

Constantine
18.10.2018
16:44:35

Alexen
18.10.2018
16:45:10
потому что разрешение этого случая будет в первом месте совпадения имён
сначала имена, потом сигнатуры

Constantine
18.10.2018
16:46:06
почему это не только для конструкторов и операторов правило?
что во вселенной сломается, если сделать using A::g автоматически в этом случае, g не является именем конструктора или оператора?

Nikita
18.10.2018
16:47:42
Добрый вечер всем. Ищу программиста который сделает мое домашнее задание, не за бесплатно

Alexen
18.10.2018
16:47:58

Constantine
18.10.2018
16:48:12
текущая версия совершенно парадоксальна

Alexen
18.10.2018
16:49:10
конструктор это такая же функция, только вызывается она не вами, также как и оператор

Constantine
18.10.2018
16:49:31
в C++ отсутствует non-polymorphic reference

Google

Alexen
18.10.2018
16:49:57
она логична, так как это единственный способ делать поиск достижимым или нет

Constantine
18.10.2018
16:50:18
требуемое поведение есть добавление разрешенной конструкции языка

Alexen
18.10.2018
16:51:03
а почему это должно быть неявным?
это уже будет не С++

Constantine
18.10.2018
16:51:21

Alexen
18.10.2018
16:51:33
потому что это другой блок видимости
и другой блок поиска перегрузки

Александр
18.10.2018
16:53:48

Constantine
18.10.2018
16:55:13
Это как раз отсутствие non-polymorphic references
потому что это другой блок видимости
хм... я не понимаю этот момент
class A {
public:
virtual void g(int x) {}
inline void g() {g(1);}
};
class C: public A{
public:
};
int main(){
void (C::*x)() = &C::g; //ok
}

Alexen
18.10.2018
16:57:57
ну
в этом блоке нет, ищем имя в другом

Constantine
18.10.2018
16:58:12
ну
ваш name lookup противоречит составу класса

Alexen
18.10.2018
16:58:26
с чего это?

Yevhen Novytskyi
18.10.2018
16:58:30
Кто-то инжектил dll в процесс через CreateRemoteThread?

Александр
18.10.2018
16:58:31

Constantine
18.10.2018
16:58:49
с чего это?
с того, что у класса есть функция, которую name lookup не находит по вашему правилу

Google

Alexen
18.10.2018
16:59:04
почему нет?

Constantine
18.10.2018
16:59:20
потому что это... странно?

Alexen
18.10.2018
16:59:31
нет, это обычное поведение

Constantine
18.10.2018
16:59:53

Alexen
18.10.2018
17:00:05
её нет в C

Constantine
18.10.2018
17:00:12
она есть в С

Alexen
18.10.2018
17:00:13
она есть в A

Constantine
18.10.2018
17:00:15
я вам пример привел

Alexen
18.10.2018
17:00:28
вы сами понимаете как он работает?

Constantine
18.10.2018
17:00:33
а вы?

Alexen
18.10.2018
17:00:39
я понимаю

Constantine
18.10.2018
17:00:55
вы понимаете, что в этом месте точный тип функции?

Alexen
18.10.2018
17:00:57
можете посмотреть дисасемблер и убедиться в этом
да, и он берётся из A

Constantine
18.10.2018
17:01:25
дизассемблер не входит в стандарт и не часть его логики

Alexen
18.10.2018
17:01:46
зато в нём хорошо видно ошибку в вашей логике рассуждений
@webreh https://godbolt.org/z/oxygv4

Constantine
18.10.2018
17:03:37

Alexen
18.10.2018
17:03:51
иии?
где я говорил что так не будет?

Google

Alexen
18.10.2018
17:04:19
и ещё раз - сначала имя потом сигнатура

Constantine
18.10.2018
17:07:39
иии?
так, подождите, я понял, что не понимаю как это работает

Alexen
18.10.2018
17:08:18
там ещё куча есть приколов про область видимости
очень хорошо объясняется у автора ещё в третьем издании

Александр
18.10.2018
17:09:41

Constantine
18.10.2018
17:10:50

Alexen
18.10.2018
17:11:30

Constantine
18.10.2018
17:11:54

Alexen
18.10.2018
17:12:11
потому что так изначально сделали, ничего более

Constantine
18.10.2018
17:12:20
а вот что member function pointer это на самом деле пара для меня открытие

Alexen
18.10.2018
17:12:54
ну так я вот на С++ уже пять лет пишу и каждый день новое открытие

Constantine
18.10.2018
17:13:29
я больше ;)

Alexen
18.10.2018
17:14:11
сегодня узнал что полная специализация в шаблонах класса вложенных в класс не работает для гцц вообще

Constantine
18.10.2018
17:14:30
почему не инстанцируется перевызов? зачем пара?

Alexen
18.10.2018
17:14:36
то есть он даже не может такое собрать

Constantine
18.10.2018
17:16:03

Alexen
18.10.2018
17:16:40
я к сожалению не очень в части компиляторов чтобы наверняка ответить на это правильно

Constantine
18.10.2018
17:20:51
https://godbolt.org/z/UXmAp7
ой какая красота
что-то не могу придумать, как легко проверить, что будет

Alexen
18.10.2018
17:23:40
какой ужас