【发布时间】:2017-06-05 20:41:36
【问题描述】:
在我看来,C++ 标准存在不一致之处,特别是在 C++17 草案 (N4659) 的第 30.7.5.2.4 节中,关于何时在输出流的格式化输出操作中加宽字符( operator<<())。完全相同的不一致似乎反映在en.cppreference.com 中。
首先,假设以下声明:
std::ostream out;
std::wostream wout;
char ch;
wchar_t wch;
const char* str;
const wchar_t* wstr;
然后声明
-
out << ch不执行字符加宽, -
out << str执行字符加宽, -
wout << ch执行字符加宽, -
wout << str执行字符加宽, -
wout << wch不执行字符加宽, -
wout << wstr执行字符加宽。
第一个也是最明显的不一致是 (6) 不可能为真,因为没有 widen() 函数采用 wchar_t 参数,只有一个采用 char 参数。
第二个(表面上的)不一致在 (1) 和 (2) 之间。 out << "x" 应该扩大 'x',而 out << 'x' 不应该扩大,这对我来说似乎很奇怪。
我误解了标准文本,还是那里有什么问题?如果后者是真的,你知道预期的行为是什么吗?
编辑:显然,这种不一致(如果我是对的)至少从 C++03(第 27.6.2.5.4 节)开始就存在于标准中。文本通过中间标准略有变化,但我在上面解释过的不一致仍然存在。
【问题讨论】:
-
这应该是 LWG 问题。
-
"... 如果 c 的类型为 char 并且流的字符类型不是 char ,则 seq 由 out.widen(c) 组成;否则 seq 由 c 组成......" 抱歉,我的英语(一般理解,为什么不)不太好;你能指出你发现不一致的句子之一吗?
-
@Loreto 在标准的任何一个句子中都没有真正的不一致。正如我上面所描述的,(1)和(2)似乎相互冲突,Dietmar 确认(1)是正确的,而(2)是错误的(由于措辞不当而导致错误)。
标签: c++ stl language-lawyer ostream