Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >类定义中的静态数据成员初始化?

类定义中的静态数据成员初始化?
EN

Stack Overflow用户
提问于 2019-03-19 13:20:54
回答 1查看 1.4K关注 0票数 5

我在这里有一个问题,所以,为什么(为什么?)在类中初始化静态变量是不可能的?我所做的

http://eel.is/c++draft/class.static.data#3 如果一个非易失性的非内联静态数据成员是整数或枚举类型的,那么如果程序中使用了odr,那么.仍然应该在名称空间作用域中定义,并且命名空间范围定义不应该包含初始化器。

所以,像这样的例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct X {
    static int const n = 7; // should be defined outside the class, 
                            // but it's compiles successfully
};

我看到这个话题https://stackoverflow.com/a/16374286/9780989,就给出了这样一个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct s
{
    static std::size_t const len = 10;
    int arr[len];
};
std::size_t const s::len; 

有话说,-

“如果类定义中没有初始化len,编译器很难在下一行中知道它的值,从而定义arr的长度。”

但是实际上,如果没有std::size_t const::len--这行编译也很成功,那么在什么情况下它不应该工作呢?https://gcc.godbolt.org/z/OMKzEO

所以我们更进一步,为什么我们不能初始化类中的静态成员,const限定符允许这样做,为什么没有我们不能这样做呢?允许在类内初始化的const是做什么的?

您可能会说,我们无法在类内初始化静态成员,因为ODR和Stroustrup的意思是:

类通常在头文件中声明,而头文件通常包含在许多翻译单元中。然而,为了避免复杂的链接器规则,C++要求每个对象都有一个唯一的定义。如果C++允许在类中定义需要作为对象存储在内存中的实体,则该规则将被打破。

但这不是真的,为什么编译器会解决模板类的静态成员在标头(翻译单元外)中初始化的事实?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// templates are completely pushed into headers
template<typename T>
struct X {
    static int val;
};  

// here the static member of the template class is initialized in the header  
template<typename T>
int X<T>::val = 0; 

int main() {
    X<int> x;
}

