2

在最近的一次讨论中,关于我们是否应该始终在类定义中完全限定当前类的名称以及在引用当前模板本身时还使用显式专用模板的问题出现了。把它们加起来:

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
};

问题是,没有人可以用确凿的事实来支持他们的说法,这仅仅是“名称查找可能出错”与“嗯,从来没有任何问题”。

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

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

4

2 回答 2

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

于 2013-07-18T14:44:52.787 回答
1

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

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

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

于 2013-07-18T14:40:05.960 回答