IDE - Visual Studio Express 2013 for Desktop
C ++ 11
问题 - 我有一个显然被复制的类(使用复制构造函数)。如果我声明这样的复制构造函数:
MyClass(const MyClass&) = delete;
它抱怨对已删除功能的引用。我现在已经完成了两次我的整个代码,无法找到复制类的实例的位置。
有没有办法找到引用的来源?
我已经尝试过定义复制构造函数,其中包含断点,但它永远不会被命中。
对不起它确实显示了引用的位置 - 在STL中的某个分配器中。我设法将其跟踪到std :: vector :: emplace_back()调用 - 这必须导致副本。我会调查一下。
我是个笨蛋 - 我有一个MyClass的载体......
答案 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;
^
所以,你实际上有两个问题:
您的编译器有错误。这只能通过升级到新版本来解决,如果/当一个版本可用时。
您的代码会调用不允许复制的类的复制构造函数。
第二个问题可以通过考虑C ++何时“间接”复制对象的规则来解决 - 或者要求复制构造函数存在,即使实际复制已被优化。再次检查代码,查找以下情况:
void f(MyClass obj);
。MyClass f();
。throw MyClass();
第一个很容易修复:
void f(MyClass const &obj);
其他人需要进行更彻底的重新设计,因为返回或投掷与防止复制的想法相矛盾。