问题标签 [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 回答
107 浏览

c++ - 为什么需要使用声明来命名构造函数?

C++11 标准中的 7.3.3.p1 和 p3 两段都引用了命名构造函数的using 声明。为什么这是必要的?下面的代码显示了A在派生类中可以看到基类的构造函数,B正如预期的那样。

如果我在上面注释掉using A::A;程序执行没有任何变化。

0 投票
2 回答
124 浏览

c++ - 作者在 GotW #53 中想说什么?

这个伪代码是从GotW #53获得的,标题是“A Not-So-Good Long-Term Solution”。几个小时以来,我一直在试图理解作者在说什么,特别是与下面以“//错误:潜在......”开头的评论有关,但无济于事。我真的很感激这方面的一些帮助。

0 投票
3 回答
88 浏览

c++ - 为什么 main() 下面的表达式 `df(1);` 没有歧义?

d.f(1);为什么下面的表达式在andmain()之间没有歧义?Base::f(int)Derived::f(int)

0 投票
1 回答
145 浏览

c++ - “使用”与基类名称更改访问是否有效?

我的朋友向我展示了以下代码

AInternal用作实现大多数(如果不是全部A)的内部类。然后他继承自AInternal,但由于他希望它AInternal保持不可访问(因为它是一个实现细节),他继承了 protected (根据实现)。他还做的是usinging 基类名称以使其A可访问(默认情况下它是受保护的,因为它也AInternal被继承保护)

实际上,这很好用(但正如我们后来发现的那样,它仍然保留了成员函数private- 只是创建了基类public),但它只适用于 GCC。它无法使基础A可访问。任何想法?我们甚至可以破解适用于 Clang 的代码

有人可以帮忙吗?

0 投票
3 回答
209 浏览

c++ - 转发定义和命名空间使用

我想知道文件中以下代码行的含义...

首先,我有一个标准using,它使命名空间中的类对我的代码可见

然后是同一类的前向声明:

最后是另一个类的前向声明:

程序员在“使用”和“前向声明”时的细微差别是什么?编写头文件时哪个更受欢迎?

0 投票
2 回答
1273 浏览

c++ - 使用和重载基类的模板成员函数?

在下文中,结构Y重载X的成员函数f。两个重载都是模板函数,但采用不同的参数(typenameint),以明确指定:

1 0正如预期的那样,这使用 gcc 打印。然而,clang (3.3) 抱怨说

即,只能看到Y的版本。我试过了

相反,没有成功。非静态(模板)成员函数也是如此。那么这是一个错误吗?

0 投票
2 回答
1528 浏览

c++ - C++ 在继承构造函数中使用带有类型名的声明

在阅读这个问题时,我发现了一个奇怪的点:

因为typenameBaseclass<T>::Baseclass应该注入类名,而不是构造函数。据我所知,情况与此相同:

为了确保,我写了一个测试代码。

但是,它在 gcc 4.8.3 上运行。

它也可以在没有typename.

为什么我会得到这些结果?我错过了什么?

0 投票
1 回答
541 浏览

c++ - 应用于派生类的 C++ 中“使用”关键字的缺点

我最近发现了using关键字的一个新应用;不是参考namespace功能,而是在派生类声明中。就我而言,这与围绕“operator=”成员函数的问题有关。

鉴于声明,我有一种情况:

...一个对象CStringEx没有像我预期的那样工作:

相反,生成了一个编译器错误,说明“ CStringEx 没有采用 wchar_t* 类型参数的'operator=()' 函数”(或 - 非常接近 - 类似的词)。经过大量研究,我了解到这是因为即使operator=是派生类的编译器自动生成的成员函数也会覆盖从其父类继承的成员函数。这对我来说似乎违反直觉和用户友好

但是,如果我添加一个using关键字:

...子类现在使用其父类的operator=成员函数,一切都很好。

到目前为止,一切都很好。然而,在这里和其他地方进一步阅读后,我了解到许多程序员不喜欢using为此目的使用。例如,我读过一些评论员,他们描述了可能不需要的副作用,例如从父级中引入所有 operator=。然而,再一次,除了在非常特殊的情况下,我不明白为什么继承所有父成员函数会成为问题。如果这是主要问题,有人可以解释这样做的一般危险吗?

我能想到的唯一选择是在子类中为其父类的每个 成员函数写出存根函数,operator=然后显式调用这些各自的成员函数:

与这个版本相比,using CString::operator=这对我来说看起来非常丑陋、繁琐和凌乱。那么,为什么不使用using关键字呢?

0 投票
2 回答
1815 浏览

c++ - 具有依赖限定 ID 的类成员 using-declaration 是否应该是依赖名称?

C++11 标准草案 N3337 在[namespace.udecl]

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

每个 using-declaration 都是一个声明和一个成员声明,​​因此可以在类定义中使用。

在用作成员声明的 using-declaration 中,nested-name-specifier 应命名正在定义的类的基类。

这通常用于在派生类中使基类中的受保护类型定义为公共,如下例所示,该示例在最新版本的 Clang 中成功编译:

using-declaration 可以引用模板类。这编译:

也可以在依赖基类中引用模板。以下编译成功(带有 typedef 注释。)

实例化时取消注释typename会导致错误B<int>:“错误:在非类型上使用'typename'关键字”。

B在第一次实例化之前解析 typedef 时,取消注释会导致错误。我猜这是因为编译器不将Type其视为依赖类型名称。

最后一段[namespace.udecl]建议 using-declarations 可以指定依赖名称,并且typename必须使用关键字来消除对引入名称的进一步使用的歧义:

如果 using-declaration 使用关键字 typename 并指定依赖名称 (14.6.2),则 using-declaration 引入的名称被视为 typedef-name

我的阅读[temp.dep]表明这A<T>::Type是一个从属名称。从逻辑上讲,使用声明引入的名称也应该是依赖的,但[temp.dep]没有明确提及依赖使用声明的情况。我错过了什么吗?

0 投票
1 回答
414 浏览

c++ - C++ - 如何从可变数量的基数中引入重载集。

如果派生类定义了相同的名称,则派生类对基类隐藏重载集的名称,但我们总是可以使用 using-declaration 引入该重载集:

但是,如果我从可变参数基类中引入所有重载集怎么办?我能写出这样的东西吗?

我考虑过使用一个辅助类,例如:

它确实有效。但这需要大量的输入(当然我可以使用宏,但我会尽可能使用 c++ 的编译时功能),当我想引入更多方法时,我必须在那段代码中进行很多更改。

一个完美的答案将是一个简单的语法,但如果没有,我将使用辅助类。