是否为get_time定义了重复分配?

Is Repeated Assignment Defined for get_time?

本文关键字:分配 定义 get time 是否      更新时间:2023-10-16

我正在研究这个答案。我遇到了一个难题:scanf有一个任务抑制'*'

如果此选项存在,则函数不会将转换结果分配给任何接收参数

但是当在get_time中使用时,'*'在Visual Studio,libc ++和libstdc ++上给出了运行时错误:str >> get_time(&tmbuf, "%T.%*Y")所以我认为它不受支持。

因此,我选择通过两次阅读tmbuf.tm_year来忽略输入:

str >> get_time(&tmbuf, "%H:%M:%S.%Y UTC %b %d %Y");

这有效,并且似乎是我唯一的选择,因为'*'不被接受get_time。但众所周知,仅仅因为它有效并不意味着它被定义。有人可以确认:

  1. 它被定义为在get_time中分配两次相同的变量
  2. 流将始终从左到右读取,因此 1 次%Y发病将被踩踏,而不是第 2 次

该标准指定了处理22.4.5.1.1time_get成员中get_time格式字符串的确切算法。(time_get::get是当你做str>>get_time(...)时最终被称为)。我引用重要的部分:

该函数首先计算err = ios_base::goodbit。然后它进入循环,在每次迭代时从s中读取零个或多个字符。除非下面另有规定,否则当满足以下第一个条件时,循环将终止:

(8.1) — 表达式的计算结果为 truefmt == fmtend

跳过镗削错误处理零件

(8.4) —fmt的下一个元素等于’%’,可以选择后跟修饰符字符,后跟转换说明符字符、格式,共同构成对 ISO/IEC 9945 功能strptime有效的转换规范。跳过无聊的错误处理部分该函数评估s = do_get(s, end, f, err, t, format, modifier)跳过更多无聊的错误处理部分,该函数fmt递增到刚好指向转换规范的末尾并继续循环。

从描述中可以看出,格式字符串严格按照从左到右的顺序进行处理。没有专门处理重复转换规范的规定。所以答案一定是肯定的,你所做的是它的定义明确且完全合法。