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

sya*_*yam 2 c++ fully-qualified-naming language-lawyer explicit-specialization

在最近的讨论中,问题是我们是否应该始终完全限定类定义中当前类的名称,并且在引用当前模板本身时也使用显式专用模板.把它们加起来:

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
};
Run Code Online (Sandbox Code Playgroud)

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

为了解决这个问题:这两个约定是否严格等同,或者"坏"有时会在名称查找中引入含糊之处?参考现行标准将是非常好的.

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

Yak*_*ont 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{});
}
Run Code Online (Sandbox Code Playgroud)

总之,Foo.

  • 我不在乎是否因为无意义的评论而被投票,但我认为```应该重命名为`foo`.显然是为了清楚.此外,它不编译http://coliru.stacked-crooked.com/view?id=653b0eb28a15e77dcdf6778eb4f94043-f674c1a6d04c632b71a62362c0ccfc51 (2认同)