越界成员函数定义是否需要一个完全限定的类名,直到全局范围
Is a fully qualified class name down to global scope ever required for out-of-line member function definitions?
这个问题让我怀疑在类外成员函数定义中完全限定类名(包括全局作用域运算符(是否有用/必要。
一方面,我以前从未见过这样做(正确这样做的语法似乎很模糊(。另一方面,C++名称查找是非常重要的,所以可能存在一个角情况。
问题:
是否存在由ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
引入类外成员函数定义与ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }
(没有全局作用域::
前缀(不同的情况?
请注意,成员函数定义必须放入包含类的命名空间中,因此这不是一个有效的示例
使用指令可能会导致Fully
在没有限定的情况下不明确。
namespace Foo {
struct X {
};
}
using namespace Foo;
struct X {
void c();
};
void X::c() { } // ambiguous
void ::X::c() { } // OK
如果一个人是受虐狂并且喜欢写这样的,这是必要的
namespace foo {
namespace foo {
struct bar {
void baz();
};
}
struct bar {
void baz();
};
void foo::bar::baz() {
}
void (::foo::bar::baz)() {
}
}
当然,可以在全局范围中将第二个重载写为foo::foo::bar::baz
,但问题是这两个声明是否可以有不同的含义。我不建议写这样的代码。
如果使用using指令,则可能会出现令人困惑的代码。
考虑以下演示程序
#include <iostream>
#include <string>
namespace N1
{
struct A
{
void f() const;
};
}
using namespace N1;
void A::f() const { std::cout << "N1::f()n"; }
struct A
{
void f() const;
};
void ::A::f() const { std::cout << "::f()n"; }
int main()
{
N1::A().f();
::A().f();
return 0;
}
因此,为了可读性,这个限定名称
void ::A::f() const { std::cout << "::f()n"; }
精确地显示了函数的声明位置。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- C++可以在全局范围内拥有代码吗?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 是否可以在C++ (C) 中使用全局范围对象(结构)?
- 哪个函数负责C++全局范围内的类对象初始化?
- 如何将不在 QT 全局范围内的函数附加到 Qwidget 上
- 为什么不允许在全局命名空间处阻止范围?
- 将局部变量保存到全局向量中,为什么离开局部范围后可以得到这些局部变量?
- 在C 中本地声明隐藏的封闭范围(而非全局)中访问变量
- 为什么在全局范围以及命名空间std中定义了size_t
- 是否有一种方法可以避免标头文件中使用的constexpr函数输入全局范围,而无需额外的名称空间
- C - 具有全局范围的Initialze静态变量
- 如何处理警告 C4177:#pragma 'float_control' 只能在全局范围或命名空间范围内使用
- 全局范围内的对象会导致程序退出时崩溃
- 困惑,为什么没有在此范围内声明 c++ 全局变量
- 将范围从成员更改为全局功能
- 通过使用全局变量的函数访问在给定范围内被覆盖的变量
- 如何全局创建对象并使用该对象访问全局范围内的公共成员函数
- 有没有一种标准方法来确保一段代码在全局范围内执行