为啥我会收到带有 std::bind() 的“本地临时返回地址”警告?

Posted

技术标签:

【中文标题】为啥我会收到带有 std::bind() 的“本地临时返回地址”警告?【英文标题】: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 时,您没有传递函数指针。 (我绝对不知道你在传递什么!) 【参考方案1】:

代替:

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

使用:

&m::value_type::first

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

【讨论】:

这会有什么不同?您正在尝试形成指向成员的指针。 不,这是编译器错误:error C2510: 'm' : left of '::' must be a class/struct/union

以上是关于为啥我会收到带有 std::bind() 的“本地临时返回地址”警告?的主要内容,如果未能解决你的问题,请参考以下文章

即使我允许所有来源,为啥我会收到 CORS 错误?

为啥 std::bind 不能作为参数包的参数?

为啥 __sysChangeTxBsn 会收到带有本地更新但不是远程更新的值?

为啥我会收到 CORS 错误原因:CORS 请求未成功

如果 render_to_response 方法没有包含在任何地方,为啥我会收到 ImportError?

将 std::bind 应用于带有参数 <boost::asio::ip::tcp::socket> 的函数时出错?