C ++:“不合逻辑的”析构函数行为

时间:2015-10-18 18:11:58

标签: c++ c++11 gcc closures destructor

我想用for_each打印一个矢量。

using namespace std;
struct Print {
   int z = 0;
   void operator()(int i) {
      if (z) cout << ' ';
      cout << i;
      z = 1;
   }
   ~Print() {
      if (z) cout << endl;
   }
};
main() {
   vector<int> v = {1, 2, 3, 4, 5};
   for_each(begin(v), end(v), Print());
}

它工作错误,它调用析构函数两次并打印两个换行而不是一行。为什么?任何人都可以解释这种奇怪行为的逻辑吗? BTW它可以与丑陋的全局变量一起使用。

int z;
struct Print {
   void operator()(int i) {
   . . .
};

我正在使用GCC。

3 个答案:

答案 0 :(得分:3)

不是&#34;错误&#34;。您忘记了谓词被复制,至少一次。事实上,谓词被多次复制是合法的。你的班级应该考虑到这一点;并且 not 使其成员static(打破后续调用)。 std::for_each并非真正适合这项工作的工具。

答案 1 :(得分:1)

检查for_each的签名

template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );

返回函数对象的副本。

答案 2 :(得分:0)

我找到了更好的解决方案。两个构造函数都应明确包含在Print类中。

Print() {}
Print(const Print&) {}

感谢Bo Persson和Gene解释逻辑。