推导用户定义值模板参数(C ++ 2a,P0732R2)

时间:2019-05-05 12:34:00

标签: c++ templates template-deduction c++20 argument-deduction

我正在尝试使用带有-std = c ++ 2a的GCC 9.1获取用户定义的类的模板参数的值(http://wg21.link/p0732r2)。

struct user_type {
   int a;
   constexpr user_type( int a ): a( a ){}
};

template< user_type u > struct value {};

template< user_type u > void f( value< u > arg ){}  

void g(){
  f( value< user_type( 0 ) >() ); // error here
}

编译器资源管理器:https://godbolt.org/z/6v_p_R

我得到了错误:

source>:8:30: note:   template argument deduction/substitution failed:
<source>:11:33: note:   couldn't deduce template parameter 'u'
   11 |    f( value< user_type( 0 ) >() );

我做错什么了吗?我原以为这样的值是可以扣除的。

按照Nikita的建议,我在用户类型中添加了==和!=运算符,但这没什么区别。

struct user_type {
   int a;
   constexpr user_type( int a ): a( a ){}
   constexpr bool operator==( const user_type & arg ) const {
      return a == arg.a;
   }
   constexpr bool operator!=( const user_type & arg ) const {
      return a != arg.a;
   }
};

1 个答案:

答案 0 :(得分:2)

这应该是格式错误的

struct user_type {
   int a;
   constexpr user_type( int a ): a( a ){}
};

template< user_type u > struct value {};

要成为模板非类型参数,您需要满足[temp.param]/4

  

非类型模板参数应具有以下类型之一(可选的cv限定):

     
      
  • 具有强等式结构([class.compare.default])的文字类型,
  •   
  • [...]
  •   

需要强有力的结构平等的地方,请从[class.compare.default]/3

  

如果在给定const C类型的glvalue x的情况下,C型具有强结构等式:

     
      
  • C是非类类型,并且[...],或者
  •   
  • C是类类型,其中==运算符在C的定义中定义为默认值,x == x在上下文转换为bool时格式正确,所有C的基类子对象和非静态数据成员具有很强的结构相等性,并且C没有可变或可变的子对象。
  •   

关键是我们需要一个默认的==类型...并且我们没有默认类型plt.close('all') ,因此我们的类型没有强大的结构相等性,因此不能用作非模板类型参数。

但是,gcc doesn't let you尚未声明此类运算符,因此您无法解决问题。

这只是新功能的不完全实现。