gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:03:38 28 4
gpt4 key购买 nike

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

template<typename T>
struct Foo { };

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

标准中是否有关于在模板未实例化的情况下检查此规则的指令?
是否可以确定仅在模板实例化尝试(无实例化 => 编译成功)后才检查此规则?

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);
}

最佳答案

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

  1. C++03和中没有指令
  2. 规则实例化模板以本地类型作为错误参数,它说使用本地类型作为模板参数是一个错误。

如果模板没有被实例化,应该不会成功。

另一方面,一些编译器允许本地类型作为模板参数(例如 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虽然我不确定它是否正确;我认为即使没有实例化,实现也可能会失败,除非参数在封闭模板中依赖于参数。

关于c++ - 本地类型作为未实例化函数内的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24303329/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com