空圆括号(小括号)表示调用C++中的默认构造函数,在这种情况下,是否存在任何合理的原因使其无效?
MyObject object; // ok - default ctor
MyObject object(blah); // ok
MyObject object(); // error
我似乎每次都会自动输入“()”。这样做不允许有好的理由吗?
空圆括号(小括号)表示调用C++中的默认构造函数,在这种情况下,是否存在任何合理的原因使其无效?
MyObject object; // ok - default ctor
MyObject object(blah); // ok
MyObject object(); // error
我似乎每次都会自动输入“()”。这样做不允许有好的理由吗?
最令人烦恼的解析
这与所谓的"C++最令人烦恼的解析"有关。基本上,任何编译器可以解释为函数声明的内容都将被解释为函数声明。
同样问题的另一个实例:
std::ifstream ifs("file.txt");
std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());
v
被解释为带有2个参数的函数声明。
解决方法是添加另一对括号:
(v
)
std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());
或者,如果您有C++11和列表初始化(也称为统一初始化)可用:
std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};
有了这个,它就不可能被解释为函数声明。
extern "C" foo();
这样的语法在 C++ 中也是允许的。 - Marc Mutz - mmutzstd::istream_iterator
,而是指向一个没有参数并返回 istream_iterator
的函数的指针/引用。 - CTMacUser因为它被视为一个函数的声明:
int MyFunction(); // clearly a function
MyObject object(); // also a function declaration
object()
函数,你能详细解释一下吗?我现在有点困惑。非常感谢您的帮助! - Milanmain
函数中,我甚至尝试了这些:any_variable_name random_function_name()
,例如 int func1()
、double func2()
、void func3()
等等,它们都可以正常工作,也就是说我的程序编译时没有出现任何错误!然而,我并没有定义这些函数,所以应该会出错才对,不是吗? - Milan相同的语法也用于函数声明 - 例如,函数 object
接受零参数并返回 MyObject
编译器认为这是一个不带参数并返回MyObject实例的函数声明。
例如:
MyObject object1 = MyObject();
MyObject object2 = MyObject(object1);
auto
:auto object1 = MyObject();
auto object2 = MyObject(object1);
如多次提到的那样,这是一个声明。为了向后兼容而采用这种方式。由于其历史遗留问题,C++存在许多不一致、痛苦和虚假的领域。
正如其他人所说,这是一个函数声明。自C++11以来,如果您需要看到明确告诉您使用默认构造函数的空something,则可以使用大括号初始化。
Jedi luke{}; //default constructor
()
时不会给出任何错误,例如MyObject object
会像往常一样工作,而MyObject object()
不会给出任何错误!请问有人能解释一下为什么吗?我的意思是我没有在main
中定义这个函数...所以它应该会报错,对吧?提前感谢! - Milan