对构造函数的调用可以被视为函数声明

call to constructor can be considered as function declaration?

本文关键字:函数 声明 构造函数 调用      更新时间:2023-10-16

接下来我要写的几行来自"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= 赋值表达式

希望您可以遵循这些语法定义,以查看确实允许使用括号,但如果没有,请询问,我会尝试澄清。