gpt4 book ai didi

c++ - std::function 可以从右值引用移动构造到临时仿函数对象吗?

转载 作者:IT老高 更新时间:2023-10-28 22:03:34 25 4
gpt4 key购买 nike

我有一个未模板化的仿函数对象,我试图将它作为 std::function 存储在另一个对象中。这个对象真的很重量级,所以它被标记为不可复制,但它确实有一个移动构造函数。但是,尝试从临时构造函数构造或分配 std::function 会失败。

这是一个引发错误的最小示例。

// pretend this is a really heavyweight functor that can't be copied.
struct ExampleTest
{
int x;
int operator()(void) const {return x*2;}
ExampleTest( ) :x(0){}
ExampleTest( int a ) :x(a){}

// allow move
ExampleTest( ExampleTest &&other ) :x(other.x) {};

private: // disallow copy, assignment
ExampleTest( const ExampleTest &other );
void operator=( const ExampleTest &other );
};

// this sometimes stores really big functors and other times stores tiny lambdas.
struct ExampleContainer
{
ExampleContainer( int );
std::function<int(void)> funct;
};

/******** ERROR:
Compiler error: 'ExampleTest::ExampleTest' : cannot access private member
declared in class 'ExampleTest'
******************/
ExampleContainer::ExampleContainer( int x )
: funct( ExampleTest( x ) )
{}

/******** ERROR:
Compiler error: 'ExampleTest::ExampleTest' : cannot access private member
declared in class 'ExampleTest'
******************/
int SetExample( ExampleContainer *container )
{
container->funct = ExampleTest();
return container->funct();
}

在一个更简单的构造中,我只是在创建一个本地函数,我也得到了错误:

int ContrivedExample(  )
{
// extra parens to sidestep most vexing parse
std::function<int()> zug( (ExampleTest()) );
/*** ERROR: 'ExampleTest::ExampleTest' : cannot access private member
declared in class 'ExampleTest' */
int troz = zug( ) ;
return troz;
}

据我所知,在所有这些情况下,一个临时的 ExampleTest 应该作为右值传递给函数构造函数。然而编译器想要复制它们。

什么给了?是否可以将不可复制(但可移动复制)的仿函数对象传递给 std::function 构造函数?有指针等的解决方法,但我想了解这里发生了什么。

以上具体错误来自带有 CTP C++11 补丁的 Visual Studio 2012。 GCC 4.8 和 Clang 3 也失败了,并带有它们自己的错误消息。

最佳答案

This object is really heavyweight, so it's marked as uncopyable, but it does have a move constructor.

如果仿函数是不可复制的,则它不满足与 std::function 一起使用的必要要求。 C++11 标准第 20.8.11.2.1/7 段规定:

template<class F> function(F f);
template <class F, class A> function(allocator_arg_t, const A& a, F f);

7 Requires: F shall be CopyConstructible. f shall be Callable (20.8.11.2) for argument types ArgTypes and return type R. The copy constructor and destructor of A shall not throw exceptions.

关于c++ - std::function 可以从右值引用移动构造到临时仿函数对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16639131/

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