这是这个问题的后续内容
在下面的代码中,为什么第1行编译而第2行和第3行不编译(使用visual C++ 2010)
class ABase
{
protected:
ABase() {}
~ABase() {}
private:
ABase( const ABase& );
const ABase& operator=( const ABase& );
};
class A : ABase
{
};
class B
{
public:
B() {}
~B() {}
private:
B( const B& );
const B& operator=( const B& );
};
int main( void )
{
A a = A(); // line 1
A a2( a ); // line 2
B b = B(); // line 3
return 0; …Run Code Online (Sandbox Code Playgroud) 如果我写
T t = T();
Run Code Online (Sandbox Code Playgroud)
T是一个班级.
我认为这是调用T的默认构造函数,然后是复制赋值运算符.但是允许编译器去除赋值.
我试图找到用C++标准编写的这种行为的描述,但我找不到它.你能指出我在标准中的正确位置吗?
我问这个是因为我被要求更换这个:
T t;
Run Code Online (Sandbox Code Playgroud)
同
T t = T();
Run Code Online (Sandbox Code Playgroud)
因为编码规则检查程序.
并且它发生了T类是不可复制的并且具有私有拷贝构造函数和拷贝赋值运算符......所以我想看到编译器在这种情况下实际上总是去掉副本.
编辑: 我被一些奇怪的东西误导了:非compyable类实际上是从boost :: noncopyable继承的,在这种情况下它会编译.但是如果我将复制构造函数和复制赋值运算符声明为private,则它不会编译.为例.这编译:
class BA
{
protected:
BA() {}
~BA() {}
private:
BA( const BA& );
const BA& operator=( const BA& );
};
class A : BA
{
};
int main( void )
{
A a = A();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以下不是:
class A
{
public:
A() {}
~A() {}
private:
A( const A& );
const A& operator=( const A& ); …Run Code Online (Sandbox Code Playgroud)