【问题标题】:Does the C++ standard allow a template constructor for a non-template class?C++ 标准是否允许非模板类的模板构造函数?
【发布时间】:2013-12-08 07:37:16
【问题描述】:

我想用模板构造函数创建一个类:

class foo
{
    template <class T> foo(T var) {}
};

这在VS2008中编译,但我不知道它是否是一个非标准扩展,或者C++标准是否允许它。

【问题讨论】:

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

标签: c++ templates constructor


【解决方案1】:

在 [temp.mem] 中:

模板可以在类或类模板中声明;这样一个 模板称为成员模板。

构造函数是成员,并没有明确禁止将它们设为模板。

例如,std::shared_ptr 有很多 template constructors

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多