如何解决为什么触发此 noexcept 运算符 MSVC 的“重载具有类似的转换”错误,而不是 Clang 和 GCC
struct S {
template<typename T>
operator T() const noexcept
(noexcept(static_cast<T>(1) - 1)) // comment out this line to make it work in MSVC
{
return static_cast<T>(1) - 1;
}
};
struct R {
R(int i) {}
operator int() const { return 0; }
int operator-(R const& o) const { return 0; }
};
bool operator==(R const& l,int r) {
return true;
}
bool operator==(S const& l,int r) {
return true;
}
int main() {
return S() == 3;
}
在 C++11 及更高版本的 Clang 和 GCC 上编译良好,但抱怨
'R::operator -': 2 overloads have similar conversions
note: Could be 'int R::operator -(const R &) const'
note: or 'built-in C++ operator-(int,int)'
note: while trying to match the argument list '(T,int)' with [ T=R ]
在 MSVC 中。
令我困惑的是,删除 template operator T()
上的 struct S
上的 noexcept operator 会使错误消失。它的表达式与它标记为 noexcept
的方法主体中的表达式完全相同,我希望方法主体会导致相同的错误,但不会。
为什么表达式 static_cast<T>(1) - 1
在未计算的上下文中编译时会导致编译器错误,而在方法体中编译时却不会?
谁在这里,为什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。