问题标签 [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++ - 条件类型特征通用参考的问题
所以我有一个函数用于检查值并在值无效时抛出异常,否则在收到值时将其传回。我试图用普遍的敬意和类型特征来概括这个例程。我觉得我很接近,因为我的例子在某些情况下有效,但不是全部。它似乎只适用于右值。
产生输出
如果我取消注释最后一行,我会收到以下错误:
这似乎has_empty<T>::value
正在评估false
。我确信我可以做一些不同的工作来让它发挥作用,所以在这一点上它是一种学术性的。尽管如此,任何帮助将不胜感激。
c++ - 带有模板类的通用引用
例子:
似乎通用引用仅适用于模板函数并且仅适用于类型推导,对吗?所以在课堂上使用它没有意义吗?在我的情况下使用 ofstd::forward
有意义吗?
c++ - 是否使用 T const& 或 T&&
我很好奇,一般来说,对于从 C++11 开始的模板化函数参数,您是否要使用 T&&(通用引用)而不是经典的 T const&(左值引用)。我特别好奇的是,如果您还想处理 r-value 引用,您将如何解决您被迫丢失 const 的事实;有没有解决的办法?
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。这总是发生在所有其他“普通”类型(如类、原始类型等)中。为什么在处理函数引用时会有所不同?
c++ - 成员函数指针中的通用引用
我在理解为什么以下代码无法编译时遇到了一些麻烦
对于 call_obj_func 函数,我希望 OBJ 的类型同时用于 rvlaue 和 lvalue 类型。但是,当使用左值类型调用时,编译器会抱怨使用以下类型存在歧义:Obj 和 Obj&
这意味着编译器不确定是使用 obj 的副本还是对 obj 的引用。
我确信存在一些语法错误,因为我希望函数 call_obj_func 使用左值和右值类型进行编译。
我的假设是成员函数指针,因为语法 (Obj&::*fn) 和 (Obj::*fn) 可能具有不同的语义。(虽然我无法在任何地方找到差异)。
c++ - 用于通用引用的左值/右值 -nes 编码
我一直在阅读有效的现代 C++ 并且以下内容引起了我的注意:
在第 28 条中,斯科特写道:
总之,这些关于通用引用和左值/右值编码的观察意味着对于这个模板
template<typename T> void func(T&& param);
推导的模板参数 T 将编码传递给 param 的参数是左值还是右值。编码机制很简单。当左值作为参数传递时,T 被推断为左值引用。当传递一个右值时,T 被推断为非引用。(注意不对称:左值被编码为左值引用,而右值被编码为非引用。)
有人可以解释为什么选择这种编码机制吗?
我的意思是,如果我们遵循引用折叠规则而不是使用上述带有右值的模板会产生右值引用。据我所知,如果将其推断为右值引用,一切都会一样。为什么它被编码为非参考?
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