gpt4 book ai didi

c++ - 在 C++ 的派生类中使用私有(private)复制构造函数进行对象切片

转载 作者:搜寻专家 更新时间:2023-10-31 00:23:49 25 4
gpt4 key购买 nike

假设我在 test.cxx 中有类似以下内容(并且我有意在 1 处进行对象切片):

class A {
};

class B : public A {
// prevent copy construction and assignment
B(const B& other);
B& operator=(const B& other);
public:
explicit B(){}
};

class C {
A m_a;
public:
explicit C() : m_a( B() ) {} // 1
};

我希望它能工作,因为在 1 中应该调用类 A 的复制构造函数(这里它是编译器生成的并且是公共(public)的)。这段代码在最近的编译器上也编译得很好(我试过 g++-4.4 和 Intel 11.0),但是旧的编译器(比如 g++-4.2 和 g++-4.0)试图调用 B 的复制构造函数,我声明它是私有(private)的,结果:

test.cxx: In constructor ‘C::C()’:test.cxx:7: error: ‘B::B(const B&)’ is privatetest.cxx:16: error: within this context

现在,在我的构建系统中,我想检查编译器是否支持上述代码。然而,问题是这是符合标准的代码吗?这种测试的正确名称是什么?

编辑:对不起,英特尔编译器版本 10.1 和 11.0 都发出以下消息:警告 #734:“B::B(const B &)”(声明在行6)、被淘汰的拷贝需要,无法访问

最佳答案

在这种情况下,我敢于不同意 Comeau。事实上,以下代码无法按预期编译,因为将右值绑定(bind)到 const 引用需要可访问的复制构造函数。

class A {
};

class B : public A {
B(const B& other);
B& operator=(const B& other);
public:
explicit B(){}
};

int main()
{
A const & a = B();
}

根据 8.5.3/2,“[...] 参数传递 (5.2.2) 和函数值返回 (6.6.3) 是初始化,”因此代码应该是格式错误的。

编辑:根据 C++03,我仍然坚信代码格式错误。然而,我刚刚阅读了 C++0x 工作草案的相关部分,它似乎不再需要复制构造函数可用。也许这就是当您从 gcc-4.2 移动到 gcc-4.3 时您的代码开始编译的原因。

编辑:澄清一下,B::B(const B &) 必须可访问的原因是 B()< 的绑定(bind)A::A(const A &) 的第一个参数(当然,在初始化 m_a 时调用)。

编辑: 关于 C++03 和 C++0x 之间的区别,litb 好心地找到了 relevant defect report .

关于c++ - 在 C++ 的派生类中使用私有(private)复制构造函数进行对象切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1304680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com