【发布时间】:2013-12-08 07:37:16
【问题描述】:
我想用模板构造函数创建一个类:
class foo
{
template <class T> foo(T var) {}
};
这在VS2008中编译,但我不知道它是否是一个非标准扩展,或者C++标准是否允许它。
【问题讨论】:
-
我发现,至少在直接 C++ 方面,MS 尊重标准,并且通常不会像某些人那样因扩展而违反标准。
-
这是允许的,而且有时会派上用场。没有理由不编译。构造函数仍然是一个函数,因此可以是基于模板的。但是,对构造函数有限制。它们不能用 explicit 模板参数调用;它们必须可以从参数列表中推导出来。 IE。
template <class T> foo() { T something; ...}将不起作用。 -
@BobbyDigital 认真的吗?模板中的两阶段名称查找在哪里?预处理器彻底坏了。将临时对象绑定到可变引用只是一个警告(默认情况下)。自动生成的移动 ctor/分配操作在哪里? MSVC 是一致性较差的编译器之一。
-
“将临时对象绑定到可变引用只是一个警告(默认情况下)”——值得一提的是,这部分符合标准。警告足以诊断格式错误的程序,不要求符合标准的编译器必须拒绝它。
-
@BobbyDigital 我主要是对“MS 普遍尊重标准”做出反应,但实际上它并没有那么好。扩展可以关闭,错误不能。无论如何,
T&临时文件是一个扩展。但是您确实有一点,MSVC 的扩展比例如少。海湾合作委员会。
标签: c++ templates constructor