可能重复:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?
小件代码无法成功编译 Microsoft Visual Studio 2005
#include <iterator>
#include <algorithm>
#include <vector>
#include <iostream>
int main()
{
std::vector<int> a;
std::istream_iterator<int> be(std::cin);
std::istream_iterator<int> en();
std::copy(be, en, std::back_inserter(a));
}
但是这个没问题
#include <iterator>
#include <algorithm>
#include <vector>
#include <iostream>
int main()
{
std::vector<int> a;
std::istream_iterator<int> be(std::cin);
std::istream_iterator<int> en; //Same to upon, only here less '()'
std::copy(be, en, std::back_inserter(a));
}
答案 0 :(得分:4)
在第一种情况下,en
被声明为函数,而不是变量。这是C ++语法中存在的许多陷阱之一,难以解析C ++程序。
所应用的规则或多或少“如果它既可以作为声明也可以作为定义进行解析,那么它就被视为声明”并且由Scott Meyers命名为“most vexing parse”。在您的情况下,第二行可以看作类似于
inf foo();
因此被视为功能声明。请注意,这个相同的陷阱可能更加微妙:
double x = 3.141592654;
int y(int(x));
这里第二行也是函数的声明,因为语言规则在这里说明x
周围的括号可以忽略,因此意思是int y(int x);
。