好吧,我试着把我的问题具体化:

  1. 为什么可以在类定义中定义const静态数据成员(如果它没有使用odr,那么它不需要在类之外定义)?
  2. 为什么没有const的静态数据成员可能不能在类定义中定义(请参阅我关于带有静态成员的模板类和Stroustrup关于这个问题的想法(他欺骗我们了吗?)

是的,我看到在C++17中我们允许使用内联,但我对这种情况不太感兴趣。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-19 14:02:54

为什么(为什么?)在类内初始化静态变量是不可能的?

如果静态变量是const,那么在类定义中初始化静态变量是不可能的,不是

但是实际上,如果没有std::size_t const::len--这一行编译也很成功,那么在什么情况下它不应该工作呢?

它的工作是因为变量没有使用odr。请参阅basic.def.odr

变量x,其名称显示为可能计算的表达式e是odr-由e使用,除非

  • X是一个参考..。
  • X是一个非引用类型的变量,可以在常量表达式中使用,并且没有可变的子对象,而e是非易失性限定的非类类型表达式的一组潜在结果的一个元素,其中应用了lvalue-rvalue转换(conv.lval),或.

此外,ODR违规行为是不需要诊断的。对于缺少的定义,这在技术上是正确的。优化可能会删除odr-用途,使它们不会显示为错误。

尝试下面的odr-使用这个变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int *ptr = &X::n;

  1. 为什么可以在类定义中定义const静态数据成员?

不是的。类定义中的声明没有定义非内联const静态数据成员。如果变量是odr使用的,则需要有一个定义(类之外)。

  1. 为什么静态数据成员..。在类定义中可能没有定义(请参阅我关于带有静态成员的模板类和Stroustrup关于这个问题的想法(他欺骗我们了吗?)

Stroustrup关于“复杂的链接器规则”是正确的。当不可能在标头中定义静态变量时,就避免了这种情况。

关于模板的观点是有意义的。无论如何,这些复杂的链接器规则都需要使模板化的静态变量成为可能。并且能够定义甚至非模板的静态变量也有其优点。这些可能是委员会选择允许在C++17中的类定义中定义静态成员的原因。参见:inline静态成员定义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55250168

复制
相关文章
十三、表连接
表连接(JOIN)是在多个表中间通过一定的连接条件,使表之间发生关联进而能从多个表之间获取数据。简单的表连接语法如下:
喵叔
2021/06/25
8570
十三、表连接
Oracle表连接
  内连接:查询满足条件的结果集,是相对于外连接来说的(条件的话由很多种可以等于、不等于、大于、小于等等)。
翎野君
2023/05/12
7310
如何使用python连接MySQL表的列值?
MySQL 是一个开源关系数据库管理系统,广泛用于存储、管理和组织数据。使用 MySQL 表时,通常需要将多个列值组合成一个字符串以进行报告和分析。Python是一种高级编程语言,提供了多个库,可以连接到MySQL数据库和执行SQL查询。
很酷的站长
2023/08/11
3080
如何使用python连接MySQL表的列值?
面试之前,MySQL表连接必须过关!——表连接的原理
我们知道,所谓表连接就是把各个表中的记录都取出来进行依次匹配,最后把匹配组合的记录一起发送给客户端。比如下面把t1表和t2表连接起来的过程如下图
砖业洋__
2023/05/06
2K0
面试之前,MySQL表连接必须过关!——表连接的原理
连表查询的介绍_连接表
大家好,又见面了,我是你们的朋友全栈君。 1、连表查询的原因 (1)如果查询结果不在一个表中,在多个表中,那就需要将表关联,进行连表查询。 (2)连表查询大多数都作用在外键得基础上。—表与表之间有关
全栈程序员站长
2022/10/05
3.1K0
连表查询的介绍_连接表
MySQL之表连接
当需要同时显示多个表的字段时,就可以用表连接来实现这样的功能。从大类上分,表连接可分为内连接和外连接,它们之间的最主要区别是,内连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。
秋白
2019/02/21
2K0
MySQL之表连接
【MySql】表的内连接和外连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。
平凡的人1
2023/10/15
2960
【MySql】表的内连接和外连接
简单备份wordpress连接表
用过 wordpress 的朋友都知道,WordPress 可以导出 WordPress eXtended RSS 或 WXR 文件,它包含了您的全部文章、页面、评论、自定义域、分类目录和标签。我们可以在再次安装 WordPress 时导入它。那么WordPress 的链接表怎么备份呢?
空空裤兜
2023/03/03
6870
MySQL表的内外连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。而使用where进行笛卡尔积筛选的时候,后面必须跟着一个过滤条件,将不合理的数据筛选掉,并且这时候再跟着其他条件就需要and其他条件,所以这种方式的内连接虽然可以,但是容易将内连接的条件与其他约束条件混淆,不容易区分。
每天都要进步呀
2023/10/16
2160
MySQL表的内外连接
SQL三表连接查询
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135565.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/18
2.1K0
MySQL | 表的内连接
数据操作语言:表连接查询(一) 从多张表中提取数据 从多张表提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连接,产生 笛卡尔积。 规定了连接条件的表连接语句,就不会出现笛卡尔积。 # 查询每名员工的部门信息 SELECT e.empno,e.ename,d.dname FROM t_emp e JOIN t_dept d ON e.deptno=d.deptno; 表连接的分类 表连接分为两种:内连接 和 外连接 内连接是结果集中只保留符合连接条件的记录 外
Zkeq
2022/05/18
3.4K0
MySQL | 表的内连接
关于哈希表,你该了解这些!
首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。
代码随想录
2020/07/13
5830
学习日志——SQL几种表连接和连接效率
最近在进行一个数据展示的项目,问题是公司目前的情况是采集到了数据,将数据存入到了一个数据中心,然后就没有任何操作了。也就是说要从原始数据当中查询数据进行数据展示,这是一个很难受的过程,但是又是一个要必然经历的过程,因为原始数据来了之后,必然要通过实际的业务来检验数据的正确性,有效性和质量,然后就对应的业务数据进行清洗,提取存入业务库,方便以后的操作。然后后端代码基本上没怎么写,全部都思考查询sql应该怎么写了。
海加尔金鹰
2020/06/09
2.2K0
Oracle数据库 表连接与表设计
select deptno,e.ename,d.dname from emp e natural join dept d;
wolf
2020/09/21
2.2K0
Oracle表连接学习笔记
内连接:指表连接的结果只包含那些完全满足连接条件的记录。下面学习一下内连接的,给个例子,这里创建两张表,然后用内连接方式查询,看看例子:
SmileNicky
2019/06/25
9200
如何制作bom表_如何制作bom表
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/175678.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
3K0
树状数据库表查询2次以上(自连接、内连接、别名、邻接表)方法
https://www.cnblogs.com/kissdodog/p/3297894.html——这个讲清楚了。
hotqin888
2022/05/07
4530
执行计划之表连接1:连接树(Join Trees)
阅读官方在线文档无疑是学习Oracle最好的方法,本文参考在线文档介绍表连接以及连接树(Join Trees)。
SQLplusDB
2022/08/19
6550
执行计划之表连接1:连接树(Join Trees)
SAS中哈希表的连接问题
哈希表即散列表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。在SAS中使用哈希表十分简单,你并不需要知道SAS内部是怎么实现的,只需要知道哈希表是存储在内存中的,查找是根据key值直接获得存储的地址的精确匹配。加上使用哈希表合并数据集时不用排序的优点,在实际应用中可以极大的提高程序运行效率,尤其是数据集较大的时候。但是由于哈希表是放到内存中的,因此对内存有一定要求!
专业余码农
2020/07/15
2.4K0
点击加载更多

相似问题

当键是数字时,python字典

10

混合字典排序和数字排序

11

当数字的数字分开时对它们进行排序

10

当数字被重复时,数据读取

21

仅当没有重复的数字时才打印数字

60
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文