【问题标题】:How to perfectly forward `auto&&` in a generic lambda?如何在通用 lambda 中完美转发`auto&&`?
【发布时间】:2014-08-23 11:58:21
【问题描述】:

C++14 支持通用 lambda。但是,clang 3.4 拒绝了以下代码。

#include <utility>

void f(int);
void f(int&);

int main()
{
    [](auto&& v) { f(std::forward<auto>(v)); }(8); // error
}

如何在通用 lambda 中完美转发auto&amp;&amp;

【问题讨论】:

    标签: c++ c++11 auto lambda perfect-forwarding


    【解决方案1】:

    auto 不是一个类型,所以我并不奇怪这不起作用。但是你不能用decltype吗?

    [](auto&& v) { f(std::forward<decltype(v)>(v)); }(8);
    

    Scott Meyers has more details.

    【讨论】:

    • 干燥 -- #define FORWARD(x) std::forward&lt;decltype(x)&gt;(x) -- ick.
    • @Yakk 还有 AGUOM:避免无故使用宏。 ;-)
    • 如果某些东西需要宏来 DRY,请弄清楚如何改进语言!
    • 不重复关于宏的一般性讨论,这个特定的宏有什么问题吗?它不适用于参数包 (auto ...),否则它是正确的,不是吗?
    • @Aaron 这个名字是错误的:每个长期存在的宏都应该被命名空间以避免名字冲突(例如,被称为MY_LIBRARY_NAME_FORWARD),这当然会大大降低它的可读性。更根本的是,宏根本没有必要。我同意 Yakk 关于“DRY”的观点,但这里重复的是一个单一的、简单的标识符,而不是一个复杂的表达式。
    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 2017-08-05
    • 2018-08-08
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2012-11-28
    相关资源
    最近更新 更多