静态变量和模板特化的歧义性

3

FQA提供了以下代码示例:

#include <cstdio>
template<int n> struct confusing
{
    static int q;
};
template<> struct confusing<1>
{
    template<int n>
    struct q
    {
        q(int x)
        {
            printf("Separated syntax and semantics.\n");
        }
        operator int () { return 0; }
    };
};
char x;
int main()
{
    int x = confusing< SOME_NUMBER_HERE >::q < 3 > (2);
    return 0;
}

q是指static int qq(int x),具体取决于SOME_NUMBER_HERE的值。考虑到q可以用其他名称替换,这似乎是一个相当牵强的例子。gcc甚至有一个警告:

warning: comparisons like 'X<=Y<=Z' do not have their mathematical meaning [-Wparentheses]

     int x = confusing<2>::q < 3 > (2);

这种情况是否存在实际应用场景,会造成问题?


1
哇...花了一些时间才明白为什么即使SOME_NUMBER_HERE != 1代码也能编译通过。如果在足够大的代码库中,有无监督的模板爱好者在工作,我会感到惊讶如果这不成为一个真正的问题。 - IInspectable
1个回答

1

我没有看到任何实际的例子,但这当然不能证明不存在。

我记得Andrei Alexandrescu曾经就static_if(幻灯片)发表过演讲。我想他也谈到了类似于你的示例的模板劫持问题。

如果有人能提出一个真实的例子,我非常确定Andrei Alexandrescu会是那个人。 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接