Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于T所做的'std::declval<;T>;()`没有匹配的函数吗?_C++_Language Lawyer_Declval - Fatal编程技术网

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