【发布时间】:2019-04-12 07:29:41
【问题描述】:
根据Copy assignment operator上的C++参考:
如果以下任何一项为真,则将类 T 的默认复制赋值运算符定义为删除
T 有一个非类类型(或其数组)的非静态数据成员,即 const ...
我希望创建一个案例,其中我有一个 const 类类型数据成员和一个未定义为已删除的默认复制赋值运算符。在这样做的过程中,我发现了 clang 和 gcc 之间的差异。考虑以下代码:
struct B {
void operator=(const B&) const {}
};
struct A {
const B b{};
A& operator=(const A&) = default;
};
int main() {
A a1{}, a2{};
a1 = a2; //only works with clang
B b1{}, b2{};
b1 = b2; //works in both
}
当我使用 g++ -std=c++14 编译它时,我收到以下错误:
In member function ‘A& A::operator=(const A&)’:
error: non-static const member ‘const B A::b’, can’t use default assignment operator
note: synthesized method ‘A& A::operator=(const A&)’ first required here
但是,逗号确实可以使用clang 进行编译,因为参考似乎表明它应该这样做。我错了吗?哪个编译器是正确的?
我正在使用gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) 和clang version 6.0.0-1ubuntu2。
【问题讨论】:
-
一般而言,您希望使用
C++,因为与 C++ 版本特定标签相比,这为问题提供了更广泛的受众。
标签: c++ g++ c++14 clang++ assignment-operator