C++ 对于T所做的'std::declval<;T>;()`没有匹配的函数吗?
我惊讶地发现,对于一些C++ 对于T所做的'std::declval<;T>;()`没有匹配的函数吗?,c++,language-lawyer,declval,C++,Language Lawyer,Declval,我惊讶地发现,对于一些T,decltype(std::declval())是不合法的: #包括 模板 使用Alias=decltype(std::declval()); //果然 使用A1=别名; 使用A2=别名; //错误:调用“declval()”时没有匹配的函数 使用A3=别名; 使用A4=别名; 使用A5=别名; 使用A6=别名; //以及上述各项的所有组合 似乎并不表示预期会出现此错误 是否有其他类型的declval不能使用?规范在哪里定义这些?根据,declval的签名是: tem
T
,decltype(std::declval())
是不合法的:
#包括
模板
使用Alias=decltype(std::declval());
//果然
使用A1=别名;
使用A2=别名;
//错误:调用“declval()”时没有匹配的函数
使用A3=别名;
使用A4=别名;
使用A5=别名;
使用A6=别名;
//以及上述各项的所有组合
似乎并不表示预期会出现此错误
是否有其他类型的declval
不能使用?规范在哪里定义这些?根据,declval的签名是:
template <class T>
add_rvalue_reference_t<T> declval() noexcept;
模板
添加_rvalue_reference_t declval()noexcept;
因此,如果add\u rvalue\u reference\t
不能作为返回类型说明符出现,则调用的格式不正确
限定函数类型有一个特殊规则:
带有cv限定符seq或ref限定符的函数类型
(包括由typedef name([dcl.typedef])命名的类型,
[温度参数])应仅显示为:
- (6.1)非静态成员函数的函数类型
- (6.2)指向成员的指针所引用的函数类型
- (6.3)函数类型定义声明或别名声明的顶级函数类型
- (6.4)类型参数的默认参数中的类型id,或
- (6.5)类型参数([temp.arg.type])的模板参数的类型id
综上所述,我非常确定限定的函数类型是唯一的情况。将属性放在函数原型类型之后似乎会抛出错误。您可能必须在改变语义的类型:
Alias
@D.nathanel上使用std::function
std::function
是关于类型擦除的。std::function const
是对int(const*)(int)
的模拟,而不是对int(*)(int)const