本地类型作为模板参数内部未实例化的函数

时间:2014-06-19 09:32:08

标签: c++ templates instantiation c++03 local-class

在C ++ 03中禁止使用本地类型作为模板参数:

template<typename T>
struct Foo { };

void Make()
{
  struct Unknown {};
  Foo<Unknown> foo; // Bad
}

如果模板未实例化,是否有标准中有关检查此规则的指令?

是否可以确定,只有在模板实例化尝试后才检查此规则(没有实例化=&gt;编译成功)?

template<typename T>
struct Foo { };

template<typename T>
void Do(T&) { }

template<typename T>
void Do(T*) // usage with pointer is forbidden by-design
{
  struct Unknown {};
  Foo<Unknown>::UnknownMethod();
}

int main()
{
  std::string s;
  Do(s);
}

1 个答案:

答案 0 :(得分:2)

C ++ 03中没有这样的指令,因为

  1. C ++ 03和
  2. 中没有指令
  3. 规则实例化模板,本地类型作为参数出错,它说使用本地类型作为模板参数是错误。
  4. 如果未实例化模板,则不应该成功。

    另一方面,一些编译器允许本地类型作为模板参数(例如,Visual C ++;不,它不遵循标准,但这就是生命),所以你不能用它来强制编译失败。

    如果在尝试某种组合时需要编译失败,请使用标准静态断言。您可以使用Boost.Static Assert实施,评论中的implementation linked by πάντα ῥεῖthe simple implementation in this other question/answer 1

    template<typename T>
    struct Foo { };
    
    template<typename T>
    void Do(T&) { }
    
    template<typename T>
    void Do(T*) // usage with pointer is forbidden by-design
    {
        BOOST_STATIC_ASSERT(false);
    }
    

    1 我不确定它是否正确;我认为即使没有实例化,实现也可能失败,除非参数在封闭模板中依赖于参数。