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

0 投票
1 回答
277 浏览

c++ - 条件类型特征通用参考的问题

所以我有一个函数用于检查值并在值无效时抛出异常,否则在收到值时将其传回。我试图用普遍的敬意和类型特征来概括这个例程。我觉得我很接近,因为我的例子在某些情况下有效,但不是全部。它似乎只适用于右值。

产生输出

如果我取消注释最后一行,我会收到以下错误:

这似乎has_empty<T>::value正在评估false。我确信我可以做一些不同的工作来让它发挥作用,所以在这一点上它是一种学术性的。尽管如此,任何帮助将不胜感激。

0 投票
3 回答
380 浏览

c++ - 精简版概念将如何与通用参考进行交互?

我最近看了这个视频,解释了 C++ 中精简概念的想法,今年可能会以 TS 的形式出现。现在,我还了解了通用引用/转发引用(如此所述),并且 T&& 可以根据上下文有两种含义(即是否正在执行类型推导)。这自然会引出一个问题,概念将如何与通用引用相互作用?

具体来说,在下面的例子中,我们有

但是如果我们使用概念会发生什么?

尤其是最后一个例子让我有点困扰,因为有两个相互冲突的原则。首先,以这种方式使用的概念应该像类型一样工作,其次,如果 T 是推导类型,则 T&& 表示通用引用而不是右值引用。

提前感谢您对此的澄清!

0 投票
2 回答
324 浏览

c++ - C++显式通用引用构造函数不隐藏复制构造函数?

可能我的理解explicit不够,但是我想知道为什么在下面的代码中,当我将通用引用构造函数声明为explicit.

演示

这是一种通用的解决方案,而不是 SFINAE 的东西,否则将适用于防止隐藏A(例如,通过std::enable_if_t<!std::is_same<std::decay_t<T>, A>::value>,请参见此处)?

0 投票
2 回答
2179 浏览

c++ - 带有模板类的通用引用

例子:

似乎通用引用仅适用于模板函数并且仅适用于类型推导,对吗?所以在课堂上使用它没有意义吗?在我的情况下使用 ofstd::forward有意义吗?

0 投票
3 回答
843 浏览

c++ - 是否使用 T const& 或 T&&

我很好奇,一般来说,对于从 C++11 开始的模板化函数参数,您是否要使用 T&&(通用引用)而不是经典的 T const&(左值引用)。我特别好奇的是,如果您还想处理 r-value 引用,您将如何解决您被迫丢失 const 的事实;有没有解决的办法?

0 投票
1 回答
999 浏览

c++ - 将函数引用作为通用引用传递

我正在努力理解将函数引用作为通用引用传递给函数时到底发生了什么(推断出什么类型)。假设我们有一个函数 foo 将参数作为通用引用:

然后让我们执行以下操作:

结果将是:

void foo(T&&) [with T = void (&)int]

这是完全可以理解的:我们将左值传递给我们的函数 foo,因此推导的类型是 void(&)int,而参数的类型将是“void(&& &)int”,在参考折叠规则下变为 void(& )int。Param 将只是对函数的左值引用。

但是当我执行以下操作时:

foo 将打印:

void foo(T&&) [with T = void (&)int]

这和以前完全一样!这里发生了什么?为什么结果与传递左值时相同?我希望由于我们将右值传递给 foo,推导的类型应该是 T = void(int),而 param 应该是 void(&&)int。这总是发生在所有其他“普通”类型(如类、原始类型等)中。为什么在处理函数引用时会有所不同?

0 投票
1 回答
449 浏览

c++ - 成员函数指针中的通用引用

我在理解为什么以下代码无法编译时遇到了一些麻烦

对于 call_obj_func 函数,我希望 OBJ 的类型同时用于 rvlaue 和 lvalue 类型。但是,当使用左值类型调用时,编译器会抱怨使用以下类型存在歧义:Obj 和 Obj&

这意味着编译器不确定是使用 obj 的副本还是对 obj 的引用。

我确信存在一些语法错误,因为我希望函数 call_obj_func 使用左值和右值类型进行编译。

我的假设是成员函数指针,因为语法 (Obj&::*fn) 和 (Obj::*fn) 可能具有不同的语义。(虽然我无法在任何地方找到差异)。

0 投票
1 回答
682 浏览

c++ - 具有无法更改的通用引用函数模板的 C++ 重载解决方案

假设我的代码中的某处是一个foo具有通用引用参数的函数,我无法更改

现在我想foo为给定的类重载A,并确保为任何限定符和引用类型A调用重载。为此,我可以蛮力地为所有可能的资格提供重载(暂时忽略volatile):

演示。然而,对于更多参数,这非常糟糕。

或者,我可以按值传递,这似乎也捕获了所有先前的情况:

演示。但是现在需要复制大对象(至少在原则上)。

有没有解决这些问题的优雅方法?

请记住,我无法更改通用参考功能,因此SFINAE之类的可能性不大。

0 投票
2 回答
94 浏览

c++ - 用于通用引用的左值/右值 -nes 编码

我一直在阅读有效的现代 C++ 并且以下内容引起了我的注意:

在第 28 条中,斯科特写道:

总之,这些关于通用引用和左值/右值编码的观察意味着对于这个模板

template<typename T> void func(T&& param);

推导的模板参数 T 将编码传递给 param 的参数是左值还是右值。编码机制很简单。当左值作为参数传递时,T 被推断为左值引用。当传递一个右值时,T 被推断为非引用。(注意不对称:左值被编码为左值引用,而右值被编码为非引用。)

有人可以解释为什么选择这种编码机制吗?

我的意思是,如果我们遵循引用折叠规则而不是使用上述带有右值的模板会产生右值引用。据我所知,如果将其推断为右值引用,一切都会一样。为什么它被编码为非参考?

0 投票
5 回答
622 浏览

c++ - Having a function only accept non-const lvalues

I have a function which sorts two vectors with the first of them as ordering criterion. Its signature is

The problem is that universal references would allow nonsense cases like

where an rvalue will be destroyed afterwards (nonsense).

Asking explicitly for a lvalue doesn't work since

for some reason the above compiles (I thought only const lvalues were allowed to bind to rvalues and to prolong their lifetime?).

If I add const to the lvalue reference then the function will no longer be able to modify the vectors and sort them.


My questions are:

1) Why in the example marked with // (*) can I bind a rvalue to a lvalue that is not even const ? Why instead something like int& r = 20; isn't allowed? What's the difference?

2) How can I solve my issue i.e. having the function accept only lvalues and not rvalue temporaries? (If it's possible, of course)

Obviously I'm allowed to use any C++ version available