gpt4 book ai didi

c++ - emplace() 的参数转发使构造函数参数为 const

转载 作者:行者123 更新时间:2023-11-28 05:45:19 29 4
gpt4 key购买 nike

我正在尝试使用 emplace()就地 build 一个map<K,V>条目(使用 boost )。关键对象构造函数 arg 通过模板魔术正确转发,但是 V object constructor arg 变为 const,因此它不起作用。

#include <boost/container/map.hpp>

class A {
public:
/**/ A( int n ) { }
friend bool operator<( const A &a1, const A &a2 ) { return false; }
} ;

class B {
public:
/**/ B( const char *str ) { }
} ;

class C {
public:
/**/ C( B &b ) { }
} ;

int
main( int, char ** )
{
boost::container::map<A,B> m1;
boost::container::map<A,C> m2;
B b( "Foo" );
C c( b ); // <--- this works OK.

m1.emplace( 1, "Hello" );
m2.emplace( 2, b ); // <----- this fails!
}

错误是:

Error: /usr/local/include/boost/container/detail/pair.hpp:128:38: error: no matching function for call to C::C(const B&), second(::boost::forward<V>(v))

关于 emplace 参数转发的一些事情变成了 b进入const b在最后一行。我知道必须有一个 boost::bla_bla_bla我可以申请让它发挥作用,但我没能找到它。

有人可以帮忙吗?

最佳答案

请注意,如果您使用 -std=c++11 编译它(或更高版本),这将起作用。为什么会出现这种情况需要进行一些挖掘 - 我使用的是稍旧版本的 boost (1.56),但我怀疑这两个版本之间的变化很大。

使用 emplace一般要求完美转发。这意味着所有参数都通过 std::forward<Args>(args)... 转发.在底层,这依赖于引用 fold 和移动语义——这是 C++11 的全部领域,在 C++03 中没有类似物。

如果我们深入研究 pair 的 boost 代码(它实际产生错误的地方),那么这是它试图调用的构造函数:

template<class U, class V>
pair(BOOST_FWD_REF(U) u, BOOST_FWD_REF(V) v)
: first(::boost::forward<U>(u))
, second(::boost::forward<V>(v))
{}

不幸的是,BOOST_FWD_REF (在 move/core.hpp 中)是以下之一:

#define BOOST_FWD_REF(TYPE)\
const TYPE & \
//

#define BOOST_FWD_REF(TYPE)\
const TYPE & \
//

当您的编译器无法识别右值引用时,这将变为 const TYPE& .

关于这个 on the boost archives list 有一些讨论.

最简单的解决方案是简单地使用 std=c++11 进行编译.

关于c++ - emplace() 的参数转发使构造函数参数为 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36348243/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com