В С++ 11 (cppreference.com):
[&] фиксирует все автоматические переменные, используемые в теле лямбда по ссылке и текущему объекту по ссылке, если существует
А также...
[a, & b], где a захватывается копией и b захватывается ссылкой
Поэтому мой вопрос: если у нас есть класс, такой как (ВЕРСИЯ А):
class Foo
{
public:
void test()
{
auto y = [&](){ return x; }(); // Line 6
}
int x;
};
В строке 6 мы успешно фиксируем переменную-член x
используя спецификатор захвата "все автоматические переменные по ссылке".
Или мы можем написать (ВЕРСИЯ B):
{
int& x = this->x;
auto y = [&x](){ return x; }();
}
Но следующее не компилируется (VERSION C):
{
auto y = [&x](){ return x; }();
}
Это связано с тем, что x
не существует как имя в охватывающей области.
Это также не компилируется (VERSION D):
{
auto y = [&this](){ return x; }();
}
Это связано с тем, что this
невозможно зафиксировать по ссылке.
Итак, мой вопрос: почему работает VERSION A, а не VERSION C или VERSION D? Я понимаю, почему VERSION C и D не работают, но я не понимаю, почему работает A.
Если мы не можем зафиксировать this
по ссылке, и мы не сможем захватить переменные, не входящие в родительскую область, как x
записывается в VERSION A?
Интуитивно, согласно правилам захвата, VERSION B - единственная версия, которую я ожидал бы работать.