Mar*_*ett 192 c++ constructor c++-faq default-constructor most-vexing-parse
有没有什么好的理由在C++中调用默认构造函数时,一组空的圆括号(括号)无效?
MyObject object; // ok - default ctor
MyObject object(blah); // ok
MyObject object(); // error
Run Code Online (Sandbox Code Playgroud)
我似乎每次都自动输入"()".是不是有一个很好的理由不允许这样做?
Con*_*tin 159
最烦恼的解析
这与所谓的"C++最令人烦恼的解析"有关.基本上,任何可以被编译器解释为函数声明的东西都将被解释为函数声明.
同一问题的另一个例子:
std::ifstream ifs("file.txt");
std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());
Run Code Online (Sandbox Code Playgroud)
v
被解释为具有2个参数的函数声明.
解决方法是添加另一对括号:
std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());
Run Code Online (Sandbox Code Playgroud)
或者,如果您有C++ 11和列表初始化(也称为统一初始化)可用:
std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};
Run Code Online (Sandbox Code Playgroud)
有了这个,就无法将其解释为函数声明.
180*_*ION 104
因为它被视为函数的声明:
int MyFunction(); // clearly a function
MyObject object(); // also a function declaration
Run Code Online (Sandbox Code Playgroud)
您还可以使用更详细的构造方式:
MyObject object1 = MyObject();
MyObject object2 = MyObject(object1);
Run Code Online (Sandbox Code Playgroud)
在C++ 0x中,这也允许auto
:
auto object1 = MyObject();
auto object2 = MyObject(object1);
Run Code Online (Sandbox Code Playgroud)