Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 名称查找:在类定义中使用非限定类名/忽略模板参数的缺点?_C++_Language Lawyer_Explicit Specialization_Fully Qualified Naming - Fatal编程技术网

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