假设我在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 类的复制构造函数(这里是编译器生成的和公共的)。这段代码在最近的编译器上也能很好地编译(我试过 g++-4.4 和 Intel 11.0),但是旧的编译器(比如 g++-4.2 和 g++-4.0)试图调用 B 的复制构造函数,我声明它是私有的,导致:
test.cxx:在构造函数'C::C()'中: test.cxx:7:错误:'B::B(const B&)' 是私有的 test.cxx:16:错误:在此上下文中
现在,在我的构建系统中,我想检查编译器是否支持上述代码。然而,问题是,这是符合标准的代码吗?这种测试的正确名称是什么?
编辑:对不起,英特尔编译器版本 10.1 和 11.0 都发出以下内容:警告 #734:“B::B(const B &)”(在第 6 行声明),需要被删除的副本,无法访问