gpt4 book ai didi

c++ - 具有有效特化的未初始化模板类中的 static_assert

转载 作者:行者123 更新时间:2023-11-30 05:14:51 27 4
gpt4 key购买 nike

我的问题是,下面的代码是否有效:

template<int i> class Class
{
static_assert(sizeof(i) == 0, "Class instantiated with i != 1");
};

template<> class Class<1> {};

此代码段使用 g++ 编译。但是 clang++static_assert 困住了:

error: static_assert failed "Class instantiated with non-int type"

一个使用类型而不是像 int 这样的模板

template<typename T> class Class
{
static_assert(sizeof(T) == 0, "Class instantiated with non-int type");
};

template<> class Class<int> {};

被两个编译器接受。完全相同的模式适用于函数模板。

我找到了 open-std.org::Non-dependent static_assert-declarations ,但这似乎并不适用,因为我的 static_assert 依赖于模板参数。

您可以在 godbolt.org 上查看描述的行为

编辑:正如 Johan Lundberg 在评论中指出的那样,我的问题是错误的。事实上,sizeof(i) 不依赖于模板参数。 R.Sahu 也完全正确:断言 i != 1 更有意义。为此,两个编译器再次接受代码。

但是,上面的例子仍然可以用g++编译。作为open-std.org::Non-dependent static_assert-declarations适用于那种情况(我再次为我在这方面的错误问题道歉):g++ 在没有错误的情况下编译代码实际上是错误的吗?

最佳答案

clang++拒绝你的代码是对的,但是g++没有捕捉到错误也不是错的;这是“无需诊断”的情况。

该标准将模板中的表达式严格定义为“依赖于类型”和/或“依赖于值”。鉴于 template<int i> , i值依赖但不依赖类型。

[14.6.2.2/4]: Expressions of the following forms are never type-dependent (because the type of the expression cannot be dependent):

  • ...
  • sizeof unary-expression
  • ...

[14.6.2.3/2]: Expressions of the following form are value-dependent if the unary-expression or expression is type-dependent or the type-id is dependent:

  • sizeof unary-expression
  • ...

所以 sizeof(i)不依赖。

最后,14.6/8 说:

If a hypothetical instantiation of a template immediately following its definition would be ill-formed due to a construct that does not depend on a template parameter, the program is ill-formed; no diagnostic is required.

关于c++ - 具有有效特化的未初始化模板类中的 static_assert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43286980/

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