2016-02-26 19 views
6

Niedawno natknąłem się na interesujące dziwactwo GCC, używając ogólnego lambdasa (funkcja C++ 14, która umożliwia użycie auto jako parametru lambda). Wydaje się, że użycie opcji auto zamiast typu wpływa w jakiś sposób na przechwytywanie "tego" wskaźnika. Odtworzyłem problem w następującym przykładzie:Dziwne zachowanie kompilatora z ogólną lambda w C++ 14

#include <cstdio> 

class A { private: 
    void method(int i) { 
     printf("Method Call %d",i); 
    } 

public: 
    void publicMethod() { 
     auto lambda = [&] (const int k) { //problematic line 
      method(k);     //problematic line 
     }; 
     lambda(42); 
    } }; 

int main() { 
    A a; 
    a.publicMethod(); 
    return 0; } 

Kod powyżej działa. Kiedy zmiana „problematycznych” do linii:

 auto lambda = [&] (const auto k) { //problematic line 
      method(k);      //problematic line 

To nie kompilacji już jednak dodając „to” wskaźnik:

 auto lambda = [&] (const auto k) { //problematic line 
      this->method(k);    //problematic line 

Rozwiązuje problem. Moje pytanie brzmi: czy istnieje jakiś racjonalny powód takiego zachowania? A może jest to irracjonalne dziwactwo GCC (i być może powinno zostać zgłoszone)?

Oto wyjście z kompilatora na skrzynce z wykorzystaniem auto bez this

test.cpp: In lambda function: 
test.cpp:12:13: internal compiler error: Segmentation fault 
      method(k); 
      ^
0x848ecc crash_signal 
    ../../src/gcc/toplev.c:383 
0xea28e5 size_binop_loc(unsigned int, tree_code, tree_node*, tree_node*) 
    ../../src/gcc/fold-const.c:1768 
0xee86d7 gimplify_compound_lval 
    ../../src/gcc/gimplify.c:2039 
0xee86d7 gimplify_expr(tree_node**, gimple_statement_base**, gimple_statement_base**, bool (*)(tree_node*), int) 
    ../../src/gcc/gimplify.c:8052 
0xeeb639 gimplify_arg(tree_node**, gimple_statement_base**, unsigned int) 
    ../../src/gcc/gimplify.c:2271 
0xeeb639 gimplify_call_expr 
    ../../src/gcc/gimplify.c:2477 
0xee89f2 gimplify_expr(tree_node**, gimple_statement_base**, gimple_statement_base**, bool (*)(tree_node*), int) 
    ../../src/gcc/gimplify.c:8071 
0xee8da7 gimplify_stmt(tree_node**, gimple_statement_base**) 
    ../../src/gcc/gimplify.c:5519 
0xee8da7 gimplify_cleanup_point_expr 
    ../../src/gcc/gimplify.c:5295 
0xee8da7 gimplify_expr(tree_node**, gimple_statement_base**, gimple_statement_base**, bool (*)(tree_node*), int) 
    ../../src/gcc/gimplify.c:8463 
0xee7ace gimplify_stmt(tree_node**, gimple_statement_base**) 
    ../../src/gcc/gimplify.c:5519 
0xee94db gimplify_bind_expr 
    ../../src/gcc/gimplify.c:1136 
0xee94db gimplify_expr(tree_node**, gimple_statement_base**, gimple_statement_base**, bool (*)(tree_node*), int) 
    ../../src/gcc/gimplify.c:8297 
0xee757f gimplify_stmt(tree_node**, gimple_statement_base**) 
    ../../src/gcc/gimplify.c:5519 
0xee757f gimplify_body(tree_node*, bool) 
    ../../src/gcc/gimplify.c:9234 
0xee72fd gimplify_function_tree(tree_node*) 
    ../../src/gcc/gimplify.c:9388 
0xe195e0 cgraph_node::analyze() 
    ../../src/gcc/cgraphunit.c:634 
0xe195e0 analyze_functions 
    ../../src/gcc/cgraphunit.c:1024 
0x127d1ab symbol_table::finalize_compilation_unit() 
    ../../src/gcc/cgraphunit.c:2453 
0xd37db5 cp_write_global_declarations() 
    ../../src/gcc/cp/decl2.c:4843 
Please submit a full bug report, 
with preprocessed source if appropriate. 
Please include the complete backtrace with any bug report. 
See <file:///usr/share/doc/gcc-5/README.Bugs> for instructions. 

skompilowana z GCC 5.3.1

+12

'wewnętrzny kompilator error' To błąd kompilatora. – bolov

+0

Na Clang it [działa jak wcięty] (http://melpon.org/wandbox/permlink/lTOF7QxfICP6sW0l). –

Odpowiedz