问题标签 [decltype-auto]
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++ - decltype(auto) 类型推导:return x vs. return (x)
我正在查看有关 C++14 语言扩展的 isocpp.org 常见问题解答,阅读decltype(auto)
:
...
注意:
decltype(auto)
主要用于推断转发函数和类似包装器的返回类型,如上所示,您希望类型准确地“跟踪”您正在调用的某些表达式。但是,除此之外, decltype(auto) 并不打算成为广泛使用的功能。特别是,虽然它可以用来声明局部变量,但这样做可能只是一种反模式,因为局部变量的引用不应该依赖于初始化表达式。此外,它对您如何编写 return 语句很敏感。这两个函数有不同的返回类型:第一个返回字符串,第二个返回
string &
对局部变量的引用str
。
我的问题:示例中的返回类型不应该反过来吗,我的意思是,括号应该形成一个表达式,其类型应该是非引用(或右值引用?);并且没有括号,说的str
意思是“左值引用str
”。我错了吗?
c++ - `decltype(auto)` 变量是否有任何实际的用例?
从我的个人经验和咨询回答诸如decltype(auto) 有哪些用途?我可以找到很多有价值的用例decltype(auto)
作为函数返回类型占位符。
但是,我很难为decltype(auto)
变量考虑任何有效的(即有用的、现实的、有价值的)用例。想到的唯一可能性是存储返回的函数的结果以decltype(auto)
供以后传播,但auto&&
也可以在那里使用,而且会更简单。
我什至搜索了我所有的项目和实验,391 次出现的decltype(auto)
都是返回类型占位符。
那么,变量是否有任何现实的用例?decltype(auto)
或者这个特性只在用作返回类型占位符时才有用?
你如何定义“现实”?
我正在寻找一个提供价值的用例(即它不仅仅是一个展示该功能如何工作的示例)decltype(auto)
,与诸如auto&&
或根本不声明变量之类的替代方案相比,哪里是完美的选择。
问题域无关紧要,它可能是一些晦涩的元编程极端案例或神秘的函数式编程结构。然而,这个例子需要让我去“嘿,这很聪明/漂亮!” 并且使用任何其他功能来实现相同的效果将需要更多样板或具有某种缺点。
c++ - 从函数中正确传播 `decltype(auto)` 变量
(这是对“`decltype(auto)` 变量有任何实际用例吗? ”的后续报道)
考虑以下场景 - 我想将一个函数传递f
给另一个函数invoke_log_return
,该函数将:
调用
f
;打印一些东西到标准输出;
返回 的结果
f
,避免不必要的复制/移动并允许复制省略。
请注意,如果f
抛出,则不应将任何内容打印到stdout。这是我到目前为止所拥有的:
让我们考虑各种可能性:
当
f
返回纯右值时:result
将是一个对象;invoke_log_return(f)
将是一个prvalue(有资格进行复制省略)。
当
f
返回左值或xvalue时:result
将作为参考;invoke_log_return(f)
将是左值或xvalue。
您可以在 godbolt.org 上看到一个测试应用程序。如您所见,对纯右值情况g++
执行 NRVO ,而clang++
没有。
问题:
这是
decltype(auto)
从函数中“完美”返回变量的最短方法吗?有没有更简单的方法来实现我想要的?可以将
if constexpr { ... } else { ... }
模式提取到单独的函数中吗?提取它的唯一方法似乎是宏。有什么好的理由
clang++
不为上述prvalue案例执行NRVO?应该将其报告为潜在的增强功能,还是g++
NRVO 优化在这里不合法?
这是使用助手的替代方法on_scope_success
(如 Barry Revzin 所建议):
虽然invoke_log_return_scope
要短得多,但这需要函数行为的不同心智模型和新抽象的实现。令人惊讶的是,两者都g++
使用clang++
此解决方案执行 RVO/复制省略。
正如Ben Voigt所提到的,这种方法的一个主要缺点是 的返回值f
不能是日志消息的一部分。
c++ - 在 C++ 非类型模板参数中使用 decltype(auto)
我正在学习decltype(auto)
非类型模板参数的 C++17 新特性。我写了一个简单的代码片段如下:
据我了解,Foo<42>
应该与Foo<x>
.
但是,该static_assert
语句使用 clang++、MSVC 19.27 编译,但使用 GCC 10.2、MSVC 19.25 编译失败。
我的问题是:为什么编译器的行为不同?标准对此有何评论?
链接到编译器资源管理器:
铿锵++ https://godbolt.org/z/66M695
gcc https://godbolt.org/z/3v5Mhd
MSVC 19.25 https://godbolt.org/z/qP6v89
MSVC 19.27 https://godbolt.org/z/14aK5Y
c++ - C ++ 14函数返回对象数组,尽管复制构造函数被删除
我知道,从旧的 C++98 开始,如果函数声明/定义中未提及,则返回类型为复制的(按值),否则使用地址运算符“&”。
现在我正在玩弄 auto 和 decltype 的概念,让编译器确定返回类型。在一个示例中,我写了一个class A
除默认 ctor 外的任何其他 ctor 都被删除的地方(A 类取自一个真实项目 - 我调查了一些问题)。类 A 的对象与 etl::array (嵌入式模板库,在堆栈上创建的具有固定大小的数组)一起构造,请参见下面的示例代码。
我希望 etl::array 将被复制到 main() 例程中并分配给局部变量 x。由于已删除的副本 ctor,我不希望在数组中有 A 的副本。但是,代码可以编译,我可以在 etl::array 的元素上调用该函数。我无法理解为什么这是有效的以及为什么它正在编译?我想知道decltype(auto)
最后是什么类型。我之所以选择decltype(auto)
是因为 Scott-Meyers Item 2 和 Item 3。对于 item 3,我不确定对 decltype 主题有完整的了解..
当我单步执行代码时,它工作正常,让我陷入困境......
非常感谢有关此主题的任何帮助!
非常感谢您的帮助,对我很有启发。现在我终于知道它为什么起作用了 :-D - 你让我很开心!
c++ - 返回 auto&& 和 decltype(auto) 有什么区别?
我正在尝试制作模板包装函数,它应该转发参数和返回值。而且我无法决定使用哪种更好auto&&
或decltype(auto)
返回类型更好。我已经阅读了 Scott Meyers的文章,并了解到与不剥离 ref_qualifiersdecltype(auto)
相比,有必要返回。auto
据我了解,相同的论点适用于使用auto&&
over auto
。现在我有以下问题:
- 我是对的,当我们返回对对象的引用之间没有区别
decltype(auto)
吗auto&&
? - 如果我们返回
rvalue
对象会发生什么,例如:return int{};
?返回值会是悬空引用吗? decltype(auto)
和 和有什么不一样auto&&
?什么更适合作为前向回报类型?
c++ - 为什么 decltype(auto) 不返回左值的地址?
我有以下代码
我本来希望 foo 的类型是
因为a是左值,而 decltype(a) 是参考。
如果我做了一个非常相似的事情,但用一个完美的转发 lambda 混淆它,我会得到不同的结果。
foo 的返回类型变成int&
任何人都可以告诉我这里发生的事情的确切规则吗?
c++ - 完美转发的pair的返回元素
我想编写一个函数,该函数将评估一些返回一对(可能作为引用,可能包含引用)并返回第二个元素的表达式,但它转发引用而不是复制它们。
这是一个不太有效的示例:
问题在于foo(value_of_values)
:value_of_values
返回一个纯右值,但get<1>
返回一个右值引用,因此 foo 返回一个对立即消失的临时的右值引用。
我知道我可能可以做一些模板元编程decltype
来区分函数返回值是包含非引用(必须作为非引用返回)的纯右值的情况与其他情况,但是有没有更优雅的解决方案?
(使用std::forward<F>(func)().second
而不是get<1>(...)
没有帮助:如果用括号括起来,则会出现完全相同的问题,因为对prvalue的成员访问是一个xvalue,导致decltype(auto)
推断int &&
,如果没有括号,则ref_of_values
案例返回副本而不是引用,因为无decltype
括号成员访问表达式的语义)。