C++嵌套构造函数调用与函数声明
C++ nested constructor calls vs. function declaration
以下代码部分中标记为"版本1"answers"版本2"的代码段之间有什么区别:
int main() {
using namespace std;
typedef istream_iterator<int> input;
// version 1)
//vector<int> v(input(cin), input());
// version 2)
input endofinput;
vector<int> v(input(cin), endofinput);
}
据我所知,"版本1"被视为函数声明。但我不明白返回类型为vector<int>
的结果函数v
的参数是什么。
为什么
因为标准或多或少地说,任何可能被解释为函数声明的东西,在任何上下文中,无论发生什么,都将是函数声明。
什么论点。。。
你可能不相信,但这是真的。将CCD_ 3处理为CCD_;在这个地方,括号是允许的,而且毫无意义。然而,input()
不被视为声明没有名称的input
类型的参数;相反,它是input(*)()
类型的参数,即指向不带参数并返回input
的函数的指针。显然,(*(部分在声明类型时是不必要的。我想也是出于同样的原因,当你使用函数名初始化函数指针时,&
是可选的。。。
另一种解决方法是,利用我们无论如何都要单独声明值的事实来证明跳过typedef:是合理的
istream_iterator<int> start(cin), end;
vector<int> v(start, end);
另一种方法是以函数声明不允许的方式添加括号:
vector<int> v((input(cin)), input());
有关更多信息,请访问谷歌"c++最令人烦恼的解析"。
这被称为最麻烦的解析:
这个片段:
input()
可以作为消除歧义
- 变量类输入的变量定义,采用类输入的匿名实例或
- 函数的函数声明,该函数返回类型为input的对象并接受单个(未命名(参数,该参数是返回类型input(不接受输入(的函数
大多数程序员都期望第一个,但C++标准要求将其解释为第二个。
vector<int> v(input(cin), input());
这个函数声明的参数是:
input(cin)
-是一个对象input (*)()
—它是指向返回input
且不带参数的函数的指针
相关文章:
- Visual Studio中的函数声明和函数定义问题
- 为什么函数声明中允许 const?
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- * 和 ** 在 C++ 函数声明中是什么意思?
- 构造函数/函数声明参数列表中的统一初始化
- 在将函数声明为友元时,尖括号的含义是什么?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 如何正确编写指针函数声明?
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 为什么要将函数声明和定义放在单独的文件中
- 为什么系统日志有两个不同的函数声明?
- 我如何获取数组的大小,以便我可以从函数声明所述数组
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- JavaScript 中的一等函数和 C++ 中的函数声明
- C++ 通过函数声明后初始化向量
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- C++ 17 个友元函数声明和内联命名空间
- MSVC 2017 - 错误 - 如何将模板类 X 的模板成员函数声明为嵌套类 X::Y 的好友
- 将派生类的构造函数声明为父类的友元
- 用于从 ANSI 字符串转换为 std::basic_string <TCHAR>的正确函数声明