【问题标题】:why do I get a 'returning address of local temporary' warning with std::bind()?为什么我会收到带有 std::bind() 的“本地临时返回地址”警告?
【发布时间】:2013-11-21 12:24:06
【问题描述】:

我正在尝试使用标准代码 (Josuttis) 将树的键绑定到函数, 但是 Visual Studio 2010 会发出警告(当我运行它时会崩溃):

.../functional(447): 警告 C4172: 返回本地临时地址

代码是:

void print(int x) { ... }

using namespace std;

map<int, float>  m;
for_each(m.begin(), m.end(), 
         bind( print,
               bind( &map<int,float>::value_type::first, placeholders::_1) ) );

这段代码似乎在其他编译器中运行良好。

在windows的bind实现中是否有任何隐藏的东西会导致这个错误?

【问题讨论】:

  • lambda 可能更简单:[](map&lt;int,float&gt;::value_type pair){print(pair.first);}
  • vs2012 说错误 C2780: 'enable_if::value,std::_Bind,_Vx0_t,_Vx1_t,_Vx2_t,_Vx3_t,_Vx4_t>>::type std::bind( _Rx (__thiscall _Farg0::* const )(_V0_t,_V1_t,_V2_t,_V3_t,_V4_t) volatile const,_Vx0_t &&,_Vx1_t &&,_Vx2_t &&,_Vx3_t &&,_Vx4_t &&)':需要 6 个参数 - 提供了 2 个。您还使用了哪些其他编译器?
  • @doctorlove 我用的是 vs2010。那么, vs2012 有什么问题呢?这段代码应该编译得很好!
  • @GrimFandango,我很困惑。如果我弄清楚了,我会报告的
  • 调用绑定时,第一个参数应该是函数指针。在您第二次调用 bind 时,您没有传递函数指针。 (我绝对不知道你在传递什么!)

标签: c++ visual-studio-2010 c++11 stl


【解决方案1】:

代替:

&map<int,float>::value_type::first

使用:

&m::value_type::first

虽然它不应该有所作为,但这样你就不会使用本地临时。

【讨论】:

  • 这会有什么不同?您正在尝试形成指向成员的指针。
  • 不,这是编译器错误:error C2510: 'm' : left of '::' must be a class/struct/union
猜你喜欢
  • 1970-01-01
  • 2011-04-13
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多