调用构造函数可以视为函数声明吗?

xcr*_*ypt 4 c++ stl

我将要编写的下几行来自"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>()));
Run Code Online (Sandbox Code Playgroud)

不要忘记初始化程序参数周围的额外括号.否则,此表达式会执行一些非常不同的操作,您可能会在以下语句中收到一些奇怪的警告或错误.考虑在没有额外括号的情况下编写语句:

std::deque<int> c(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>());
Run Code Online (Sandbox Code Playgroud)

在这种情况下,c声明一个返回类型为deque的函数.它的第一个参数是类型为istream_iterator,名称为cin,其第二个未命名参数的类型为"不带参数的函数返回istream_iterator".此构造在语法上作为声明或表达式有效.因此,根据语言规则,它被视为声明.额外的括号强制初始化程序不匹配声明的语法.

我可以看到为什么带有额外括号的那个不被认为是一个函数声明,但我看不出是什么会使一个没有成为函数声明呢?因为它有括号(std::cin),据我所知,变量可能没有带括号的名字?

我错过了什么吗?

ybu*_*ill 5

你读的教程是错误的.这个:

std::deque<int> c(std::istream_iterator<int>(std::cin), std::istream_iterator<int>());
Run Code Online (Sandbox Code Playgroud)

无法解析为函数声明,因为std::cin它不能是参数的名称.如果删除std限定符,则:

std::deque<int> c(std::istream_iterator<int>(cin), std::istream_iterator<int>());
Run Code Online (Sandbox Code Playgroud)

然后你得到一个函数声明.

[...]据我所知,变量可能没有带括号的名字?

括号不是名称的一部分.你可以把它们放在那里,你喜欢多少:

int ((((((a)))))) = 12345; // valid code!
a++; // the variable is named 'a'
Run Code Online (Sandbox Code Playgroud)