【发布时间】:2021-11-06 11:18:52
【问题描述】:
每个 C++ 类都可以声明其他类型的转换运算符,特别是运算符可以是模板,并且可以转换为 const 引用类型。但看起来现代编译器对这个运算符的处理方式有所不同。下一个例子:
struct B {};
struct A {
template <typename T> operator const T &();
operator B() = delete;
};
int main() {
A a;
[[maybe_unused]] B b(a); //error in Clang
[[maybe_unused]] int c(a); //error in GCC
}
被 MSVC 完全接受。
GCC 接受从 A 到 B 的转换,尽管我希望首选的非模板 A::operator B 已被明确删除。
同时GCC拒绝从A到int的转换:
cannot convert 'A' to 'int' in initialization
演示:https://gcc.godbolt.org/z/WvafjPPjr
我个人更喜欢这里 Clang 的行为,但它真的是对的吗?
【问题讨论】:
-
也许是一个有用的细节:
operator B const& () = delete;将导致all three compilers to rejectB转换。我认为 MSVC 和 Clang 正在尝试使用模板函数进行转换。
标签: c++ templates type-conversion language-lawyer