奇怪的编译错误

时间:2011-12-02 07:31:39

标签: c++ stl

  

可能重复:
  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));       
}

1 个答案:

答案 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);