在最近的讨论中,问题是我们是否应该始终完全限定类定义中的当前类'名称,并在引用<时使用明确专用的模板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,从来没有任何问题 ”
为了解决这个问题:这两个约定是否严格等同,或者“坏”有时会在名称查找中引入歧义?对当前标准的引用会非常好。
当然,不应该考虑易读性的论点,我真的在询问符合标准的编译器在极端情况下的表现。但是,也欢迎已知的实现错误。
答案 0 :(得分:7)
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
以外的任何内容的任何方式,换句话说就是当前类。
从功能上讲,这两者是等价的,但我会争辩说实际上它们不是:在每种情况下,更冗长的人似乎更难来理解和维护。