Size: a a a

2020 November 07

K

K👑G in pro.cxx
Не бесплатно конечно же!
источник

K

K👑G in pro.cxx
Темы которые мы прошли: циклы, массивы, двумерные массивы, указатели, указатели 2, вектор, функция, рекурсия, структуры, strings
источник

CD

Constantine Drozdov in pro.cxx
K👑G
Всем доброе утро! Хотел спросить кто мне может помочь решит задачи? Я учусь в универе 1 курс, и сейчас через 30 минут у меня будет тест по С++ на английском языке
ну... Б-г в помощь
источник

K

K👑G in pro.cxx
Спасибо большое
источник

K

K👑G in pro.cxx
Если что можно да, я и сюда буду скидывать задачки
источник

K

K👑G in pro.cxx
Если сможете помочь
источник

КП

Крылатый Пегас... in pro.cxx
K👑G
Всем доброе утро! Хотел спросить кто мне может помочь решит задачи? Я учусь в универе 1 курс, и сейчас через 30 минут у меня будет тест по С++ на английском языке
Нет, хватит везде об этом просить -- забаню
источник

КП

Крылатый Пегас... in pro.cxx
K👑G
Если что можно да, я и сюда буду скидывать задачки
Нет
источник

O

Ofee in pro.cxx
Какая из имплементаций права? У всех трёх разное мнение касательно корректности этого кода. MSVC считает, что всё хорошо. GCC не позволяет из тела лямбды вызвать нешаблонный operator(), но позволяет вызвать шаблонный (очевидно, это следствие того, как реализован оператор каста к указателю на функцию). Clang же не позволяет вызвать ни тот, ни другой

>> The type of a lambda-expression (which is also the type of the closure object) is a unique, unnamed non-union class type, called the closure type

>> The closure type for a lambda-expression has a public inline function call operator (for a non-generic lambda) or function call operator template (for a generic lambda)

>> An implementation may define the closure type differently from what is described below provided this does not alter the observable behavior of the program other than by changing
— ...

