gpt4 book ai didi

c++ - static_assert 无法检查模板化对象指针

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

template <size_t N>
class Foo
{
static_assert(N > 0, "WRONG");
//void Something() = 0; //my original implementation
};

int main() {

Foo<0> *p2 = nullptr; //no error
Foo<0> p; //gives an error

return 0;
}

我已经分别测试了两条线路。初始化 p2 时未调用 static_assert,但它被调用并且确实在 p 上失败。这是故意的吗? (我已经在 gcc、clang 和 VC 上试过了)

解决方法是什么?由于我使用的是抽象模板化类,如果仅在实例化非指针对象时才执行断言,那将是一场噩梦。我可以使用工厂,但这并不是一个合适的解决方案。

最佳答案

您一定看到了 §14.7.1/1 中的这段引述:

Unless a class template specialization has been explicitlyinstantiated (14.7.2) or explicitly specialized (14.7.3), the classtemplate specialization is implicitly instantiated when thespecialization is referenced in a context that requires acompletely-defined object type or when the completeness of the classtype affects the semantics of the program.

指针类型不要求它们的指针对象是完整类型(例如 void* 就是一个例子)。因此,第一行不会实例化特化,但第二行需要实例化,因此断言仅在该行上触发。

下面三段的示例也解决了这个问题:

[ Example:

template<class T> struct Z {
void f();
void g();
};

void h() {
Z<int> a; // instantiation of class Z<int> required
Z<double>* q; // instantiation of class Z<double> not required
//[…]
}

Nothing in this example requires class Z<double> […] to be implicitly instantiated. — end example ]

关于c++ - static_assert 无法检查模板化对象指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30415930/

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