在下面的代码中,为什么模板函数的显式扩展无法编译,而条形扩展却成功编译?实时链接-https://godbolt.org/z/o8Ea49KEb
template <typename T1, typename T2>
T1 foo(T2) { T2(42); return T1{}; };
template <typename T1, typename T2>
T1 bar(void) { T2(42); return T1{}; };
int main()
{
foo<int, void>(); // fails
bar<int, void>(); // works
}
请注意,这两个函数的主体中都使用了模板参数T2,唯一的区别是已手动替换条形图的函数参数。
这个问题是在阅读了std::c条件-无效参数类型“无效”后提出的,即使在测试“无效”并试图简化问题时也是如此。
考虑以下因素:
template<typename T>
void foo(T) {}
void bar(void) {}
您假设
在函数签名ulualbar(ulul)
中,括号中的ulul表示不同的东西:没有参数的函数。这是C的残余,不推荐使用。
函数栏
模板函数的解决方案是为模板实例化非法的情况提供重载或专门化。
template<typename T>
void foo(T) {} // one argument
void foo() {} // no arguments -> different signatures -> overload
template<typename T>
void bar() {} // no arguments
template<>
void bar<void> {} // still no arguments -> same signature -> specialisation
表示参数列表(void)的规则与C标准中的空参数列表相同
由单个非依赖类型的未命名参数组成的参数列表等效于空参数列表。除此特殊情况外,参数的类型不得为cv。
这个问题的重要部分是“非依赖型”。模板参数T取决于类型,因此它不会触发规则。
我假设Standard有这个规则,因为如果一个通常接受一个参数的模板函数突然变成一个零参数函数,如果实例化恰好使该参数类型val
,它也会非常混乱(我会说更糟)。有了这个规则,我们知道当一个模板用一个参数声明时,它真的有一个参数。
问题内容: 我正在为apache HttpClient包实现一个,如下所示: 但我希望函数不返回任何值,即。这可能吗?由于不是有效的Java类型,因此以下内容无法编译: 我想可以替换为以返回对象,但这并不是我真正想要的。 问 :是否有可能安排在这样一种方式,我可以返回此回调局面从? 问题答案: 泛型仅处理对象类。泛型不支持void和基本类型,您不能将它们用作参数化类型。您必须改用Void。 你能说
void 类型 万能类型,在需要时再具体指定;在描述一段还没有具体使用的内存时需要使用void类型。 void * 类型的指针指向的内存是尚未确定类型的,因此我们后续可以使用强制类型转换,强行将其转为各种类型。这就是void类型的最终归宿——被强制类型转换成一个具体的类型。 void * 万能指针,void * 可以指向任何类型的数据,在32位系统下,占4个字节 void* malloc(size
我有一个关于显示void类型的返回值的问题。因此trimLines是一个void类型的方法。我不明白如何显示void类型的方法,因为该方法没有返回任何东西,所以没有任何东西可以显示。由于采用字符串类型,这将导致错误。
以下内容在Visual Studio上编译: 但不在Linux g上编译。我得到的错误是 我知道我不能在模板中使用void,这就是我使用std::conditional\u t和std::is\u same\u v的原因。 我看不出有什么不对,有人能告诉我吗?
上节的 Sstack 类模扳只用模板首部的类型参数,也可以使用无类型参数(non-type parameter),无类型参数可以有默认参数,一般将无类型参数当作Const处理。例如,模板首都可以取 int elements 参数,如下所示: template<class T,int elements> // note non-type parameter 然后下列声明: Stack<double,
我正在编写一个小的简单程序,它使用pthreads实现了一个循环执行时间表。我首先编写了没有pthreads的程序,现在试图将参数正确地传递到pthread_create中。我知道args是: int pthread_create(pthread_t*thread,const pthread_attr_t*attr,void*(*start_routome)(void*),void*arg);