为什么 C++ 和 Java 中的构造函数调用需要显式类型参数
Why do constructor calls in C++ and Java require explicit type parameters?
C++和Java在处理参数多态性方面有这种相似之处:两者都会将类型参数推断为常规函数或方法,但要求程序员在调用构造函数时显式给出类型参数(尽管这在Java 7中发生了变化)。
这种行为背后的技术原因是什么?
编辑:我错误地认为这也适用于Scala。下面是一个来自 Java 的示例:
class Foo<T> {
Foo(T x) { }
}
<T> void foo(T x) { }
Foo<Integer> f = new Foo(3);
foo(3);
两者都是合法的,但第一个创建"原始类型"而不是Foo<Integer>
,并执行未经检查的赋值。
这是因为C++模板可以专业化。
这意味着仅仅因为有一个主要定义:
template<typename T>
class Foo
{
Foo(T x) { }
};
而且显然int
会被Foo<int>(int)
接受,完全有可能还有一个专门的定义
template<>
class Foo<Foobar>
{
Foo(int x) { }
};
它还接受int
参数。
将用户定义的类型转换添加到组合中,您会发现无法从函数参数中找出类的类型参数。
事实上,允许推断构造函数的类型参数。 但不是类模板参数的推断。 例如,在构造智能指针时允许隐式上播:
template<typename T>
class a_smart_ptr
{
template<typename TOther>
a_smart_ptr(TOther* p) { }
};
相关文章:
- 函数调用中参数的顺序重要吗
- uncrustify:如何将多行 C 函数调用的参数组合到一行上?
- 宏函数调用缺少参数警告,即使给定了参数
- 使用成员函数调用可变参数模板函数
- std::vector for_each error C3867函数调用缺少参数列表
- 函数调用和参数传递中涉及的概念
- 直接在函数调用的参数列表中初始化向量
- 函数调用的参数太多,预期为 0,有 1。 "InfInt.h"字符串函数
- 函数调用缺少参数列表错误
- 错误 1 错误 C3867:"命令::getSecondWord":函数调用缺少参数列表;使用 '&' 创建指向成员的指针
- 使用var_arg为函数调用传递参数
- 函数调用缺少参数列表警告
- C++对一个对象向量进行排序,得到错误C3867函数调用缺少参数列表
- 错误C3867:函数调用缺少参数
- C++函数调用缺少参数列表
- c++ 函数调用的参数推送顺序不反映堆栈中参数的地址
- 使用 range-for 循环:函数调用的参数太少,未指定单个参数'a'
- 在函数调用的参数中使用赋值运算符
- C++函数调用缺少参数列表;使用 '&Runner::runTask' 创建指向成员的指针
- 带有类型指针的C++函数调用,参数混淆:不允许使用不完整的类型