对构造函数的调用可以被视为函数声明
call to constructor can be considered as function declaration?
接下来我要写的几行来自"C++标准库 - 教程和参考"一书。
使用标准输入进行初始化:
//read all integer elements of the deque from standard input
std::deque<int> c((std::istream_iterator<int>(std::cin)),
(std::istream_iterator<int>()));
不要忘记初始值设定项参数两边的额外括号 这里。否则,此表达式会执行非常不同的事情,而您 可能会在跟随时收到一些奇怪的警告或错误 语句。考虑编写不带额外括号的语句:
std::deque<int> c(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>());
在这种情况下,c 声明一个返回类型的函数 德克。它的第一个参数的类型是 istream_iterator 名称 cin,其第二个未命名参数的类型为"函数" 不理会istream_iterator。此构造 在语法上作为声明或表达式有效。所以 根据语言规则,它被视为声明。额外的 括号强制初始值设定项与 声明。
我可以看到为什么带有额外括号的那个不被视为函数声明,但是我看不出什么会让没有的那个变成函数声明?因为它在(std::cin)
周围有括号,据我所知,变量可能没有带括号的名称?
我错过了什么吗?
您阅读的教程是错误的。这:
std::deque<int> c(std::istream_iterator<int>(std::cin), std::istream_iterator<int>());
不能解析为函数声明std::cin
因为不能是参数的名称。但是,如果删除std
限定符:
std::deque<int> c(std::istream_iterator<int>(cin), std::istream_iterator<int>());
然后你会得到一个函数声明。
[...]据我所知,变量可能没有带括号的名称?
括号不是名称的一部分。你可以把它们放在那里,你喜欢多少:
int ((((((a)))))) = 12345; // valid code!
a++; // the variable is named 'a'
如果语句可以解析为函数原型或带有构造函数参数的变量声明,则函数原型优先。这与大多数人的期望相反,因此它被称为最令人烦恼的解析。
据我所知,变量可能没有带括号的名称
这是错误的假设;括号不是变量名称的一部分,它们只是被忽略(在这种情况下(。
从C++标准([dcl.decl](:
说明符:
- PTR 声明符
- noptr-declarator 参数和限定符尾随返回类型
PTR 声明符:
- noptr-declarator
- PTR 运算符 PTR 声明符
noptr-declarator:
- 声明符 ID 属性说明符选项
- noptr-declarator parameters-and-qualifiers
- noptr-declarator [ 常量表达式 opt ] 属性说明符opt
- ( PTR 声明符 (
和([dcl.fct](:
参数声明子句:
- 参数声明列表选项...选择
- 参数声明列表 ,...
参数声明列表:
- 参数声明
- 参数声明列表 , 参数声明
参数声明:
- 属性说明符opt decl-specifier-seq declarator
- 属性说明符opt decl-specifier-seq declarator = 赋值表达式
- 属性说明符 opt decl-specifier-seq abstract-declaratoropt
- 属性说明符 opt decl-specifier-seq abstract-declaratoropt= 赋值表达式
希望您可以遵循这些语法定义,以查看确实允许使用括号,但如果没有,请询问,我会尝试澄清。
- 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>的正确函数声明