【发布时间】:2019-08-06 12:17:22
【问题描述】:
考虑
struct A1 {
constexpr A1& operator=(const A1&) = default;
~A1() {}
};
struct A2 {
constexpr A2& operator=(const A2&) = default;
~A2() = default;
};
struct A3 {
~A3() = default;
constexpr A3& operator=(const A3&) = default;
};
GCC 和 MSVC 接受所有三个结构。 Clang 拒绝 A1 和 A2(但接受 A3),并显示以下错误消息:
<source>:2:5: error: defaulted definition of copy assignment operator is not constexpr constexpr A1& operator=(const A1&) = default; ^ <source>:6:5: error: defaulted definition of copy assignment operator is not constexpr constexpr A2& operator=(const A2&) = default; ^ 2 errors generated.
哪个编译器是正确的,为什么?
【问题讨论】:
-
好问题。以下只是一个猜测......我们知道函数中的
constexpr并不意味着const。这意味着该函数是否可以在编译时计算。静默创建的复制赋值运算符前面没有constexpr。这意味着您拥有的constexpr是对静默创建的重载。然而,重载不能被默认,这解释了错误。查看以下 3 个代码示例:1) (clang) rextester.com/WLGFD87794, 2) (gcc) rextester.com/RMWQ86797, 3) (vc++) rextester.com/MXIHQ50551。
标签: c++ language-lawyer c++17 constexpr