无法推断概念中的占位符类型

时间:2019-03-16 15:06:01

标签: c++ c++-concepts c++20

我正在尝试使用GCC 8中的Concepts TS复制标准C ++ 20概念,以便在标准库中可用它们之前就可以使用它们。我主要复制了最新草稿中的所有内容,然后遇到了一个问题:

Coordinate RegionCentroid[Triangle[{}]] should be a pair of numbers, or a Scaled or Offset form.

许多其他概念需要可分配的类型,当尝试使用此概念时,我得到:

#include <type_traits>
#include <utility>

// [concept.same]
template <typename T, typename U>
concept bool Same = std::is_same_v<T, U>;

// [concept.assignable]

// TODO: Proper implementation requires std::common_reference that is not in
// libstdc++ yet and implementing it myself is too hard.
template <typename LHS, typename RHS>
concept bool Assignable = std::is_lvalue_reference_v<LHS> &&
    requires(LHS lhs, RHS&& rhs)
    {
        {lhs = std::forward<RHS>(rhs)} -> Same<LHS>;
    };

template <typename T>
    requires Assignable<T&, T>
void Test(T a) {}

int main()
{
    Test(42);
}

这是什么问题?

1 个答案:

答案 0 :(得分:4)

这是P1084在圣地亚哥(2018年11月)采用的对Concepts的最新更改。问题是它曾经是:

{ E } -> Same<T>;

实际上意味着表达式f(E)对以下形式的发明函数模板有效:

template <class U> requires Same<U, T> void f(U );

对于引用类型T显然不适用(与OP中一样)。

换句话说,旧规则是:{ E } -> Same<T>的意思是Same<remove_cvref_t<decltype((E))>, T>。新规则是它的意思是Same<decltype((E)), T>。看来gcc的-fconcepts和clang的concept分支都尚未实现这些新规则。


当前的解决方法是更改​​:

{ E } -> Same<LHS> // i.e. Same<T&>

收件人:

{ E } -> Same<std::remove_reference_t<LHS>>& // i.e. Same<T>&