问询:输入实数时complex<Type>对象虚部置零是否有标准保证
关于C++复数输入格式的标准依据问题
你在g++ 5.4.0环境里测试的这段代码:
complex<double> cmp; cin >> cmp; // 输入3或(3)(非(3,0)) cout << "cmp = " << cmp << "\n";
得到cmp = (3,0)、虚部自动置0的行为,其实是有明确标准依据的,咱们来拆解一下:
首先你引用的N4140 §26.4.6-12确实提到了复数提取支持三种格式:u、(u)、(u,v),虽然它没有直接写“虚部默认设为0”,但结合标准的上下文逻辑,这个行为是被保证的。
看标准里对复数输入操作的设计:这三种格式都是合法的输入形式,每种格式对应复数的明确状态:
- 当输入是
u或者(u)时,意味着只提供了实部信息,此时虚部必然会被初始化为0值——这是标准对这种输入格式的隐含约定,否则只给实部的输入格式就没有意义了。 - 而
(u,v)则对应实部u、虚部v的明确赋值。
再结合§27.7.2.2(输入操作符的具体实现规范),里面虽然没有重复写虚部的默认值,但复数类型的提取函数必须遵循“合法输入格式对应合法复数状态”的原则,所以虚部置0是标准要求的行为,不是编译器的私有用法。
简单说:标准既然允许u和(u)作为复数的输入格式,就必然要定义这种格式对应的复数状态——也就是虚部为0,这是逻辑上的必然,也是标准隐含的明确规则。
内容的提问来源于stack exchange,提问作者ynn
相关产品推荐
相关产品推荐

