首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++14中使用泛型lambda的奇怪编译器行为

在C++14中使用泛型lambda的奇怪编译器行为
EN

Stack Overflow用户
提问于 2016-02-26 10:26:35
回答 1查看 147关注 0票数 6

最近,当我使用通用lambda (C++14特性,允许使用auto作为lambda参数)时,我遇到了GCC的一个有趣的怪癖。它似乎使用自动而不是类型,在某种程度上影响“此”指针如何被捕获。我在下面的例子中重现了问题:

代码语言:javascript
复制
#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; }

上面的代码有效。当我将“有问题的行”改为:

代码语言:javascript
复制
        auto lambda = [&] (const auto k) { //problematic line
            method(k);                     //problematic line

它不再编译了,但是添加了“这个”指针:

代码语言:javascript
复制
        auto lambda = [&] (const auto k) { //problematic line
            this->method(k);               //problematic line

解决这个问题。我的问题是:这种行为有什么合理的理由吗?或者是GCC的非理性怪癖(也许应该被报道)?

下面是编译器在不使用auto而不使用this的情况下的输出

代码语言:javascript
复制
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.

用GCC 5.3.1编制

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-26 13:36:19

谢谢你的评论。的确,这是GCC的错误--我的同事刚刚把这件事报告给GCC支持:

bug.cgi?id=69977

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35649211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档