C++ 名称查找:在类定义中使用非限定类名/忽略模板参数的缺点?
在最近的一次讨论中,出现了这样一个问题:我们是否应该始终在类定义中完全限定当前类的名称,并且在引用当前模板本身时也使用明确的专用模板。总而言之:C++ 名称查找:在类定义中使用非限定类名/忽略模板参数的缺点?,c++,language-lawyer,explicit-specialization,fully-qualified-naming,C++,Language Lawyer,Explicit Specialization,Fully Qualified Naming,在最近的一次讨论中,出现了这样一个问题:我们是否应该始终在类定义中完全限定当前类的名称,并且在引用当前模板本身时也使用明确的专用模板。总而言之: namespace foo { struct Foo { doSomething(foo::Foo& other); // arguably good doSomething(Foo& other); // arguably bad }; } template<typen
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
};
名称空间foo{
结构Foo{
doSomething(foo::foo&other);//可以说是好的
doSomething(Foo&other);//可以说是坏的
};
}
模板
结构条{
doSomething(酒吧和其他);//可以说不错
doSomething(酒吧和其他);//可以说是坏的
};
问题是,没有人能用确凿的事实来支持他们的主张,这仅仅是“查名字可能出错”和“嗯,从来没有任何问题”
为了解决这个问题:这两个约定是严格等效的还是“坏”约定有时会在名称查找中引入歧义?引用当前标准会很好
当然,易读性的争论不应该被考虑在内,我真正想问的是一个符合标准的编译器在极端情况下的行为。但是,也欢迎已知的实现错误。当然,在模板的情况下,它们是相同的:编译器会自动向类定义中注入类似于
Bar=Bar的内容
此外,对于第一个示例,我看不到除了最局部嵌套的Foo
,换句话说,当前类之外,Foo
可以引用其他任何东西
从功能上讲,这两者是等价的,但我要说的是,从实际意义上讲,它们是不等价的:在每种情况下,越冗长的一个似乎越难理解和维护。
总之,Foo
我不认为Foo::Foo
名称空间内的Foo
是“可以论证的好”。这个“可以论证的好”不能解决任何问题,可能会带来问题。在标记为这样的行中没有什么“可以说是不好的”。非常好的一点,我甚至没有想到会如此狡猾。:)我不在乎我是否因为一条毫无意义的评论而被否决,但我认为x
应该改名为foo
。显然是为了澄清。另外,它不编译@willkill07,它不编译是一种观点。看起来像复制构造函数的东西实际上是来自-::foo::foo::foo
,又称int
:语法foo::foo
,它试图更精确,实际上是“意外地”指向错误的类型。。。。等等,那不对。我的意思是:foo
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{});
}