问题标签 [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++ - 为什么基于范围的 for 语句通过 auto&& 获取范围?
基于范围的for
语句在§6.5.4 中定义为等效于:
其中range-init
为基于范围的两种形式定义为for
:
(该子句进一步指定了其他子表达式的含义)
为什么__range
给出推导的类型auto&&
?我的理解auto&&
是,通过将表达式传递给std::forward
. 但是,__range
不会在任何地方通过std::forward
. 它仅在获取范围迭代器时使用,作为__range
、__range.begin()
或begin(__range)
.
使用“通用参考”有什么好处auto&&
?还auto&
不够吗?
注意:据我所知,该提案没有说明auto&&
.
c++ - 测试对象是否已从
我正在测试我的容器包装器是否正确实现了 URef。我能想到的唯一明显的方法是尝试找出一种方法来检测物体是否已移动。
有没有一种很好的测试方法来确保对象没有被复制?还是有另一种方法来测试我想要什么?我更喜欢不需要修改我正在测试的类的解决方案。因为有几十个。
你能否提供更多关于你所拥有的信息?就像你的容器是什么,你如何使用它,你能不能修改它等等。也许你可以在不修改你的容器的情况下测试它,而是使用特殊的容器元素类型——它跟踪副本和移动。
几个不同的容器和一些独立的模板函数。大多数情况下,它是 STL 库类型(如 deque、list、map、set 等)的包装器。
c++ - 特化一个接受通用引用参数的函数模板
如何专门化采用通用引用参数的函数模板?
foo.hpp:
foo.cpp
在这里,Class
不再是推导类型,因此是Class
精确的;不可能Class &
,所以参考折叠规则在这里对我没有帮助。我也许可以创建另一个接受Class &
参数的专业化(我不确定),但这意味着foo
为所有参数的每个可能的右值/左值引用组合复制其中包含的所有代码,这是通用引用应该避免的.
有没有办法做到这一点?
如果有更好的解决方法,请更具体地说明我的问题:
我有一个可以连接到多个游戏服务器的程序,并且每个服务器在大多数情况下都以相同的名称调用所有内容。但是,它们在某些方面的版本略有不同。这些东西可以有几个不同的类别:移动、项目等。我编写了一个通用的“移动字符串移动枚举”函数集供内部代码调用,我的服务器接口代码也有类似的职能。但是,有些服务器有自己的内部 ID 可以与之通信,有些使用字符串,有些则在不同的情况下使用两者。
现在我想做的是让它更通用一点。
我希望能够调用类似ServerNamespace::server_cast<Destination>(source)
. 这将允许我从 aMove
转换为 a std::string
or ServerMoveID
。在内部,我可能需要制作副本(或从中移出),因为某些服务器要求我保留已发送消息的历史记录。通用引用似乎是解决这个问题的明显方法。
我现在正在考虑的头文件将简单地公开以下内容:
并且实现文件将所有合法转换定义为模板特化。
c++ - C++11 中的所有/大多数 setter 函数是否应该编写为接受通用引用的函数模板?
考虑一个X
具有N
成员变量的类,每个变量都有一些可复制和可移动的类型,以及N
相应的 setter 函数。在 C++98 中, 的定义X
可能如下所示:
上述类的 Setter 函数X
可以绑定到左值和右值参数。根据实际参数,这可能会导致创建临时文件并最终导致复制分配;因此,此设计不支持不可复制的类型。
在 C++11 中,我们拥有移动语义、完美转发和通用引用(Scott Meyers 的术语),通过以下方式重写 setter 函数,可以更高效、更通用地使用它们:
通用引用可以绑定到const
/non- const
、volatile
/non-volatile
和任何一般的可转换类型,避免创建临时变量并将值直接传递给operator =
. 现在支持不可复制、可移动的类型。可以通过static_assert
或 通过消除可能不需要的绑定std::enable_if
。
所以我的问题是:作为设计指南,C++11 中的所有(比如说,大多数)setter 函数都应该写成接受通用引用的函数模板吗?
除了更繁琐的语法和在那些 setter 函数中编写代码时无法使用类似 Intellisense 的帮助工具之外,假设原则“将 setter 函数编写为函数模板,尽可能接受通用引用”是否有任何相关的缺点?
c++ - 如何存储通用引用
我需要将通用引用存储在一个类中(我确信引用的值会比这个类更长寿)。有这样做的规范方法吗?
这是我想出的一个最小示例。它似乎有效,但我不确定我是否做对了。
我的推理是正确的还是会导致细微的错误?此外,是否有更好(即更简洁)的方式来编写构造函数?binder(F&& f, X&& x)
将不起作用,因为这些是 r 值引用,因此不允许binder(f, i)
.
c++ - 什么时候不使用`auto&&`?
- 从 make_tuple 返回时是否涉及复制/移动(没有 RVO)?
- 它会导致未定义的行为吗?
- 我都可以读写通用参考。可以
auto&& var = func()
一直使用而不是auto var = func()
这样就没有复制/移动?
c++ - 默认模板类型可以是通用引用吗?
以下是&&
通用参考吗?
c++ - rvalue 或 lvalue (const) 引用参数
int
我想通过 r- 或 l- 值 (const) 引用将参数(某些具体类型,比如说)传递给成员函数。我的解决方案是:
另一个例子在这里http://pastebin.com/9kgHmsVC。
但它太冗长了。如何以更简单的方式做到这一点?
std::remove_reference
也许我应该使用and的叠加来std::remove_const
代替std::decay
,但这里只是简化了。
c++ - 具有通用参考的过载解决方案
我有一个可以通过通用引用接受任何类型的函数,并且想为特定类型重载它(其中一些是自己模板化的,尽管我认为这在这里并不重要)。不幸的是,我似乎无法以正确的顺序解决重载问题。
我会认为第二个声明foo
会更受欢迎,因为它更具体(更少模板化),尽管看起来我对重载决议的理解有些缺乏。有趣的是,将第二个声明更改为X
按值获取使其打印“好,好”,并使其X
通过非常量引用使其打印“坏,好”。显然,完全删除第一个声明会使其返回“好,好”,因为没有其他选择。
那么为什么会这样呢?最重要的是,如果下面的代码不起作用,你怎么能用这个签名重载一个函数呢?
编辑:
也许一个更迂回的解决方案是间接地做到这一点。摆脱第一种形式foo
并使用 SFINAE 检查是否存在有效的重载,然后它不会调用foo_fallback
.