2016-10-18 70 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使用lambda VS鐺

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

在命名空間範圍point_of_cone定義工作正常都。

[this] lambda捕獲稍作修改的定義對全局或本地範圍都適用。

哪個編譯器是正確的?

+0

在您的問題中發佈代碼,請 – xaxxon

+0

@Orient不,我指的是xaxxon的godbolt鏈接,他設置了錯誤的標誌。 – Columbo

+0

嗯,問題是'[&]'捕獲'這個'。不確定新標準,但答案在這裏不建議:http://stackoverflow.com/questions/16323032/why-cant-i-capture-this-by-reference-this-in-lambda – Hayt

回答

11

這是一個海灣合作委員會的錯誤。

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

這種失敗,但如果我們...

  • 變化&this,或
  • 聲明A具有命名空間範圍,

它的工作原理。不過,這兩者都不應該對格式良好有任何影響。

已報告:#78019

+0

如果這是我最近幾次徘徊的同一個錯誤,那麼另一個解決方法就是明確地說'this->'。 – Griwes

+2

@Griwes您是否可以使用對偶來推斷這不是您所徘徊的錯誤? :-) – Columbo