我正在尝试使用带有-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;
}
};
答案 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尚未声明此类运算符,因此您无法解决问题。
这只是新功能的不完全实现。