gpt4 book ai didi

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

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

我正在尝试使用带有 -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 ) >() );

我做错了什么吗?我曾期望这样的值(value)可以扣除。

按照 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;
}
};

最佳答案

这应该是错误的:

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

template< user_type u > struct value {};

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

A non-type template-parameter shall have one of the following (optionally cv-qualified) types:

  • a literal type that has strong structural equality ([class.compare.default]),
  • [...]

需要强结构平等的地方,来自 [class.compare.default]/3 :

A type C has strong structural equality if, given a glvalue x of type const C, either:

  • C is a non-class type and [...], or
  • C is a class type with an == operator defined as defaulted in the definition of C, x == x is well-formed when contextually converted to bool, all of C's base class subobjects and non-static data members have strong structural equality, and C has no mutable or volatile subobjects.

关键是我们需要类型中有一个默认的==...而我们没有,所以我们的类型不具备强结构相等性,所以不能使用作为模板非类型参数。

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

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

关于c++ - 推导用户定义值模板参数(C++2a,P0732R2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55991986/

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