Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 语句“vectormyvector()”的作用是什么?(关于无参数构造函数的混淆)_C++ - Fatal编程技术网

C++ 语句“vectormyvector()”的作用是什么?(关于无参数构造函数的混淆)

C++ 语句“vectormyvector()”的作用是什么?(关于无参数构造函数的混淆),c++,C++,我希望有人能澄清我的困惑,关于尝试使用无参数构造函数的语法。现在,我推断正确的语法要么没有括号: foo myfoo; vector<int> myvector; 因此,我从上面收集到,表单someClass someInstance没有实现我期望的功能,即使用无参数构造函数实例化对象,但它确实实现了一些功能。那么它到底做什么呢?这不是构造对象的有效方法。如果试图通过键入以下内容调用无参数构造函数: MyType mytype(); 编译器将其解释为一个名为mytype的函数的声

我希望有人能澄清我的困惑,关于尝试使用无参数构造函数的语法。现在,我推断正确的语法要么没有括号:

foo myfoo;
vector<int> myvector;

因此,我从上面收集到,表单someClass someInstance没有实现我期望的功能,即使用无参数构造函数实例化对象,但它确实实现了一些功能。那么它到底做什么呢?

这不是构造对象的有效方法。如果试图通过键入以下内容调用无参数构造函数:

MyType mytype();
编译器将其解释为一个名为mytype的函数的声明,该函数返回mytype且不接受任何参数。由于编译器认为我们在声明一个函数,因此后续将mytype视为对象的尝试失败

这被称为最令人烦恼的解析,因为它的微妙之处;你远远不是第一个成为受害者的人

至于原因,我只能猜测,但这里有一些理由:

从概念意义上讲,忽略标准,从逻辑上考虑语法结构,声明是不明确的。这样声明一个函数是完全有效的,但是对于一个没有参数构造函数的对象也是完全有效的

行为应该是一致的,例如,不管该语法是作为函数声明还是构造函数调用解析的,它都应该是一个而不是另一个

如果省略括号,很明显我们实际上是在创建一个对象,并且会自动调用no-arg构造函数。因此,无参数构造函数调用存在明确的语法

在没有括号的情况下,没有方便的方法来声明函数。从技术上讲,它可以用typedefs来完成,但是来吧?您真的想要一种语言,其中每个no-arg函数都必须在typedef中声明其类型吗?。因此,函数声明不存在这样明确的语法

因此,将此语法视为函数声明是有意义的,因为没有其他方法来声明函数,而有其他方法来创建对象


同样,纯粹的猜测,但对我来说是有意义的。

vector myvector;声明一个返回类型的函数vector@billz当前位置我认为一个更有趣的问题是它为什么会这样做?什么时候有用,也就是说,什么时候这才是你真正想要的?@Mehrdad,我喜欢唯一的答案为什么是因为标准上这么说。@chris:所以它绝对没用?@Mehrdad在转发声明中使用:+1。因为我在调用glm::vec3 vert,它给了我一个未定义的引用,所以我把头发拔了很长时间。当时,我认为所有未定义的引用都意味着你忘了链接一些东西。如果省略括号,很明显我们实际上是在创建一个对象,并且无参数构造函数将被自动调用。因此,无参数构造函数调用存在明确的语法。不幸的是,事情并非如此简单。这就是C++11中统一初始化的一个原因:intx;未初始化,但int x{};值初始化为0。类似地,对于一些没有用户提供的类,例如@dyp 1,请参见我的编辑。2如果不提供ctor,您希望如何初始化类?用户提供在C++11中有特殊含义,默认或删除的默认构造函数不是用户提供的。此外,可以通过struct my_aggregate{int x;double y;};my_聚合my_对象={4,2.5};
foo myfoo();
vector<int> myvector();
myvector.push_back(1);  // "Error: expression must have class type"
MyType mytype();