2016-09-09 6 views
5

यह नहीं पता कि इसे बेहतर तरीके से कैसे वर्णन किया जाए। कोड यहाँ है। यह जीसीसी 4.9.2 (डेबियन 8.5) पर कंपाइलर में विफल रहता है, मुझे लगता है कि यह पिछले संस्करण में संकलित है। समस्या तब होती है जब मैं बाद में घोषित संरचना के सदस्य को लैम्ब्डा सेटअप में डिफ़ॉल्ट तर्क के रूप में एक्सेस करता हूं। अन्य दिखाए गए मामले काम करते हैं।लैम्ब्डा सेटअप में दो-चरण घोषित सदस्य तक पहुंच

// Test program 
class C1 
{ 
private: 
    // Forward-declared 
    struct S_Private; 
    S_Private* d_; 

public: 
    void func(); 
}; 

struct C1::S_Private 
{ 
    int a; 
}; 

void C1::func() 
{ 
    // This will work 
    int test = d_->a; 

    // Accessing the d_->a as a default argument in lambda setup 
    // will NOT work: 
    // error: invalid use of non-static data member ‘C1::d_’ 
    auto some_lambda = [&](int arg = d_->a) 
    { 
     // This will also work 
     int test2 = d_->a; 
    }; 
} 

int main(void) 
{ 
} 

उत्तर

4

दुर्भाग्य auto some_lambda = [&](int arg = d_->a) में, d_->a नहीं d_->a आप समारोह में पहले प्रयोग किया जाता है, लेकिन इसके बजाय d_->athis कि आप [&] का उपयोग कर कब्जा कर लिया पर बुलाया जा रहा है। चूंकि यह एक सदस्य चर है, इसलिए आप इसे फ़ंक्शन में डिफ़ॉल्ट तर्क के रूप में उपयोग नहीं कर सकते हैं।

मूलतः

auto some_lambda = [&](int arg = d_->a) 
{ 
    // This will also work 
    int test2 = d_->a; 
}; 

struct some_unique_name 
{ 
    some_unique_name(C1*& var) : this_(var) {} 
    auto operator()(int arg = this_->d_->a) 
    { 
     // This will also work 
     int test2 = d_->a; 
    } 
    C1*& this_; 
}; 

auto some_lambda = some_unique_name{this}; 

है आप अनुवाद यह वर्ग के सदस्य, नहीं वर्ग अपने आप में वस्तु का उपयोग करता है से देख सकते हैं।

+0

'd_' कैप्चर नहीं किया गया है। 'यह' है। – aschepler

+0

@aschepler अच्छी कॉल। मुझे लगता है कि यह अब बेहतर हो रहा है कि क्या हो रहा है। – NathanOliver

संबंधित मुद्दे