了解嵌套>>在模板函数调用中

时间:2015-02-05 04:42:39

标签: c++ templates

请考虑以下代码:

#include <iostream>

using std::cout;
using std::endl;

struct A
{
    constexpr int operator[](int a)
    {
        return a;
    }

    constexpr operator int()
    {
        return 1;
    }
} a;

template <int a>
int foo()
{
    return a;
};

int main(){ cout << foo<a[4 >> 1]>() << endl; }

DEMO

标准是N4286::14.2/3 [temp.names]

  

同样,第一个非嵌套>>被视为两个连续但是   不同的>令牌,其中第一个作为结尾   template-argument-list并完成template-id。

嵌套&lt;&lt;的定义是以下N4286::14.2/3 [temp.names](脚注137):

  

包含> type-id的{​​{1}}的{​​{1}},   dynamic_caststatic_cast,或包含。reinterpret_cast   后续模板ID的模板参数被认为是嵌套的   就本说明而言。

在我的情况下,const_cast是非嵌套的,因此第一个>>应该被视为模板参数的结尾。但事实并非如此。为什么呢?

0 个答案:

没有答案