доступ из лямбды к члену класса
От: B0FEE664  
Дата: 13.01.16 14:59
Оценка: +1
В чём смысл запрета захвата членов класса в списке захвата?

Пусть m_n — член класса, а fn определяется внутри метода этого класса.
Почему тогда так можно:
  auto fn = [&m_n = m_n](int n){ m_n = n; };  //ok

а так нельзя:
  auto fn = [&m_n](int n){ m_n = n; };  //error


  пример
#include <iostream>
class A
{
    public:
        void f(int n)
        {
            //auto fn = [&rN = m_n](int n){ rN = n; };  //ok
            //auto fn = [&m_n](int n){ m_n = n; };      //error
            auto fn = [&m_n = m_n](int n){ m_n = n; };  //ok
            fn(n);
        }
      int m_n;
};


int main()
{
    A a;
    
    a.f(1);
    std::cout << a.m_n << std::endl;
    
    return 0;
}


http://ideone.com/z0YB6c
И каждый день — без права на ошибку...
Re: доступ из лямбды к члену класса
От: Alexander G Украина  
Дата: 13.01.16 18:44
Оценка: 5 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE>В чём смысл запрета захвата членов класса в списке захвата?


так сложилось.

все члены захватываются через захват this.
auto fn = [this](int n){ m_n = n; };  //ok



BFE>Почему тогда так можно:

 auto fn = [&m_n = m_n](int n){ m_n = n; };  //ok


выражения в списке захвата ввели в С++14, тогда как захват переменных и this был введен в C++11
Русский военный корабль идёт ко дну!
Re[2]: доступ из лямбды к члену класса
От: B0FEE664  
Дата: 14.01.16 11:22
Оценка:
Здравствуйте, Alexander G, Вы писали:

BFE>>В чём смысл запрета захвата членов класса в списке захвата?

AG>так сложилось.


AG>все члены захватываются через захват this.

AG>
AG>auto fn = [this](int n){ m_n = n; };  //ok
AG>

Настолько я понимаю, это захват this, а не членов класса, к которым разрешается доступ посредством такого захвата. В любом случае вопрос не о том как доступиться, а почему сделано именно так. Какой смысл получать доступ ко всем членам сразу?

BFE>>Почему тогда так можно:

AG>
AG> auto fn = [&m_n = m_n](int n){ m_n = n; };  //ok
AG>

AG>выражения в списке захвата ввели в С++14, тогда как захват переменных и this был введен в C++11
А в следующем стандарте запись сократят и разрешат писать так:
 auto fn = [&m_n](int n){ m_n = n; };

?
И каждый день — без права на ошибку...
Re[3]: доступ из лямбды к члену класса
От: uzhas Ниоткуда  
Дата: 14.01.16 11:25
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>А в следующем стандарте запись сократят и разрешат писать так:

BFE>
BFE> auto fn = [&m_n](int n){ m_n = n; };  
BFE>

BFE>?

не слышал о такой прорывной фиче в стандарте
Re[3]: доступ из лямбды к члену класса
От: Alexander G Украина  
Дата: 14.01.16 11:50
Оценка: 1 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE>А в следующем стандарте запись сократят и разрешат писать так:

 auto fn = [&m_n](int n){ m_n = n; };

BFE>?

В принципе, возможно.

Саттеру тоже не нравится:
N3424: Lambda Correctness and Usability Issues

он предлагает в документе

(Good) Option 3: Add support for capture of member variables with the obvious semantics.

Русский военный корабль идёт ко дну!
Отредактировано 14.01.2016 11:51 Alexander G . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.