随笔-90  评论-947  文章-0  trackbacks-0

代码如下:

template <typename T>
class foo
{
public:
    class bar
    {
    public:
        bar() {}
        bar(const bar &) {}
        bar(int) {}
        operator T *() const
        {
            return 0;
        }
        bar operator + (int)
        {
            return *this;
        }
    };
};

int main()
{
    foo<int>::bar f;
    size_t i = 1;

    f + i;

    return 0;
}

注意:外层 class foo 和 template 都不能去掉。

这个代码应该通过编译么?还是应该报operator +匹配歧义?

posted on 2010-10-15 15:01 溪流 阅读(2429) 评论(6)  编辑 收藏 引用 所属分类: C++

评论:
# re: 问一个语法问题 2010-10-15 15:32 | OwnWaterloo
歧义在哪?  回复  更多评论
  
# re: 问一个语法问题 2010-10-15 17:10 | 溪流
@OwnWaterloo
f + i 可以被解释为:
foo + int
int * + size_t
const int * + size_t

事实上,测试结果为 VS2008、VS2010、gcc 4.5.1 都通过,VS2005 报上述错误。我想知道标准是怎样规定的。  回复  更多评论
  
# re: 问一个语法问题 2010-10-15 17:20 | 溪流
@OwnWaterloo
上次你说的nullptr的模拟定义:
const struct
{
template <typename T>
operator T * () const
{
return 0;
}
} nullptr = {};

考虑这么一种使用场景:
template <typename T>
class SmartPtr
{
public:
SmartPtr();
SmartPtr(const SmartPtr &);
SmartPtr(T *);
SmartPtr operator = (const SmartPtr &);

// 以及其他一些operator,但是第二个操作数都是SmartPtr而不是T*
};

SmartPtr sp;
sp = nullptr;

最后这句应该通过吗?  回复  更多评论
  
# re: 问一个语法问题 2010-10-15 18:56 | OwnWaterloo
@溪流
哦, 对, 你这么一说想起来了。
确实有歧义。 问题差不多: 一个隐式转换到T*, 一个[]操作符。
o[x] 究竟是 o.operator T*()[x] 还是 o.operator[](x)。
看这里:
http://www.glenmccl.com/ansi_022.htm

但究竟是怎么规定的, 忘了…………………………  回复  更多评论
  
# re: 问一个语法问题 2010-10-16 09:24 | 漂漂
这个问题,More Effective C++或者Effective C++ 有讲过这个问题,忘了具体的东西了,可以查阅一下!  回复  更多评论
  
# re: 问一个语法问题 2010-10-20 10:17 | 溪流
@OwnWaterloo
哦~~好的。不过这网址怨念啊,翻墙才打开。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理