请考虑以下代码:
#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; }
标准是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_cast
或static_cast
,或包含。reinterpret_cast
后续模板ID的模板参数被认为是嵌套的 就本说明而言。
在我的情况下,const_cast
是非嵌套的,因此第一个>>
应该被视为模板参数的结尾。但事实并非如此。为什么呢?