查找引用已删除函数的位置

时间:2014-07-05 09:32:00

标签: c++ visual-c++ c++11 copy-constructor deleted-functions

IDE - Visual Studio Express 2013 for Desktop

C ++ 11

问题 - 我有一个显然被复制的类(使用复制构造函数)。如果我声明这样的复制构造函数:

MyClass(const MyClass&) = delete;

它抱怨对已删除功能的引用。我现在已经完成了两次我的整个代码,无法找到复制类的实例的位置。

有没有办法找到引用的来源?

我已经尝试过定义复制构造函数,其中包含断点,但它永远不会被命中。

更新

对不起它确实显示了引用的位置 - 在STL中的某个分配器中。我设法将其跟踪到std :: vector :: emplace_back()调用 - 这必须导致副本。我会调查一下。

更新2

我是个笨蛋 - 我有一个MyClass的载体......

1 个答案:

答案 0 :(得分:3)

您可能遇到过以下编译器错误

http://connect.microsoft.com/VisualStudio/feedback/details/889420/issue-with-delete

它表示IDE(IntelliSense)抱怨而编译器没有,这可以解释为什么你没有发布任何编译器错误消息,以及为什么你可以在第一时间实际执行带断点的编译程序。

错误本身很容易重现:

struct Example
{
  Example() {}
  Example(Example const &) = delete;
};

Example f()
{
  return Example();
}

int main()
{
  Example e = f();
}

使用VC 2013编译:

cl /nologo /EHsc /W4 /Za stackoverflow.cpp

没有错误,没有警告。

现在,如果您转到http://www.compileonline.com/compile_cpp11_online.php并使用GCC 4.7.2编译完全相同的代码,那么 预期的编译器错误:

main.cpp: In function ‘Example f()’:
main.cpp:9:18: error: use of deleted function ‘Example::Example(const Example&)’
   return Example();
                  ^
main.cpp:4:3: error: declared here
   Example(Example const &) = delete;
   ^
main.cpp: In function ‘int main()’:
main.cpp:14:17: error: use of deleted function ‘Example::Example(const Example&)’
   Example e = f();
                 ^
main.cpp:4:3: error: declared here
   Example(Example const &) = delete;
   ^

所以,你实际上有两个问题:

  1. 您的编译器有错误。这只能通过升级到新版本来解决,如果/当一个版本可用时。

  2. 您的代码会调用不允许复制的类的复制构造函数。

  3. 第二个问题可以通过考虑C ++何时“间接”复制对象的规则来解决 - 或者要求复制构造函数存在,即使实际复制已被优化。再次检查代码,查找以下情况:

    • 按值传递。 void f(MyClass obj);
    • 按价值返回。 MyClass f();
    • 投掷。 throw MyClass();

    第一个很容易修复:

    void f(MyClass const &obj);

    其他人需要进行更彻底的重新设计,因为返回或投掷与防止复制的想法相矛盾。