是否为get_time定义了重复分配?
Is Repeated Assignment Defined for get_time?
我正在研究这个答案。我遇到了一个难题: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
。但众所周知,仅仅因为它有效并不意味着它被定义。有人可以确认:
- 它被定义为在
get_time
中分配两次相同的变量 - 流将始终从左到右读取,因此 1 次
%Y
次发病将被踩踏,而不是第 2 次
该标准指定了处理22.4.5.1.1time_get
成员中get_time
格式字符串的确切算法。(time_get::get
是当你做str>>get_time(...)
时最终被称为)。我引用重要的部分:
该函数首先计算
err = ios_base::goodbit
。然后它进入循环,在每次迭代时从s
中读取零个或多个字符。除非下面另有规定,否则当满足以下第一个条件时,循环将终止:(8.1) — 表达式的计算结果为 true
fmt == fmtend
。跳过镗削错误处理零件
(8.4) —
fmt
的下一个元素等于’%’
,可以选择后跟修饰符字符,后跟转换说明符字符、格式,共同构成对 ISO/IEC 9945 功能strptime
有效的转换规范。跳过无聊的错误处理部分该函数评估s = do_get(s, end, f, err, t, format, modifier)
跳过更多无聊的错误处理部分,该函数fmt
递增到刚好指向转换规范的末尾并继续循环。
从描述中可以看出,格式字符串严格按照从左到右的顺序进行处理。没有专门处理重复转换规范的规定。所以答案一定是肯定的,你所做的是它的定义明确且完全合法。
- 自定义先决条件对移动分配运算符有效吗
- C++ - 没有自定义交换功能的移动分配运算符?
- 将 RTOS 队列对象封装在仅具有静态分配的 IQueue 自定义接口中
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 自己的自定义向量类. 内存重新分配
- 在 for 循环中定义的临时数组,并分配给属于指针数组的指针
- 如何定义全局函数指针并分配给特定地址
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 当存在用户定义的移动分配运算符时,已删除模板移动分配运算符
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 动态分配自定义类的数组和重载运算符
- 如何在没有动态内存分配(堆)的情况下为可变大小数组(矢量)定义安全容器或视图
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- 为什么要对堆栈中的内存使用自定义动态内存分配?
- 自我分配变量的定义
- 如何将wchar_t字符串分配给用户定义类的 CString 成员
- 未定义 Lambda 复制分配运算符
- 如何使用boost ::与扩展STL容器的自定义容器分配
- 是否可以为 #define 分配定义的结果?
- 内存分配定义一个矩阵结构