问题标签 [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++11 - IntelliSense:别名模板的重新声明
Type
Visual Studio 2017 (15.1) 中的 IntelliSense为以下代码中的单词添加了下划线:
错误内容为(有一些明显的遗漏):别名模板类型“std::conditional_t<...>”与别名模板“Type”的重新声明中之前的“std::conditional_t<...>”类型不兼容”。
代码编译。它是 IntelliSense 中的错误吗?
c++ - 基类和派生类中模板成员之间的重载解析
Microsoft 编译器 (Visual Studio 2017 15.2) 拒绝以下代码:
错误是:
Clang 也拒绝它:
GCC 完全接受它。哪个编译器是对的?
添加:
使用 SFINAE 的形式
GCC 也会产生错误:
c++ - 使用间接父母的方法
考虑以下代码:
用这个电话:
令我惊讶的是 2 和 3 的结果不同:
问:标准中有一个段落可以解决这种行为吗?
c# - 为什么这不是超出范围
最后一个括号(从底部算起 4 行)关闭 using 语句。我必须在这里遗漏一些明显的东西,但是代码可以编译,通过 resharper 并且 var 消息在 using 语句之外使用。事实上,如果我把它放在 using 语句中,它就无法构建。
事实上从这个https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
“using 语句确保即使在调用对象上的方法时发生异常也会调用 Dispose。您可以通过将对象放在 try 块中,然后在 finally 块中调用 Dispose 来获得相同的结果;事实上,这是编译器如何翻译 using 语句。前面的代码示例在编译时扩展为以下代码(注意额外的花括号以创建对象的有限范围):“
消息应该已经超出范围并且可能已处置。
c++ - 通过类型别名实现 C++ 不变性
using
使用声明来制作类型的不可变版本是错误的、好的还是好的做法?
对于指针或引用成员,像传播常量这样的包装器将确保不可变对象中的常量安全。
这样做的好处是将 Mutable 转换为 Immutable 类型(我认为)不会产生任何成本,并避免代码重复。
这是一个好习惯吗?这是错的吗 ?没用吗?
c++ - 使用声明包含未扩展的参数包
如何让这段代码编译?
c++ - 为什么(不相关的)使用声明可以协调重载歧义与参数依赖查找?
这是关于使用参数依赖查找 (ADL) 的函数重载的问题的后续行动。我想检查我在这些情况下对规则的理解,所以我写了一些测试代码。
首先,当然,std 中没有 HasPtr 类的交换,所以我编写了自己的命名空间,其中包含一个 HasPtr 版本的交换,除了已经在全局范围中定义的交换。using 声明按我的预期工作——产生了一个模棱两可的错误,因为已经定义了一个 HasPtr 版本的交换,如 "C++ Primer", 5ed 中所做的那样。
然后我想看看如果我将 using 声明更改为 using 指令会发生什么。这本书说编译器将保持沉默,直到函数被实际调用。我想验证一下,所以代码如下:
using std::swap;
第 27 行 ( )发生了奇怪的事情。如果我将其注释掉,与已在全局范围中定义的签名完全相同的名称 myNS::swap 将被提升到全局范围,从而导致重载歧义错误,正如我所料。
但是,如果我不注释第 27 行并编译,则不会报告歧义错误。并且程序执行最初在全局范围内定义的 ::swap,就好像 using 指令using namespace myNS;
没有解除 myNS::swap 一样,因此它不会添加到重载候选集中。我只是无法理解这种现象。为什么来自不相关命名空间的 using 声明(std 当然不包含交换的 HasPtr 版本)可以在 ADL 下协调重载歧义?为什么选择执行的是原来的 ::swap,而不是它在 myNS 中的竞争对手?第 27 行是否对重载过程有任何副作用(例如,从提升的命名空间中抑制名称,以便原始名称具有更高的优先级)?谢谢您的回答。
该问题可以在 Windows 7 上的 Visual Studio 2015 Update 3 和 ubuntu 14.04 上的 GCC 4.8.4(均为 64 位)中重现。
c++ - c ++:使用声明中的逗号分隔列表
为什么在 c++ 的 using 声明语句中使用逗号分隔列表是一种不好的做法?
例如
被认为比代码更好
如果代码包含逗号分隔的 using 声明列表,一些编译器(例如 gcc)甚至会发出警告。
当然,最好的做法是对标识符使用完全限定的名称。
c++ - Why is the move constructor not inhereted by using declaration
In the following code the move constructor of the derived class is obviously not generated although the base class is move constructible.
With the above code I get an error (gcc 4.8.4):
test6.cpp: In function ‘int main()’: test6.cpp:47:48: error: use of deleted function ‘unique_num_array::unique_num_array(const unique_num_array&)’ unique_num_array part2 = array2.slice(1,3);
The slice function in the derived class cannot return by value because the move constructor is missing. All other constructors seem to work as expected (not covered by this example).
If I define the move constructor explicitly (uncomment line) the example compiles. But in this case the default constructor vanishes which is, of course, not intended.
What is going on here? I do not understand either of the cases.
Why is the move constructor deleted in the first case?
Why is the default constructor dropped in the second case? Others seem to survive.