(
http://eel.is/c++draft/expr.prim.lambda#closure-1 )

Ни в последнем процитированном пункте, ни во всём разделе, я не нашёл никаких исключений, касающихся name lookup для лямбд без захвата, т.е. поиск имён в лямбде должен соответствовать поиску имён внутри  unnamed non-union class type, а значит, можно предположить, что в следующем куске кода поведение при вызове f(3) и l(3) должно быть эквивалентно:

struct /* unnamed */ {
   template<typename Auto>
   constexpr int operator()(Auto n) const {
     if (n <= 1) return 1;
     else return n * operator()(n-1);    
   }
} f;

void foo() {
 constexpr auto l = [](auto n) -> int {
   if (n <= 1) return 1;
   else return n * operator()(n-1);
 };

 static_assert(l(3) == f(3));
};

При этом, кажется, при нешаблонном operator() и GCC, и MSVC оба могут быть правы, допускаю даже, что могут быть правы одновременно. Но я не вижу ни одного аргумента в пользу Clang, который не позволяет вызвать шаблонный operator() вообще


Быть может, у кого-то есть мысли на этот счёт?
источник

AF

Aidar Fattakhov in pro.cxx
Ofee
Какая из имплементаций права? У всех трёх разное мнение касательно корректности этого кода. MSVC считает, что всё хорошо. GCC не позволяет из тела лямбды вызвать нешаблонный operator(), но позволяет вызвать шаблонный (очевидно, это следствие того, как реализован оператор каста к указателю на функцию). Clang же не позволяет вызвать ни тот, ни другой

>> The type of a lambda-expression (which is also the type of the closure object) is a unique, unnamed non-union class type, called the closure type

>> The closure type for a lambda-expression has a public inline function call operator (for a non-generic lambda) or function call operator template (for a generic lambda)

>> An implementation may define the closure type differently from what is described below provided this does not alter the observable behavior of the program other than by changing
— ...

(
http://eel.is/c++draft/expr.prim.lambda#closure-1 )

Ни в последнем процитированном пункте, ни во всём разделе, я не нашёл никаких исключений, касающихся name lookup для лямбд без захвата, т.е. поиск имён в лямбде должен соответствовать поиску имён внутри  unnamed non-union class type, а значит, можно предположить, что в следующем куске кода поведение при вызове f(3) и l(3) должно быть эквивалентно:

struct /* unnamed */ {
   template<typename Auto>
   constexpr int operator()(Auto n) const {
     if (n <= 1) return 1;
     else return n * operator()(n-1);    
   }
} f;

void foo() {
 constexpr auto l = [](auto n) -> int {
   if (n <= 1) return 1;
   else return n * operator()(n-1);
 };

 static_assert(l(3) == f(3));
};

При этом, кажется, при нешаблонном operator() и GCC, и MSVC оба могут быть правы, допускаю даже, что могут быть правы одновременно. Но я не вижу ни одного аргумента в пользу Clang, который не позволяет вызвать шаблонный operator() вообще


Быть может, у кого-то есть мысли на этот счёт?
В приведённых тобой цитатах нет ничего про то как оно должно работать изнутри лямбды
источник

AF

Aidar Fattakhov in pro.cxx
Они про поведение снаружи
источник

AF

Aidar Fattakhov in pro.cxx
В них не написано что этот код перекладывается в оператор как есть так что нужно искать еще
источник

AF

Aidar Fattakhov in pro.cxx
Вообще емнип эти строчки появились только в си++20 а до этого была шутка про деклтайп в лямбдах
источник

O

Ofee in pro.cxx
Aidar Fattakhov
В них не написано что этот код перекладывается в оператор как есть так что нужно искать еще
На самом деле, написано:
The lambda-expression's compound-statement yields the function-body ([dcl.fct.def]) of the function call operator, but for purposes of name lookup, determining the type and value of this and transforming id-expressions referring to non-static class members into class member access expressions using (*this) ([class.mfct.non-static]), the compound-statement is considered in the context of the lambda-expression.

Но этот пункт вместе с примером вызывает ещё больше вопросов, да и относится, похоже, только к лямбде, объявленной внутри функции-члена другого класса

Что же касается лямбды без захвата — я ничего полезного не нашёл
источник

AF

Aidar Fattakhov in pro.cxx
А operator() точно не эквивалентен this->operator()?
источник

AF

Aidar Fattakhov in pro.cxx
Будет забавно если в стандарте как-то так
источник

AF

Aidar Fattakhov in pro.cxx
(Ну нет не должно быть)
источник

O

Ofee in pro.cxx
Aidar Fattakhov
А operator() точно не эквивалентен this->operator()?
В случае, когда лямбда определена в мембер функции другого класса, это действительно так, что подтверждается примером:
[Example 8:
struct S1 {
 int x, y;
 int operator()(int);
 void f() {
   [=]()->int {
     return operator()(this->x + y);   // equivalent to S1​::​operator()(this->x + (*this).y)
                                       // this has type S1*
   };
 }
};
— end example]

Однако, этот пример у меня только больше вопросов вызывает)
источник

AF

Aidar Fattakhov in pro.cxx
Ofee
На самом деле, написано:
The lambda-expression's compound-statement yields the function-body ([dcl.fct.def]) of the function call operator, but for purposes of name lookup, determining the type and value of this and transforming id-expressions referring to non-static class members into class member access expressions using (*this) ([class.mfct.non-static]), the compound-statement is considered in the context of the lambda-expression.

Но этот пункт вместе с примером вызывает ещё больше вопросов, да и относится, похоже, только к лямбде, объявленной внутри функции-члена другого класса

Что же касается лямбды без захвата — я ничего полезного не нашёл
Не очень понятно значение слова yields, это вроде просто типа породить
источник

AF

Aidar Fattakhov in pro.cxx
Ofee
В случае, когда лямбда определена в мембер функции другого класса, это действительно так, что подтверждается примером:
[Example 8:
struct S1 {
 int x, y;
 int operator()(int);
 void f() {
   [=]()->int {
     return operator()(this->x + y);   // equivalent to S1​::​operator()(this->x + (*this).y)
                                       // this has type S1*
   };
 }
};
— end example]

Однако, этот пример у меня только больше вопросов вызывает)
Так у тебя ничего не referring наверное
источник