查找被删除函数的引用位置
Finding where a deleted function is referenced
IDE - Visual Studio Express 2013 for Desktop
c++ 11问题-我有一个类,显然是被复制(使用复制构造函数)。如果我这样声明复制构造函数:
MyClass(const MyClass&) = delete;
它抱怨对已删除函数的引用。我已经把整个代码检查了两遍,仍然找不到类的实例要复制到哪里。
有办法找到引用的来源吗?
我已经尝试定义了复制构造函数,其中有一个断点,但它从未被击中。
<标题> 更新对不起,它实际上显示了引用的位置-在STL中的某个分配器中。我设法将其追踪到std::vector::emplace_back()调用-它必须引起复制。我将调查此事。
更新2
我真是个笨蛋-我有一个MyClass的向量…
标题>也许你遇到过以下的编译错误:
http://connect.microsoft.com/VisualStudio/feedback/details/889420/issue-with-delete它说IDE (IntelliSense)抱怨而编译器没有,这就解释了为什么你没有发布任何编译器错误消息,以及为什么你可以首先执行带有断点的编译程序。
bug本身很容易重现:
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;
^
所以,你实际上有两个问题:
你的编译器有一个bug。这只能通过升级到一个新的版本来解决,如果/当一个可用的
你的代码为一个不允许复制的类调用复制构造函数
- 按值传递。
void f(MyClass obj);
。 - 按值返回。
MyClass f();
。 - 扔。
throw MyClass();
第一个很容易修复:
void f(MyClass const &obj);
其他选项需要更彻底的重新设计,因为返回或丢弃直接与防止复制的想法相矛盾。
相关文章:
- 常量引用的内存位置
- 关于引用数组位置的问题
- Visual Studio 中的"指向引用的指针"错误不会按发生位置的文件名显示
- 包含具有无效位置的节点引用的方式
- 给定代码段中引用的时间和空间位置的所有出现
- 如何编写一个 void 函数,该函数将在数组中搜索值,并通过引用将该值的位置传递回 main 函数
- 不同的cclayer尺寸取决于块内引用的位置
- 引用变量何时合适,为什么?你能解释一下实际的语法和位置吗?
- 当通过引用传递时,通过传递链表在第n个位置添加元素不起作用
- 传递对STL向量中偏移位置的引用
- 为什么在按值传递指针之后再按引用传递指针会指向原始内存位置
- 对数组中特定位置的调试器友好零成本命名引用
- 查找shared_ptr引用计数递增的位置
- 如何使用变量名称引用数组位置
- 如何通过引用传递指针来更改指针指向的位置
- 在多个位置引用的对象
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- 在模板上下文中通过引用传递的参数的"const"限定符的位置
- 使用对std::向量的某些元素的引用,或这些元素在向量中的位置,对它们进行迭代
- 查找被删除函数的引用位置