gpt4 book ai didi

c++ - 静态常量类成员

转载 作者:行者123 更新时间:2023-11-27 23:35:30 25 4
gpt4 key购买 nike

考虑以下片段:

struct Foo
{
static const T value = 123; //Where T is some POD-type
};

const T Foo::value; //Is this required?

在这种情况下,标准是否要求我们在翻译单元中明确声明?看来我的信息相互矛盾; boost 和 STL 中的 numeric_limits 之类的东西似乎在做这种事情,就像在我的代码片段中一样。

OTOH,我记得在某个地方(虽然很久以前)读过,您仍然需要在翻译单元中提供声明。

如果是这样的话,模板特化呢?每个专业都需要声明吗?

如果您对什么是“正确的方式”提出意见,我将不胜感激。

最佳答案

您还必须在翻译单元中提供一个定义,以防您使用值变量。这意味着,例如,如果您读取它的值。

重要的是,如果您违反该规则,编译器不需要发出警告或错误。该标准表示“无需诊断”违规行为。

在下一个 C++ 标准版本中,规则发生了变化。当变量用作常量表达式时,使用它。简单地阅读上面的 value 变量直接在类中初始化意味着仍然不需要定义。

请参阅标准的 3.2 一个定义规则 部分中的 use 定义和 9.4.2 段落中静态数据成员定义的要求4 和 5(在 C++98 标准中。出现在下一个标准的 n2800 草案的第 3 和第 4 段中)。

更正: c++03 的规则已经更改:如果变量出现在需要整数常量表达式的位置,则不需要定义(引用自 2003 年更新的非官方修订列表) , 请参阅 this language defect report 的分辨率:

An expression is potentially evaluated unless it appears where an integral constant expression is required (see 5.19), is the operand of the sizeof operator (5.3.3), or is the operand of the typeid operator and the expression does not designate an lvalue of polymorphic class type (5.2.8)...

请注意,即便如此,许多用途都是在不需要整数常量的情况下需要。一种情况是数组维度或模板元编程。所以严格来说(参见 this report),只有 c++1x 解决方案才能真正保证在明显的情况下也像 "s == string::npos" ,其中整数常量不是 required 不需要静态成员的定义,因为下一个标准有不同的更好的措辞 3.2。然而,这是非常理论化的东西,因为大多数(全部?)编译器无论如何都不会提示。感谢评论区的人告诉我。

关于c++ - 静态常量类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/578654/

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