问题标签 [universal-reference]
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++ - 通用参考忽略顶级 cv 限定符
谁能告诉我为什么通用引用会失去顶级简历的资格?我预计输出将在以下代码中的第二个和第三个函数调用中为 const 返回 true。
输出:
c++ - 为什么在给定 T&& 和 const T& 重载的情况下,const 左值与 const 右值的绑定方式不同?
对于此代码(可在http://ideone.com/Mo7fQr获得)
第一次调用f
(使用左值)调用const T&
重载,而第二次调用(使用右值)调用T&&
重载。至少 gcc 4.8.1 和最新的 VC++ (VC12) 就是这样。
我想我理解为什么第二个调用会这样解析:因为第一个模板实例化为获取const int&
参数,而第二个模板实例化为获取const int&&
参数,并且因为在调用站点传递的参数是右值,它优先绑定到右值引用。(我相信这是在 C++11 标准的 13.3.3.2/3 bullet 1 sub-bullet 4 中指定的。)
但是对于第一次调用f
,两个模板都实例化为采用类型参数const int&
。const
那么为什么传入左值时首选第一个模板呢?
c++ - 具有通用参考/完美转发的 Boost.python?
我一直在尝试使用 C++11 通用引用并在某些类中完美转发,这些类也需要使用 Boost.Python 从 Python 访问。我有有效的代码,但它需要在类之外进行一些丑陋的模板专业化。有没有人以更优雅的方式解决了这个问题?有人对改进以下代码有任何建议吗?
c++ - 为什么派生类中复制/移动函数的“正常”实现会因定义方式而有所不同?
我对派生类复制和移动函数调用其基类版本时看到的行为感到困惑。
我有一个带有各种构造函数的基类,它们告诉我何时调用它们:
对于具有编译器生成的复制和移动操作的派生类
和这个测试代码,
gcc 4.8.1 产生这个输出:
这让我很惊讶。我希望调用采用通用引用的基类构造函数,因为它可以被实例化以在可能从派生类的函数传递的派生对象上创建精确匹配。基类复制和移动函数需要派生到基类的转换。
如果我更改派生类以自己声明复制和移动函数,但给它们默认实现,
gcc 产生相同的输出。但是,如果我自己用我认为是默认实现的方式编写函数,
我得到了我最初期望的输出:
我希望在每种情况下都能得到相同的输出。这是 gcc 中的错误,还是我不理解的地方?
c++ - 通用参考与常量参考优先级?
当我考虑以下两个重载时:
我保证f(x)
将始终调用第二个函数并且永远不会导致歧义。从某种意义上说,对于一个论点,无论其类型是什么,第二个版本都比第一个版本普遍优先。
现在考虑一个函数有一个通用引用和一个常量引用版本的情况:
我的问题是:无论 x 的类型(r 值引用、引用、cv-qualifiers、指针...)如何,它们是否是这两个函数之间的普遍优先级,就像前一种情况一样?(如果是,优先级是什么?)
c++ - C++ 模板函数的行为
假设我有这个功能:
如果我尝试使用此代码调用它:
编译器会抱怨它不能将 x 从左值引用转换为右值引用,这是正确的。
现在,如果我将 f 转换为这样的模板函数:
然后我可以用左值引用调用它:
为什么会这样?为什么编译器在这种情况下不抱怨?
c++ - 构造函数中的通用引用导致失败,无法将可调用函子分配给 std::function
在下面的完整测试用例中,如果我使用第一个 ctor 按值获取函子并将其移动到位,那么代码将按预期编译并工作。
但是,如果我使用通用引用 ctor,它将无法编译(我在下面包含了 clang 错误消息)。
我该如何解决这个问题或我做错了什么?
编译错误:
templates - 如何在没有其他类型扣除的情况下使用通用引用
我正在为 inner_t 类型的类编写一个包装类。我可以通过以下方式为内部类调用正确的构造函数(左值引用或右值引用)吗?
c++ - 函数模板参数 T& 和 T&& 是否有歧义?
考虑这两个重载:
它们可能模棱两可吗?
以下代码使用 Clang 3.4 编译,但使用 GCC 4.8 失败,这表明重载(第一个带有T = int
,第二个带有T = int&
)是模棱两可的。
我意识到“绑定到引用”在过载解决方面是“完全匹配”,所以我认为问题归结为其中一个扣除T = int
/T = int&
是否优于另一个,或者它们是否同样好。