是否可以强制 C++ 在调用函数的范围内构造对象?我的意思是明确地做返回值优化(RVO)所做的事情。
我有一些容器类在派生链中。由于类是用堆栈数据构造的,因此无法返回,所以我禁用了复制构造函数和赋值运算符。对于每个类,我都提供了一个迭代器。每个迭代器的构造函数只有一个参数:指向容器类的指针。要获取迭代器,我想使用这个函数:
BindPackIterator BindPack.begin(void)
{
return BindPackIterator(this);
}
在这种情况下:
for (auto i=bindpack.begin(); !i.end(); ++i) { i.run(); }
编译器发出错误,抱怨无法复制 BindPackIterator 对象。请记住,我禁用了它们。
我想要发生的是在调用函数的范围内实例化 BindPackIterator 以避免复制或移动操作。
在这种特殊情况下,我知道我可以做一个解决方法,将 begin 函数更改为返回一个 BindPack 指针,
for(BindPackIterator i=bindpack.begin(); !i.end(); ++i) { i.run(); }
我用 decltype 和这个结构做了一些实验,但没有成功:
auto BindPack::begin(void) -> BindPackIterator
{
return BindPackIterator(this);
}
这只是我目前感到沮丧的一个例子。在其他项目中,明显的解决方案是让函数在调用函数的范围内实例化一个对象。在某些情况下,移动构造函数 (foo&&) 会有所帮助,但对于具有许多数据成员的对象,即使这样也可能效率低下。是否有允许在调用者范围内构造/实例化对象的设计模式?