名称查找:在类定义中使用非限定类名称/省略模板参数的缺点?

时间:2013-07-18 14:35:30

标签: c++ language-lawyer explicit-specialization fully-qualified-naming

在最近的讨论中,问题是我们是否应该始终完全限定类定义中的当前类'名称,并在引用<时使用明确专用的模板strong>当前模板本身。总结一下:

namespace foo {
    struct Foo {
        doSomething(foo::Foo& other); // arguably good
        doSomething(Foo& other);      // arguably bad
    };
}

template<typename T>
struct Bar {
    doSomething(Bar<T>& other); // arguably good
    doSomething(Bar& other);    // arguably bad
};

问题是,没有人可以用严格的事实来支持他们的主张,它只是“名称查找可能出错”而不是“ meh,从来没有任何问题

为了解决这个问题:这两个约定是否严格等同,或者“坏”有时会在名称查找中引入歧义?对当前标准的引用会非常好。

当然,不应该考虑易读性的论点,我真的在询问符合标准的编译器在极端情况下的表现。但是,也欢迎已知的实现错误。

2 个答案:

答案 0 :(得分:7)

https://ideone.com/f48mJI

namespace foo {
  namespace foo {
    typedef int Foo;
  }
  struct Foo {
    int m_foo;
    Foo( foo::Foo const& o_foo ):m_foo(o_foo.m_foo) {}
  };
}

int main() {
  ::foo::Foo foo_(::foo::foo::Foo{});
}

总之,Foo

答案 1 :(得分:1)

当然,在模板的情况下,它们是相同的:编译器会自动为类定义注入类似Bar = Bar<T>的内容。

此外,对于第一个示例,我没有看到Foo可以引用除最本地嵌套Foo以外的任何内容的任何方式,换句话说就是当前类。

从功能上讲,这两者是等价的,但我会争辩说实际上它们不是:在每种情况下,更冗长的人似乎更难来理解和维护。