C ++概念:对函数概念的无效引用

时间:2016-11-28 18:38:25

标签: c++ c++-concepts

我尝试了我从概念技术规范修改的这一小段代码:

  template < typename T >
    concept bool C_Object() {
      return requires {
        T();
      };
    }

  template < typename Object >
  requires C_Object<Object>
  class  Foo {
    public:
      Object  test;
  };

struct Component {
  int data;
  Component() : data(0) {}
};

int main() {
  Foo<Component> test;
  return 0;
}

但是我收到了这个错误:

test.cpp:10:12: error: invalid reference to function concept ‘template<class T> concept bool C_Object()’
   requires C_Object<Object>
            ^~~~~~~~~~~~~~~~
test.cpp: In function ‘int main()’:
test.cpp:26:16: error: template constraint failure
   Foo<Component> test;
                ^
test.cpp:26:16: note:   constraints not satisfied
test.cpp:26:16: note: ill-formed constraint

我第一次尝试新版本的C ++概念,我在哪里缺席?

由于

度过美好的一天

1 个答案:

答案 0 :(得分:4)

这个定义:

template < typename T >
concept bool C_Object() {
  return requires {
    T();
  };
}

C_Object定义为函数概念。这一个:

template < typename Object >
requires C_Object<Object>
class Foo {
public:
  Object test;
};

使用C_Object就好像它是一个变量概念。在requires子句中,您必须使用()来“调用”函数概念:

template < typename Object >
requires C_Object<Object>()
class Foo {
public:
  Object test;
};

或者,您可以使用“简洁”占位符语法来约束Object,它不区分变量和函数概念:

template < C_Object Object >
class Foo {
public:
  Object test;
};