考虑这个 C++ 代码:
struct A {
A operator*(A a) { return A(); } // A*A -> A
};
struct B {
A operator*(B b) { return A(); } // B*B -> A
};
int main() {
A t2 = B()*B() * A(); // works
A t1 = A() * B()*B(); // errors
return 0;
}
A*B
是不允许的,但是 B*B
是。是否存在根据变量类型选择运算符优先级规则的语言?
最佳答案
原来我原来的问题其实可以用C++表达:
struct A {
friend A operator*(A const& a1, A const &a2) { return A(); } // A*A -> A
};
struct B {
friend A operator*(B const& a, B const &b) { return A(); } // B*B -> A
};
template<typename A, typename B>
struct unresolved_multiply {
A const& a;
B const& b;
};
template<typename A, typename B>
unresolved_multiply<A, B> operator*(A const& a, B const &b) {
return {a, b};
}
template<typename A, typename B, typename C>
auto operator*(unresolved_multiply<A, B> const& ab, C const &c) {
return ab.a * (ab.b * c);
}
int main() {
A t1 = B()*B() * A(); // works
A t2 = A() * B()*B(); // works
A t3 = (A() * B())*B(); // works...
return 0;
}
当然,像这样无视括号是个糟糕的主意。
关于c++ - 有没有允许重载运算符优先级的语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26407643/