【发布时间】:2015-10-10 22:32:33
【问题描述】:
在一个 probject 中,我使用了类似于以下的代码:
class C {
public:
C() {}
C(const C&) = delete;
};
C f() {
return C();
}
int main() {
f();
}
在我使用过的所有 Visual C++ 编译器(截至 2013 年)中,这从来都不是问题。但是当我尝试使用新的 Visual C++ 2015 编译器编译它时,我收到以下错误:
1>c:\devel\c++11\playground\main.cpp(10): error C2280: 'C::C(const C &)': attempting to reference a deleted function
1> c:\devel\c++11\playground\main.cpp(6): note: see declaration of 'C::C'
我不确定它以前为什么会起作用,但我认为由于返回值优化,调用了默认构造函数而不是复制构造函数。
我使用的代码甚至是合法的 C++ 吗?如果不是,那么在不需要我的类C 的复制构造函数的情况下实现此代码的正确方法是什么?我当然可以使用移动构造函数,但我假设代码在 C++11 之前永远不会是有效的 C++?
【问题讨论】:
-
如果我没记错的话,VS 直到 VS2013 才实现 `=delete;` 语法,所以当你说“在我使用的所有以前的 Visual C++ 编译器中(直到 2013 年),从来没有一个问题”,你的意思是“在 VS2013 中,这不是问题”?
-
在VS2013之前,我只是使用了复制构造函数声明,没有实现,如果实际使用会导致链接器错误。
标签: c++ visual-studio visual-c++ visual-studio-2015