问题标签 [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.

0 投票
1 回答
423 浏览

c++ - struct和int之间的clang重新定义不一致

以下程序在使用 clang 编译时不会出错:

让我们使用 int 代替 struct,然后我们得到:

该程序在使用 clang 编译时会出现重新定义错误。

程序之间的唯一区别是使用的实体类型(struct 或 int),但一个编译没有错误,另一个给出重新定义错误。

这是否表明clang中的错误?当涉及到 using-declarations 时,也许标准是模棱两可的。但是编译器不应该始终如一地解释它吗?

程序可以在这里编译:

0 投票
1 回答
3588 浏览

c++ - 定义成员函数时编译错误,但仅在 GCC 中

以下程序使用 MSVS、clang 和 GCC 编译时没有错误:

现在让我们定义一个成员函数。现在它仍然可以使用 MSVS 和 clang 编译,但不能使用 GCC:

GCC 给出以下错误消息:

  • prog.cc:5:22:错误:“void A::f()”的定义不在包含“A”的命名空间中 [-fpermissive]

这是为什么?这是 GCC 中的错误吗?

如果程序的第二个版本违反了 c++ 标准的规则,它违反了什么规则,为什么 MSVS 和 clang 不针对该违反给出诊断消息?

这是 c++ 标准模棱两可的情况吗?

从错误消息看来,GCC 错误地认为我们违反了以下规则:

我们没有违反此规则,因为成员函数定义在类定义中。我的理论是 GCC 混淆了声明类 A;在全局命名空间中,类定义 class A { ... } 在命名空间 Y 中。我认为我们在 GCC 中有一个错误。

使用 GCC,他们声明了相同的实体。这可以通过观察在程序的第一个版本中使用 GCC 编译时在 main 中使用 ::A 作为完整类型来看出。MSVS 也一样。然而,对于 Clang,它们声明了不同的实体。这种差异可能是由于 c++ 标准中的歧义。不管这样的模棱两可,我们显然没有违反http://eel.is/c++draft/class.mfct#2。这条规则非常明确。

相关问题:与使用声明在 GCC 但不是 MSVS 中编译的范围相同的类声明

0 投票
1 回答
265 浏览

c++ - 如何在类声明范围内使用`using space::function`?

我想使用using声明在特定函数查找上启用 ADL,以便我可以在构造函数初始化列表中使用它。

这是代码:

相关:
using 声明应该有多窄?
在这个问题的独特答案中,(4)是不可能的,但这是我想要的地方!

0 投票
1 回答
263 浏览

c++ - 尝试通过 using-declaration 定义命名空间成员

考虑以下程序。它是否符合 c++ 标准(需要参考标准的相关部分):

对于不同的编译器,我得到不同的结果。我试图弄清楚我应该为哪个编译器提交错误报告:

  • Clang:给出以下编译器错误:命名空间“N”中没有名为“i”的成员

  • GCC 和 Visual C++ 编译它没有错误。

为了比较,以下给出了所有三个编译器的编译器错误:

0 投票
2 回答
193 浏览

c++ - 通过 using-directive 在 using-declaration 中查找名称

根据 c++ 标准,以下程序是格式正确的还是格式错误的?

我使用不同的编译器得到不同的结果:

根据 c++ 标准,这个程序是格式正确的还是格式错误的?需要对 c++ 标准的引用。

我试图弄清楚我应该为哪个编译器提交错误。

0 投票
2 回答
143 浏览

c++ - 声明名称、引入名称和声明实体之间的区别

根据 C++11 标准,§7.3.3[namespace.udecl]/1:

using-declaration 将名称引入到 using-declaration 出现的声明性区域中。

使用声明

using typenameopt 嵌套名称说明符 unqualified-id ;
using :: unqualified-id ;

在 using-declaration 中指定的成员名称在 using-declaration 出现的声明区域中声明。

在使用声明发生的声明区域中声明的名称是什么意思?

这是否意味着将该名称引入到使用声明发生的声明区域中?

声明名称和声明名称所表示的实体之间也有区别吗?

例子:

0 投票
2 回答
687 浏览

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 typenameopt 嵌套名称说明符 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;哪些位于不同的名称空间中,因此程序格式错误?

还是我们有其他选择?

0 投票
0 回答
241 浏览

c++ - 具有多重继承和使用声明的程序的实现分歧,其访问说明符与原始声明不同

根据 c++ 标准,以下程序是格式正确的还是格式错误的?

不同的编译器给出不同的结果。Clang 拒绝它而 GCC 接受它:

我认为http://eel.is/c++draft/class.paths#1的程序格式正确(因此 clang 有拒绝它的错误) ,但我不确定:

如果可以通过多重继承图通过多个路径访问一个名称,则访问权限是提供最多访问权限的路径。

0 投票
1 回答
175 浏览

c++ - C++ 使用声明和参数依赖查找

下面的代码是有效的 C++98 还是需要更新版本的 C++ 标准?

显然,我的编译器(我猜是基于 EDG 前端)在 basic::f 的 using 声明之后不考虑 user::f。根据 C++98,这是正确的行为吗?

0 投票
0 回答
82 浏览

c++ - 使用声明时是否有参数包扩展的解决方法

在 C++14 中不支持 using 声明中的参数包扩展,因此以下代码无法编译:

是否有解决方法可以达到相同的结果?否则,必须手动拼出预期类型的​​ using 声明,并在每次使用新类型时修改类。