gpt4 book ai didi

c++ - 完美转发的身份功能

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:57 27 4
gpt4 key购买 nike

我想写一个函数 identity ,它可以完美地转发它的参数而不需要任何拷贝。我会写这样的东西

 template< typename V >
inline V&& identity( V&& v )
{
return std::forward< V >( v );
}

但它是正确的吗?它总是返回正确的类型吗?如果 v 是左值/左值引用/临时值,它是否简单地独立转发?

最佳答案

您可以使用参数包作为守卫,这样一来,实际上没有人可以强制使用与否则推导的类型不同的类型。
作为一个最小的工作示例:

#include <type_traits>
#include <utility>

template<typename..., typename V>
constexpr V&& identity(V&& v) {
return std::forward<V>(v);
}

int main() {
static_assert(std::is_same<decltype(identity(42)), int&&>::value, "!");
static_assert(std::is_same<decltype(identity<int>(42)), int&&>::value, "!");
static_assert(std::is_same<decltype(identity<float>(42)), int&&>::value, "!");
// here is the example mentioned by @Jarod42 in the comments to the question
static_assert(std::is_same<decltype(identity<const int &>(42)), int&&>::value, "!");
}

这样,返回类型取决于 v 参数的实际类型,您不能以任何方式强制复制。


正如@bolov 在评论中提到的,语法很快就会变得晦涩难懂。
无论如何,正如 @Jarod42 所建议的,问题在于更明确地说明我们正在做什么。

举个例子:

template <typename... EmptyPack, typename V, typename = std::enable_if_t<sizeof...(EmptyPack) == 0>>

作为替代方案:

template <typename... EmptyPack, typename V, std::enable_if_t<sizeof...(EmptyPack) == 0>* = nullptr>

甚至:

template <typename... EmptyPack, typename V>
constexpr
std::enable_if_t<sizeof...(EmptyPack) == 0, V&&>
identity(V&& v) {
return std::forward<V>(v);
}

选择你喜欢的并使用它,在这种情况下它们应该都是有效的。

关于c++ - 完美转发的身份功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38353823/

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