gpt4 book ai didi

C++ 概念 Same 和 Assignable

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:21:24 24 4
gpt4 key购买 nike

我最近一直在试验 C++ 概念。我正在尝试以下范围扩展文档中的定义:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4569.pdf

Same 的定义和用法让我很困惑。由于我不知道的原因,作者没有给出明确的定义。所以我正在使用:

template <class T, class U>
concept bool Same()
{
return std::is_same<T, U>::value;
}

问题是文档给出了 Assignable 的以下定义:

template <class T, class U>
concept bool Assignable()
{
return Common<T, U>() && requires(T&& a, U&& b) {
{ std::forward<T>(a) = std::forward<U>(b) } -> Same<T&>;
};
}

它不起作用(在 GCC 6.3 下):一个简单的 Assignable<int&, int&&>() 概念检查给了我 false(我已经验证 Common 部分是好的)。我必须将 Same<T&> 更改为 T& 才能使其看起来有效。其他一些地方也使用了相同的 Same<Type> 检查。

我的问题是:

  • 我对 Same 的定义是否正确?
  • 为什么使用 Same<T&> 而不是 T& ?有什么区别?

感谢您的帮助。

最佳答案

在周末解决这个问题后,我想我自己找到了答案。

Eric Niebler 和 Casey Carter 对支持多个模板参数(不仅仅是两个)的 Same 有一个更精确的定义,但我的定义应该基本上适用于两个参数的情况。

使用 -> Type 的目的是可以将括号中的表达式隐式转换为 Type 。使用 -> Same<Type> 的目的是让括号中的表达式正好是 Type 。所以它们是不同的。

但是,有一个陷阱。约束检查相当复杂,甚至像 Eric 和 Casey 这样的专家也犯了错误,在 N4569 中给出了错误的定义。 Eric 在 GitHub 上讨论了这个问题:

https://github.com/ericniebler/stl2/issues/330

当按照 N4569 中给出的方式使用时,这意味着表达式应该能够传递给想象中的函数模板,例如

template <typename U>
f(U)
requires Same<T&, U>()

这不起作用——如果传入的表达式是 T 的左值,推导的 UT 而不是 T& 。解决方案是在 Same<T&>&& 中使用 Assignable 。会产生如下想象的函数模板:

template <typename U>
f(U&&)
requires Same<T&, U>()

现在一切正常——如果传入的表达式是 T 的左值,则 U 必须推导为 T&

玩概念对我来说是一个很好的练习,但我可能应该早点找到他们的代码。他们在以下 GitHub 存储库中有一套完整的概念:

https://github.com/CaseyCarter/cmcstl2

对 C++ 概念感兴趣的人应该研究它。

关于C++ 概念 Same 和 Assignable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43102919/

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