【发布时间】:2018-08-30 11:39:49
【问题描述】:
根据http://www.cplusplus.com/reference/complex/complex/complex/,complex<double> 类具有complex (double re = 0.0, double im = 0.0); 形式的默认构造。但是,我不知道这是否真的正确。谁能解释下面代码的奇怪行为?
#include <iostream>
#include <complex>
#include <typeinfo>
using namespace std;
int main() {
complex<double> cmp1(1, 2);
complex<double> cmp2(1); //isn't the same as cmp2(1, 0.0) ?
complex<double> cmp3(); //isn't the same as cmp3(0.0, 0.0) ?
cout << cmp1.real() << "\n"; //=> 1
cout << cmp1.imag() << "\n"; //=> 2
cout << cmp2.real() << "\n"; //=> 1
cout << cmp2.imag() << "\n"; //=> 0
//cout << cmp3.real() << "\n"; //error (why?) //mark1
//cout << cmp3.imag() << "\n"; //error (why?)
/* error message output by `mark1`: */
/* request for member ‘real’ in ‘cmp3’, which is of */
/* non-class type ‘std::complex<double>()’ */
cout << cmp3 << "\n"; //=> 1 (why?)
cout << typeid(cmp1).name() << "\n"; //=> St7complexIdE
cout << typeid(cmp2).name() << "\n"; //=> St7complexIdE
cout << typeid(cmp3).name() << "\n"; //=> FSt7complexIdEvE
}
环境:
$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
编译选项:
$ g++ -Wall -std=c++98 <file name>
【问题讨论】:
-
最麻烦的解析? --> Nope.
-
这是一个函数声明。搜索“令人烦恼的解析”。
-
恭喜,你现在是MVP
-
complex<double> cmp3();声明了一个名为cmp3的函数,不带任何参数并返回一个complex<double>。 -
complex<double> cmp3();是一个名为cmp3()的函数的声明,它不接受任何参数并返回complex<double>。如果要声明complex<double>类型的变量,请删除()。
标签: c++ most-vexing-parse