簡體   English   中英

這個lambda捕獲問題是一個gcc編譯器錯誤嗎?

[英]Is this lambda capture issue a gcc compiler bug?

最低工作示例:

#include <iostream>
#include <memory>
#include <string>

int main()
{
    std::shared_ptr<std::string> i = std::make_shared<std::string>("foo");

    auto f = [=]()
        {
            i.reset();
            std::cout << i.get() << "\n";
        };

    std::cout << i.use_count() << "\n";
    f();
    std::cout << i.use_count() << "\n";
}

編譯錯誤:

$ g++ -std=c++11 /tmp/foo.cpp 
/tmp/foo.cpp: In lambda function:
/tmp/foo.cpp:11:12: error: passing ‘const std::shared_ptr<std::basic_string<char> >’ as ‘this’ argument of ‘void std::__shared_ptr<_Tp, _Lp>::reset() [with _Tp = std::basic_string<char>; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’ discards qualifiers [-fpermissive]
    i.reset();

我相信i應該被捕獲為一個值,但它似乎被捕獲為一個const值。

編譯器版本:

g++ (GCC) 4.9.2 20141101 (Red Hat 4.9.2-1)

shared_ptr是閉包對象的成員。 operator()標記為const
因此,您不能修改i ,即調用非const成員函數,如reset

嘗試

auto f = [=]() mutable
{
    i.reset();
    std::cout << i.get() << "\n";
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM