Я не уверен в возможной ошибке GCC при инициализации std::function
с помощью функции лямбда-функции, регистрирующей this
в инициализаторе нестатических данных. Это разрешено стандартом C++ или это UB?Ошибка сегментации для лямбда-функции в инициализаторе нестатического элемента данных
Учитывая следующий код:
#include <functional>
#include <iostream>
template <typename T>
struct A {
T x = 0;
std::function<void(T)> f = [this](T v) { x = v; };
};
int main() {
A<int> a;
a.f(1);
std::cout << a.x << "\n";
}
В моем понимании, он должен напечатать 1
. Однако при построении с помощью GCC 5.4.0 или GCC 6.2.0, a.f(1)
испускает ошибку сегментации, потому что захваченный указатель this
имеет значение NULL.
Следующие варианты работают, как я ожидал:
Использование списка конструктор инициализатора:
template <typename T> struct B { B() : f([this](T v) { x = v; }) {} T x = 0; std::function<void(T)> f; };
Без шаблона:
struct C { int x = 0; std::function<void(int)> f = [this](int v) { x = v; }; };
Кроме того, когда построен с лязг 3.8.0, все три версии ведут себя так, как я ожидаю, что не означает, что это не UB.
Я склоняюсь к ошибке GCC: 'this' не должен * никогда * быть нулевым. – Quentin
Мне интересно, что VS2015 делает :) Может кто-нибудь проверить пожалуйста? – Rakete1111
@ Rakete1111 Работы по обновлению MSVS 2015 3. – NathanOliver