c++ - -std=c++0x 导致使用 boost 1.64 返回对临时的引用

标签 c++ c++11 boost

以下示例结果:

boost/bind/bind.hpp:882: 错误:返回临时引用

如果使用 -std=c++0x 编译。

如果在没有 -std=c++0x 标志的情况下构建,则不会出现警告。看起来 boost 试图在这里使用 c++11 右值,即使 gcc 4.4 不完全支持它。提前致谢!

gcc 版本 4.4.7 20120313(红帽 4.4.7-17)(海湾合作委员会)

完整的构建线: g++ -std=c++0x -Wall -Werror -I/pathtoboost/include main.cpp -o bind

#include <boost/function.hpp>
#include <boost/bind.hpp>

#include <iostream>

int foo( int a )
{
    std::cout << "a: " << a << std::endl;
    return a;
}

int main( int argc, char** argv )
{
    foo( 5 );
    boost::function< int( int ) > bfoo = boost::bind( foo, _1 );
    bfoo( 10 );
    return 0;
}

完整构建错误(警告):

cc1plus: warnings being treated as errors
In file included from /boost/include/boost/bind.hpp:22,
                 from main.cpp:2:
/boost/include/boost/bind/bind.hpp: In member function ‘A1&& boost::_bi::rrlist1<A1>::operator[](boost::arg<1> (*)()) const [with A1 = int]’:
/boost/include/boost/bind/bind.hpp:249:   instantiated from ‘R boost::_bi::list1<A1>::operator()(boost::_bi::type<R>, F&, A&, long int) [with R = int, F = int (*)(int), A = boost::_bi::rrlist1<int>, A1 = boost::arg<1>]’
/boost/include/boost/bind/bind.hpp:1306:   instantiated from ‘typename boost::_bi::result_traits<R, F>::type boost::_bi::bind_t<R, F, L>::operator()(A1&&) [with A1 = int, R = int, F = int (*)(int), L = boost::_bi::list1<boost::arg<1> >]’
/boost/include/boost/function/function_template.hpp:138:   instantiated from ‘static R boost::detail::function::function_obj_invoker1<FunctionObj, R, T0>::invoke(boost::detail::function::function_buffer&, T0) [with FunctionObj = boost::_bi::bind_t<int, int (*)(int), boost::_bi::list1<boost::arg<1> > >, R = int, T0 = int]’
/boost/include/boost/function/function_template.hpp:925:   instantiated from ‘void boost::function1<R, T1>::assign_to(Functor) [with Functor = boost::_bi::bind_t<int, int (*)(int), boost::_bi::list1<boost::arg<1> > >, R = int, T0 = int]’
/boost/include/boost/function/function_template.hpp:716:   instantiated from ‘boost::function1<R, T1>::function1(Functor, typename boost::enable_if_c<(! boost::is_integral::value), int>::type) [with Functor = boost::_bi::bind_t<int, int (*)(int), boost::_bi::list1<boost::arg<1> > >, R = int, T0 = int]’
/boost/include/boost/function/function_template.hpp:1061:   instantiated from ‘boost::function<R(T0)>::function(Functor, typename boost::enable_if_c<(! boost::is_integral::value), int>::type) [with Functor = boost::_bi::bind_t<int, int (*)(int), boost::_bi::list1<boost::arg<1> > >, R = int, T0 = int]’
main.cpp:15:   instantiated from here
/boost/include/boost/bind/bind.hpp:882: error: returning reference to temporary
make: *** [all] Error 1

最佳答案

我已经使用带有 Boost 1.41(捆绑在 CentOS 中)和 Boost 1.64(最新版)的 GCC 4.4 (CentOS 6) 运行您的代码。您的代码可以正常工作。

也许你混合了 boost 东西和 std 东西?

boost::function<int(int)> bfoo = boost::bind(foo, boost::placeholders::_1); // #1 works
boost::function<int(int)> bfoo = boost::bind(foo, _1); // #2 _1 is from boost -> works
std::function<int(int)> bfoo = std::bind(foo, std::placeholders::_1); // #3 works

std::function<int(int)> bfoo = std::bind(foo, _1); // #4 not work
boost::function<int(int)> bfoo = boost::bind(foo, std::placeholders::_1); #5 not work

关于c++ - -std=c++0x 导致使用 boost 1.64 返回对临时的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44210606/

相关文章:

c++ - boost mapped_file_source、对齐方式和页面大小

c++ - Vector.erase 中的 SIGSEGV

c++ - 为多线程场景重构单线程GUI代码

c++ - 构造函数继承和直接成员初始化

c++ - Boost 是否提供打印 uBLAS 数据类型的工具?

c++ - 通过引用为 boost::shared_ptr 创建别名

c++ - 延长 Windows 服务停止的时间

c++ - 添加了对 .lib 项目的引用 - 项目不使用 .cpp 文件?

c++ - CRTP 基本构造函数崩溃,因为未构造子项

c++ - 如何在 MS 编译器中用数组初始化 C++ vector/集合?