问题标签 [using-declaration]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - struct和int之间的clang重新定义不一致
以下程序在使用 clang 编译时不会出错:
让我们使用 int 代替 struct,然后我们得到:
该程序在使用 clang 编译时会出现重新定义错误。
程序之间的唯一区别是使用的实体类型(struct 或 int),但一个编译没有错误,另一个给出重新定义错误。
这是否表明clang中的错误?当涉及到 using-declarations 时,也许标准是模棱两可的。但是编译器不应该始终如一地解释它吗?
程序可以在这里编译:
c++ - 定义成员函数时编译错误,但仅在 GCC 中
以下程序使用 MSVS、clang 和 GCC 编译时没有错误:
现在让我们定义一个成员函数。现在它仍然可以使用 MSVS 和 clang 编译,但不能使用 GCC:
GCC 给出以下错误消息:
- prog.cc:5:22:错误:“void A::f()”的定义不在包含“A”的命名空间中 [-fpermissive]
这是为什么?这是 GCC 中的错误吗?
如果程序的第二个版本违反了 c++ 标准的规则,它违反了什么规则,为什么 MSVS 和 clang 不针对该违反给出诊断消息?
这是 c++ 标准模棱两可的情况吗?
从错误消息看来,GCC 错误地认为我们违反了以下规则:
- http://eel.is/c++draft/class.mfct#2 “出现在类定义之外的成员函数定义应出现在包含类定义的命名空间范围内。”
我们没有违反此规则,因为成员函数定义在类定义中。我的理论是 GCC 混淆了声明类 A;在全局命名空间中,类定义 class A { ... } 在命名空间 Y 中。我认为我们在 GCC 中有一个错误。
使用 GCC,他们声明了相同的实体。这可以通过观察在程序的第一个版本中使用 GCC 编译时在 main 中使用 ::A 作为完整类型来看出。MSVS 也一样。然而,对于 Clang,它们声明了不同的实体。这种差异可能是由于 c++ 标准中的歧义。不管这样的模棱两可,我们显然没有违反http://eel.is/c++draft/class.mfct#2。这条规则非常明确。
c++ - 如何在类声明范围内使用`using space::function`?
我想使用using
声明在特定函数查找上启用 ADL,以便我可以在构造函数初始化列表中使用它。
这是代码:
相关:
using 声明应该有多窄?
在这个问题的独特答案中,(4)是不可能的,但这是我想要的地方!
c++ - 尝试通过 using-declaration 定义命名空间成员
考虑以下程序。它是否符合 c++ 标准(需要参考标准的相关部分):
对于不同的编译器,我得到不同的结果。我试图弄清楚我应该为哪个编译器提交错误报告:
Clang:给出以下编译器错误:命名空间“N”中没有名为“i”的成员
GCC 和 Visual C++ 编译它没有错误。
为了比较,以下给出了所有三个编译器的编译器错误:
c++ - 通过 using-directive 在 using-declaration 中查找名称
根据 c++ 标准,以下程序是格式正确的还是格式错误的?
我使用不同的编译器得到不同的结果:
- Clang(http://melpon.org/wandbox/permlink/c8vl7XbumyyS6vsw):没有错误。
- GCC(http://melpon.org/wandbox/permlink/immhNeWFCMcCA800):错误:“我”未声明。
根据 c++ 标准,这个程序是格式正确的还是格式错误的?需要对 c++ 标准的引用。
我试图弄清楚我应该为哪个编译器提交错误。
c++ - 声明名称、引入名称和声明实体之间的区别
根据 C++11 标准,§7.3.3[namespace.udecl]/1:
using-declaration 将名称引入到 using-declaration 出现的声明性区域中。
使用声明:
using typename
opt 嵌套名称说明符 unqualified-id;
using ::
unqualified-id;
在 using-declaration 中指定的成员名称在 using-declaration 出现的声明区域中声明。
在使用声明发生的声明区域中声明的名称是什么意思?
这是否意味着将该名称引入到使用声明发生的声明区域中?
声明名称和声明名称所表示的实体之间也有区别吗?
例子:
c++ - 使用 using-declarations 时,非限定名称查找如何工作?
根据 c++ 标准,这是格式错误还是格式正确?
Clang 拒绝它,而 GCC 接受它。
根据 [namespace.udir-6] ( http://eel.is/c++draft/basic.namespace#namespace.udir-6 ):
如果名称查找在两个不同的命名空间中找到一个名称的声明,并且这些声明没有声明相同的实体并且没有声明函数,则该名称的使用是错误的。
我们应该如何解释这一点?请记住,每个 using-declaration 都通过 [namespace.udecl]p1 ( http://eel.is/c++draft/namespace.udecl#1 ) 声明一个名称:
using-declaration 将名称引入到 using-declaration 出现的声明性区域中。
using-declaration :
using typename
opt 嵌套名称说明符 unqualified-id;
在 using-declaration 中指定的成员名称在 using-declaration 出现的声明区域中声明。[注:只有指定的名称是这样声明的;在 using-declaration 中指定枚举名称不会在 using-declaration 的声明区域中声明其枚举数。— 结束注释] 如果 using 声明命名了一个构造函数([class.qual]),它会在出现 using 声明的类([class.inhctor])中隐式声明一组构造函数;否则,在 using-declaration 中指定的名称是另一个命名空间或类中的一组声明的同义词。
所以我们有 4 个名称 i 的声明。
不合格的名称查找i
在其中sizeof(i)
找到哪些?
它是否只找到using M::i;
和using N::i;
哪些都在同一个命名空间(全局命名空间)中,所以程序格式正确?
或者它是否只找到struct i {};
并且static int i = 1;
哪些位于不同的名称空间中,因此程序格式错误?
还是我们有其他选择?
c++ - 具有多重继承和使用声明的程序的实现分歧,其访问说明符与原始声明不同
根据 c++ 标准,以下程序是格式正确的还是格式错误的?
不同的编译器给出不同的结果。Clang 拒绝它而 GCC 接受它:
- http://melpon.org/wandbox/permlink/SqSEtcYaR72A4eNS(Clang拒绝)
- http://melpon.org/wandbox/permlink/N3ORCxG8qnU6Zmeq(GCC接受)
我认为http://eel.is/c++draft/class.paths#1的程序格式正确(因此 clang 有拒绝它的错误) ,但我不确定:
如果可以通过多重继承图通过多个路径访问一个名称,则访问权限是提供最多访问权限的路径。
c++ - C++ 使用声明和参数依赖查找
下面的代码是有效的 C++98 还是需要更新版本的 C++ 标准?
显然,我的编译器(我猜是基于 EDG 前端)在 basic::f 的 using 声明之后不考虑 user::f。根据 C++98,这是正确的行为吗?
c++ - 使用声明时是否有参数包扩展的解决方法
在 C++14 中不支持 using 声明中的参数包扩展,因此以下代码无法编译:
是否有解决方法可以达到相同的结果?否则,必须手动拼出预期类型的 using 声明,并在每次使用新类型时修改类。