按需创建副本

Create a copy on demand

是否有一种惯用的方法来调用表达式中副本的创建?

例如,我有一个函数声明为:

template <class T>
void foo(T&& arg)
{
}

现在我需要用我的对象的副本调用 foo

MyType object;
foo(object);

如上所述,我将调用 void foo(MyType& arg),但是 我不想传递对我的对象的引用 。我还想避免从我的对象移动以触发 void foo(MyType&& arg).

的推论

我想要做的是 foo 的调用站点创建 object 的副本:

foo(copy(object));

我试过以下方法:

是否有标准的图书馆设施或“普遍接受”的方式来做到这一点?


编辑:

如评论中所述,foo(MyType(object)) 始终是一个解决方案。我在问是否有惯用的方法,因为 通常在这种情况下拼出类型可能不太安全:

// Converting constructors may create spurious problems:
foo(AnotherType(object)); 
// This can compile even if decltype(object) != AnotherType

而无需注意指定类型的解决方案始终是安全的:

foo(copy(object)); 

您可以自己构建一个decay-copy函数:

template <class T> 
constexpr std::decay_t<T> decay_copy(T&& v)
{ return std::forward<T>(v); }

然后

foo(decay_copy(object)); 

值得注意的是,在C++23中也可以使用auto(x)得到language-supporteddecay-copy

foo(auto(object)); 

Demo

有关 auto(x) 的更多详细信息,请参阅 P0849