用于重载运算符的标准C++ 03语法如下:

运算符(operator)功能编号:
运算符运算符
运算符运算符

第一个是我们通常使用的普通运算符重载语法,例如

Myclass operator + (Myclass s) {...}

但是第二种选择是什么意思呢?特别是在什么情况下,我们使用template-argument-list?快速浏览C++ 11之后,我发现第二种形式已从标准中删除。它的初衷是什么?

编辑:使用VC++ 2010测试后,以下是使用上述语法的一种方法,尽管对我而言意义不大:
class K {
public:
    int a;
    template <int B>
    int operator + (int b) {
        return a+b+B;
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    K k;
    k.a=1;
    int s;
    s=k.operator+<115>(2);
    printf("%d\n",s);
    return 0;

}

output:118

最佳答案

允许运算符(operator)功能模板特化的语法规则仍然存在于C++ 11中,只是位于不同的地方。
[临时名称]/1(C++ 03):

[临时名称]/1(C++ 11):

之所以会这样做是因为在模板自变量列表没有意义的上下文中引用了语法规则operator-function-id,因此他们将规则移至更合理的位置。

这是此规则的示例:

struct foo{
    template <typename T>
    void operator() (T t) { std::cout << t; }
};

template <>
void foo::operator()<double> (double) {
    std::cout << "It's a double!";
}
请注意operator()Tdouble的特化。如果运行此代码:
foo f;
f(0);
f(0.0);
然后,第一个调用将打印0,第二个将打印It's a double!
Live demo

10-07 19:01
查看更多