【发布时间】:2011-11-02 11:52:43
【问题描述】:
(使用 Visual C++ 2010,在调试中编译并关闭优化)
我有以下非常简单的类:
class exampleClass
{
public:
exampleClass()
{
cout << "in the default ctor" << endl;
}
private:
exampleClass (const exampleClass& e)
{
cout << "in the copy ctor" << endl;
}
};
当我尝试使用以下 main 编译它时:
#include <iostream>
using namespace std;
int main()
{
exampleClass e1=exampleClass();
return 0;
}
我得到编译错误:
'exampleClass::exampleClass' : cannot access private
member declared in class 'exampleClass'
当我从复制ctor中删除访问修饰符“private”时,程序编译并打印only:
in the default ctor
为什么会这样?如果编译器无论如何都不会调用复制 ctor,为什么它会困扰我?
由于有些人错过了第一行(至少在一些编辑之前),我会重复一遍:
我在调试中编译时关闭了优化。
【问题讨论】:
-
我怀疑编译阶段确实使用了复制构造函数,但优化阶段(在编译阶段之后)将其删除。所以这个错误是有道理的。好吧,从语义上讲,无论如何-您确实在那里使用了副本。但这只是我的猜测,我不知道编译器是如何工作的。附带说明 - 你为什么不改用
exampleClass e1();呢?它也更短。 -
复制省略是一种可能的优化,但不是必须的;生成的可执行文件必须以与没有优化的可执行文件相同的方式工作。
-
Vlix,我关闭了所有的优化(正如我开头提到的,我在调试中编译)。关于你的旁注——我只是想更好地理解 c++ 程序的编译,结果出现了这个(减少的)错误。
-
“必须以同样的方式工作”——我也这么认为,但对于 RVO (en.wikipedia.org/wiki/Return_value_optimization) 来说不是这样
标签: c++