在模板化类和非模板化类中的lambda属性中捕获它

时间:2015-02-15 22:57:11

标签: c++ templates c++11 lambda gcc4.9

我已经成功编写了一个像这样的类,在一个被定义为所述类的非静态属性的lambda中捕获它:

#include <memory>
#include <iostream>
#include <functional>

struct S
{
  S()
  {
    std::cout << "S::S()[" << this << "]" << std::endl;
  }

  std::string y_{"hi mate"};
  int x_;
  std::function<void(int*)> del_{[this](int *ptr)
  {
    std::cout << "Deleting ptr[" << ptr << "] this[" << this << "] this->y_[" << this->y_ << "]" << std::endl;
  }};
  std::unique_ptr<decltype(x_), decltype(del_)> unique_{&x_, del_};
};

int main()
{
  S s;
}

这编译并且似乎运行得很好。

然而,对于模板化课程,它不再起作用了:

#include <memory>
#include <iostream>
#include <functional>

template <typename>
struct S
{
  S()
  {
    std::cout << "S::S()[" << this << "]" << std::endl;
  }

  std::string y_{"hi mate"};
  int x_;
  std::function<void(int*)> del_{[this](int *ptr)
  {
    std::cout << "Deleting ptr[" << ptr << "] this[" << this << "] this->y_[" << this->y_ << "]" << std::endl;
  }};
  std::unique_ptr<decltype(x_), decltype(del_)> unique_{&x_, del_};
};

int main()
{
  S<int> s;
}
  

$&GT; g ++ -std = c ++ 1y custom_deleter_template.cpp
  〜/ test custom_deleter_template.cpp:在'struct的实例化中   S ::':custom_deleter_template.cpp:9:3:必需   来自'S&lt; &gt; :: S()[with    'int]'custom_deleter_template.cpp:24:10:
  从这里需要custom_deleter_template.cpp:15:35:内部   编译错误:在tsubst_copy中,在cp / pt.c:12569
  std :: function del _ {[this](int * ptr)                                      ^如果合适,请提交完整的错误报告,并提供预处理的来源。看到    作为指示。   请将预处理的源存储到/tmp/pyro/ccxfNspM.out文件中   将此附加到您的bug报告。

在提交bug报告之前(我无法做到,他们阻止了帐户创建),根据标准的说法,它是否正常编译?

编译器是g ++(Ubuntu 4.9.2-0ubuntu1~14.04)4.9.2,使用标志-std = c ++ 1y。标志-std = c ++ 11也会发生同样的事情。

1 个答案:

答案 0 :(得分:0)

这确实是GCC中的一个错误,已经是being tracked

似乎影响4.8和4.9。正如评论中指出的那样,这个特殊的例子适用于4.7和5.0。您可以自己here查看并使用不同版本的gcc。

然而,这个没有外部依赖的代码缩减版仍然会崩溃5.0:

template <typename>
struct S {
  int f{[this](){return 42;}()};
};

int main(){
    return S<int>{}.f; //  should return 42
}

我建议您在使用代码之前等待我引用的错误,或者切换到另一个编译器;)。