考虑以下代码:
#include <vector>
class A
{
public:
A(A&&); // somewhat expensive
static std::vector<A> make_As()
{
std::vector<A> result;
result.push_back(A(3));
result.push_back(A(4));
return result;
}
private:
A(int); // private constructor
};
由于A
' 移动构造函数有点昂贵(无论出于何种原因),我想避免调用它并emplace_back()
改用:
#include <vector>
class A
{
public:
A(A&&); // somewhat expensive
static std::vector<A> make_As()
{
std::vector<A> result;
result.emplace_back(3);
result.emplace_back(4);
return result;
}
private:
A(int); // private constructor
};
不幸的是,使用emplace_back()
,实际的构造函数调用是由标准库中的某些东西完成的,它没有足够的特权来调用A
的私有构造函数。
我意识到对此可能无能为力,但尽管如此,我觉得由于调用emplace_back()
发生在 的成员中A
,它们应该能够调用私有构造函数。
有什么解决方法吗?
我唯一能想到的就是在 中添加一个朋友声明A
,但是需要成为A
朋友的确切类(即实际尝试调用构造函数的类)是特定于实现的(例如,对于海湾合作委员会它是__gnu_cxx::new_allocator<A>
)。编辑:刚刚意识到这样的朋友声明将允许任何人emplace_back()
A
使用私有构造函数将 ' 构造到 ' 的容器中,A
所以它不会真正解决任何问题,我还不如在那时将构造函数公开......
更新:我应该补充一点A
,昂贵的移动构造函数并不是避免调用它的唯一原因。它可能A
根本不能移动(也不能复制)。当然,这不适用于vector
(因为emplace_back()
可能必须重新分配向量),但可以使用deque
,它也有类似的emplace_back()
方法,但不必重新分配任何东西。