理解C ++ 03运算符重载的标准语法

时间:2016-11-16 09:39:19

标签: c++ language-lawyer c++03

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

操作员功能-ID
  运营商 运营商
  运营商 运营商< 模板参数列表>

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

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

1 个答案:

答案 0 :(得分:5)

允许对操作符功能模板进行特化的语法规则仍然存在于C ++ 11中,它只是在不同的地方。

[temp.names] / 1(C ++ 03)

  

模板特化(14.7)可以通过template-id:

来引用      

模板id:

template-name < template-argument-listopt>
     

模板名称:

identifier
     

模板参数列表:

template-argument
template-argument-list , template-argument
     

模板的参数:

assignment-expression
type-id
id-expression

[temp.names] / 1(C ++ 11)

  

模板特化(14.7)可以通过template-id:

来引用      

简单模板id:

template-name < template-argument-listopt>
     

模板id:

simple-template-id
operator-function-id < template-argument-listopt> <- HERE
literal-operator-id < template-argument-listopt>
     

模板名称:

identifer
     

模板参数列表:

template-argument ...opt
template-argument-list , template-argument ...opt
     

模板的参数:

constant-expression
type-id
id-expression

这可能是因为语法规则 operator-function-id 在上下文中被引用,其中该模板参数列表没有意义,因此他们将规则移到更合理的地方&lt; /猜想&GT;

以下是此规则的实例示例:

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!,第二个电话会打印`/ Declare a variable that references the type. / DECLARE @LocationTVP AS LocationTableType; / Add data to the table variable. / INSERT INTO @LocationTVP (LocationName, CostRate) SELECT Name, 0.00 FROM AdventureWorks2012.Person.StateProvince; / Pass the table variable data to a stored procedure. / EXEC usp_InsertProductionLocation @LocationTVP;`

Live demo