gpt4 book ai didi

c++ - 如果实例化,如何使模板化变量特化在编译时失败?

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:29 25 4
gpt4 key购买 nike

当且仅当模板变量的默认特化被实例化时,是否有可能出现编译时错误?例如

template<typename T>
constexpr int foo = /* Something that fails */;

template<>
constexpr int foo<bool> = 42;

// ...
int bar = foo<bool>; // All good!
int meow = foo<int>; // Error if and only if this line exists

我尝试放入 /* Something that fails*/ 的所有尝试都以失败告终,即使未实例化特化也是如此。这可能吗?如果可以通过 static_assert 之类的机制以某种方式报告错误,那就更好了,这样它至少在某种程度上是清晰的。

最佳答案

这是否标准,您应该咨询语言律师。 Clang 不会让您保留未定义的模板化 constexpr 变量,但它会让您从 constexpr 初始值设定项中引用未定义的模板实例化。然后你可以这样写:

template<typename T>
struct no_such_type_for_foo;

template<typename T>
constexpr int foo = no_such_type_for_foo<T>::value;

template<>
constexpr int foo<int> = 4;

int main()
{
int y = foo<int>; // all good
int z = foo<bool>; // implicit instantiation of undefined template 'no_such_type_for_foo<bool>'
}

关于c++ - 如果实例化,如何使模板化变量特化在编译时失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36817157/

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