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
'wewnętrzny kompilator error' To błąd kompilatora. – bolov
Na Clang it [działa jak wcięty] (http://melpon.org/wandbox/permlink/lTOF7QxfICP6sW0l). –