В чём смысл запрета захвата членов класса в списке захвата?
Пусть 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 |
| |
Здравствуйте, 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
Здравствуйте, 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; };
?
Здравствуйте, B0FEE664, Вы писали:
BFE>А в следующем стандарте запись сократят и разрешат писать так:
BFE>BFE> auto fn = [&m_n](int n){ m_n = n; };
BFE>
BFE>?
не слышал о такой прорывной фиче в стандарте
Здравствуйте, 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.