CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
Copy assignment operator in CRTP - gcc vs clang and msvc
以下代码(请参阅此问题(在由 gcc 8.2 编译时会导致错误,但被 clang 7.0.0 和 msvc 15.9.0 预览版 3 接受:
template<typename T>
struct B
{
void operator=(const T&) { }
void foo() { }
};
struct D : public B<D>
{
using B<D>::operator=;
using B<D>::foo; // hidden by D::foo
void foo() { }
};
int main()
{
D d1, d2;
d1 = d2;
d1.foo();
return 0;
}
gcc 生成的错误消息是:
<source>: In function 'int main()': <source>:8:8: error: 'constexpr D& D::operator=(const D&)' cannot be overloaded with 'void B<T>::operator=(const T&) [with T = D]' struct D : public B<D> ^ <source>:4:8: note: previous declaration 'void B<T>::operator=(const T&) [with T = D]' void operator=(const T&) { } ^~~~~~~~
我们在D
中有两个赋值运算符,第一个是默认生成的,第二个是用using
引入的。它们具有相同的签名,因此重载失败。但是,为什么基类中的operator=
根本不像foo()
成员函数那样被派生类中的基类隐藏呢?
这是怎么回事?为什么只有海湾合作委员会抱怨?它应该抱怨吗?
GCC 在这里是错误的:这被特别称为没有发生过载的情况。 (当然,正如您所说,其他成员功能也不会发生这种情况。
相关文章:
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 命名空间范围内的外部 - GCC vs clang vs msvc
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 与clang++一起使用的VS代码在构建良好的C++文件中显示错误
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- 使用函数参数作为常量表达式的一部分 - gcc vs clang
- `noexcept`函数中的std :: terminate`调用函数有限-GCC vs clang codegen
- 函数指针的模板参数推导(g++ & ICC vs Clang++ & VC++)
- GCC vs CLANG:除了静态强制转换时在未使用的模板专用化中解析外,否
- GCC vs CLANG:将捕获的参数包扩展两次
- GCC vs Clang 中的堆栈粉碎(可能是由于金丝雀)
- "Nested" 带括号的类模板参数推导:GCC vs. clang
- GCC vs Clang:将功能与-FPIC一起插入
- cppcheck vs clang整洁:显式构造函数initializer_list
- GCC vs. Clang:"invalid use of incomplete type" std::d eclval 和模板专业化
- 默认参数,gcc vs clang
- GCC vs clang -使用' make_overload '可变lambda继承时的模糊重载
- LLVM vs clang on OS X