c++ - 有没有允许重载运算符优先级的语言?

标签 c++ operator-overloading operator-precedence

考虑这个 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/

相关文章:

c++ - 对 map::emplace 的语法感到困惑

c++ - 使用 chrono 将 time_point 转换为特定持续时间

c++ - 运算符重载 - 如何更改对象位置?

c++ - 奇怪的功能查找

Python 是,== 运算符优先级

matlab - Matlab中元素乘法的优先级

c - c结构的&(地址)与->(成员访问)的优先级?

c++ - C++ 中带线程的强力搜索算法的并行化

C++//将getline输入与多字串进行比较?

c++ - 重载新运算符和继承