2016-10-18 16 views
18
#include <cassert> 
#include <cmath> 

int main() 
{ 
    struct point_of_cone 
    { 
     double x, y; 
     double z = [&] { using std::sqrt; return sqrt(x * x + y * y); }(); 
    }; 
    point_of_cone p = {3.0, 4.0}; 
    assert(p.z == 5.0); 
} 

отлично работает для clang++ из ствола, но g++ из ствола терпит неудачу с сообщением об ошибке (link):Использования лямбды в инициализаторе по умолчанию GCC против лязга

error: 'this' was not captured for this lambda function

Определение point_of_cone в области видимости пространства имен отлично работает для и то и другое.

Немного измененное определение с [this] лямбда-захват отлично работает и для обоих, либо в глобальном, либо в локальном масштабе.

Какой компилятор прав?

+0

отправьте этот код в свой вопрос, пожалуйста – xaxxon

+0

@Orient Нет, я имел в виду ссылку godbolt xaxxon, где он установил неверный флаг. – Columbo

+0

Хмм, вопрос должен быть '[&]' capture' this'. Не уверены в новых стандартах, но ответ здесь не предполагает: http://stackoverflow.com/questions/16323032/why-cant-i-capture-this-by-reference-this-in-lambda – Hayt

ответ

11

Это ошибка gcc.

int main() { 
    struct A { 
     int x, i = [&] { return x; }(); 
    } a{0}; 
} 

Это не удается, но если мы ...

  • изменение & к this или
  • объявить A как имеющий область пространства имен,

это работает. Однако ни одно из них не должно влиять на правильную формульность.

Отмечено: #78019.

+0

Если это тот же самый баг, я недавно бродил по нескольким причинам, тогда еще один обходной путь для него - явно сказать «this->». – Griwes

+2

@Griwes Не могли бы вы использовать contrapositive, чтобы вывести, что это не ошибка, в которую вы бродили? :-) – Columbo