草庐IT

sphinx-apidoc-Implicit-namespaces

全部标签

c++ - 是否可以检测 C++ 中的 namespace 成员身份?

对于C++类型,header为我们提供了许多有用的编译时反射功能。例如。std::is_base_of::value在编译时确定是否B是D的基类.我想知道是否可以按照类似的方式检测命名空间成员资格?例如。给定一个命名空间N类型T,有没有办法确定是否T包含在N中使用IS_NAMESPACE_MEMBER_OF(T,N)形式的宏表达式.我更喜欢通过任何类型的SFINAE/ADL类型的技巧获得编译时答案。或者,如果这是不可能的,那么标准不允许这样做的某种推理。一个不可移植的运行时hack是正则表达式typeid(T).name()对于N,但这相当乏味,而且不是在编译时。EDIT1:正如K-b

c++ - 在 C++ 中定义 namespace 内的类有什么好处?

我有一个x.cpp文件,我在其中看到一个在命名空间内定义的类。所以,我的问题是:1)在命名空间内定义一个类有什么好处?2)其次,我还看到在同一个x.cpp文件中定义了命名空间之外的结构。那么,在同一个x.cpp文件中这样做有什么好处呢?x.h看起来像下面这样:classx{private:structabc;};x.cpp看起来像:namespace{class{};}structx:abc{}; 最佳答案 匿名命名空间只能在其编译单元内访问。这意味着没有其他cpp可以访问x.cpp匿名命名空间中的任何内容。namespace{cl

c++ - C++中的 namespace 搜索

我发现了一个关于命名空间搜索的问题。以下简化代码编译失败:namespaceA{namespaceB{classTest{};}namespaceC{namespaceB{typedefB::TestAnAlias;}}}编译器提示命名空间A::C::B中的Test没有命名类型。问题似乎是编译器在命名空间C中看到了命名空间B,但没有进一步搜索。我本以为他也会在命名空间A(这是一个封闭的命名空间)中查找并在那里找到B::Test。如果我重命名C::B一切都很好。如果我符合A::B::Test条件,一切都很好。如果我将typedef直接放在命名空间A::C中,一切都很好。此行为已使用gcc

c++ - SFINAE:当重载移动到其他 namespace 时,检查函数是否存在中断

我想使用SFINAE检查特定命名空间中是否存在函数。我找到了SFINAEtotestafreefunctionfromanothernamespace哪个完成了工作,但有些事情我不明白。目前我有这个工作代码,直接来自链接的问题://switchto0totesttheothercase#defineENABLE_FOO_BAR1namespacefoo{#ifENABLE_FOO_BARintbar();#endif}namespacedetail_overload{templatevoidbar(Args&&...);}namespacedetail{usingnamespacede

c++ - 奇怪的 C++ namespace 解析怪癖和 g++ 与 clang++

这个问题在这里已经有了答案:Injectedclassnamecompilerdiscrepancy(3个答案)关闭4年前。这始于观察。我更改了一些看起来有点像这样的代码(编辑:我在这里取出了指定的初始化器,它们也不在原始代码中):structS{enumE{E1,E2}member;}//file1.ccSv1={S::E1};//file2.ccSv2={S::S::E2};请注意file2.cc过度限定了E2。然而,这在g++和clang++中都有效。(编辑2:这个特定VM上的g++是g++-5.4.1,但原始代码已经通过早期和后来的g++版本,加上多个clang版本。)事实上,

c++ - 在这种情况下,为什么 g++ 和 clang 会破坏 namespace 抽象?

编译:structstr{};namespacea{voidfoo(strs){}}namespaceb{voidfoo(strs){}voidbar(strs){foo(s);}}intmain(int,char**){return0;}但这不是(将结构定义移到命名空间a内)namespacea{structstr{};voidfoo(strs){}}namespaceb{voidfoo(a::strs){}voidbar(a::strs){foo(s);}}intmain(int,char**){return0;}我得到的错误是bad.cpp:Infunction‘voidb::b

c++ - 另一个命名空间内的 `using namespace` 范围

这个问题在这里已经有了答案:scopeofusingdeclarationwithinanamespace(5个答案)关闭5年前。我知道我将using指令的范围限制在一个block或一个函数中。然后它将仅适用于该范围。但是如果该block是一个命名空间,它显然适用于同一命名空间的所有block。那是对的吗?至少,以下示例表明:(http://ideone.com/K8dk7E)namespaceN1{structFoo{};}namespaceN2{usingnamespaceN1;Foof;}namespaceN2{Foof2;}intmain(){N2::f2;}我原以为Foof2

c++ - 在 namespace 内的 lambda 中使用时找不到运算符重载

以下不编译(使用Clang5.0.0/gcc7.3,std:C++11):Clang中的错误信息:错误:二进制表达式的无效操作数(std::vector>和std::vector>)#include#includenamespacens{usingMyType=std::vector;}//namespacensusingns::MyType;MyType&operator+=(MyType&lhs,constMyType&rhs){for(inti=0;i;Funcoperator+(constFunc&lhs,constFunc&rhs){return[lhs,rhs](){aut

c++ - namespace 别名是否会更改链接?

根据我的理解,.cpp文件中的全局变量得到外部链接。假设有两个源文件,a.cpp和b.cpp://a.cppnamespacea_ns{intfoo;}//b.cppnamespaceb_ns{intfoo;}现在假设两者都在namespacens=a_ns;和namespacens=b_ns;之后。如果a.cpp和b.cpp都使用相同的命名空间ns,这会触发任何未定义的行为吗(我认为)对于foo? 最佳答案 没有。您建议的别名不会改变变量具有限定名称a_ns::foo和b_ns::foo的事实,它们是不同的。

c++ - 析构函数 : triviality vs implicit definition

根据我对标准的理解,普通析构函数是一种隐式声明的析构函数,其类只有基本和非静态成员以及普通析构函数。鉴于此定义的递归性,在我看来,唯一的“递归停止”条件是找到具有非隐式声明的析构函数(即用户声明的)的基类或非静态成员。如果那是对的,那应该意味着一个普通的析构函数是一个“不需要做任何事情”的析构函数,因此它将被声明(隐式地)但不被定义。换句话说:根据标准定义,隐式定义析构函数(即“它做某事”)不能是微不足道的说法是否正确?很抱歉提出这种愚蠢的问题,但我想澄清一下我的想法...... 最佳答案 没有。隐式定义的平凡析构函数根据定义是平凡