首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你怎么理解"std::forward只是句法糖“?这是真的吗?

你怎么理解"std::forward只是句法糖“?这是真的吗?
EN

Stack Overflow用户
提问于 2020-06-14 00:58:11
回答 3查看 177关注 0票数 0

你怎么理解"std::forward只是句法糖“?这是真的吗?如果您能详细解释下面的相关代码,我将不胜感激。

根据文档(https://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00416_source.html),下面是std::forward的实现

代码语言:javascript
复制
    /**
    *  @brief  Forward an lvalue.
    *  @return The parameter cast to the specified type.
    *
    *  This function is used to implement "perfect forwarding".
    */
   template<typename _Tp>
     constexpr _Tp&&
     forward(typename std::remove_reference<_Tp>::type& __t) noexcept
     { return static_cast<_Tp&&>(__t); }



  /**
    *  @brief  Forward an rvalue.
    *  @return The parameter cast to the specified type.
    *
    *  This function is used to implement "perfect forwarding".
    */
   template<typename _Tp>
     constexpr _Tp&&
     forward(typename std::remove_reference<_Tp>::type&& __t) noexcept
     {
       static_assert(!std::is_lvalue_reference<_Tp>::value, "template argument"
                     " substituting _Tp is an lvalue reference type");
       return static_cast<_Tp&&>(__t);
     }
    /**
    *  @brief  Convert a value to an rvalue.
    *  @param  __t  A thing of arbitrary type.
    *  @return The parameter cast to an rvalue-reference to allow moving it.
   */
   template<typename _Tp>
     constexpr typename std::remove_reference<_Tp>::type&&
     move(_Tp&& __t) noexcept
     { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-14 01:12:27

“性病::前进只是语法糖”?这是真的吗?

这取决于什么是“只是语法糖”。

你怎么理解“std::forward只是句法糖”?

我认为描述std::forward的一种正确和类似的方法是,它是一个非常简单的函数模板,可以在标准C++中实现。

换句话说,在标准库中提供std::forward并不是程序员完成完美转发的必要条件。

票数 1
EN

Stack Overflow用户

发布于 2020-06-14 02:06:12

实际的问题似乎是:“std::forward是做什么的,为什么它是必要的?”

std::forward可以称为static_cast的语法糖。通常(可能总是)它做的只是一个演员。它将函数的参数转换为r值resp。L-价值参考-这在许多情况下是必要的,例如:

代码语言:javascript
复制
#include <iostream>

void f(int &) {
    std::cout << "L-value reference\n";
}

void f(int &&) {
    std::cout << "R-value reference\n";
}

template<typename T>
void g(T &&a) {
    f(a);
}

template<typename T>
void h(T &&a) {
    f(std::forward<T>(a));
}

template<typename T>
void i(T &&a) {
    f(static_cast<T&&>(a));
}

int main() {
    int a = 5;
    g(a);
    g(5);
    h(a);
    h(5);
    i(a);
    i(5);
}

版画

代码语言:javascript
复制
L-value reference
L-value reference
L-value reference
R-value reference
L-value reference
R-value reference

函数调用g(5)调用f(int &)。这通常是预料不到的。

这是因为所有函数参数都是l-值。他们有一个名字,人们可以取其地址并分配一个值,例如:

代码语言:javascript
复制
#include <iostream>

void f(int &) {
    std::cout << " L-value reference\n";
}

void f(int &&) {
    std::cout << " R-value reference\n";
}

void j(int &&a) {
    std::cout << &a;
    a = 6;
    f(a);
}

void k(int &&a) {
    std::cout << &a;
    a = 6;
    f(std::forward<int>(a));
}

int main() {
    j(5);
    k(5);
}

版画

代码语言:javascript
复制
0x7ffc2db04ea8 L-value reference
0x7ffc2db04eac R-value reference
票数 1
EN

Stack Overflow用户

发布于 2020-06-14 14:39:29

我理解问题的精神,但我不同意问题的前提。

由于std::forward可以使用标准C++的语法来实现,所以它不是通常所说的“语法糖”;也就是说,std::forward的实现不需要在语言中添加新的语法。“语法糖”是语言设计者添加的一种新语法,它提供了一种不那么冗长的方式来表达所希望的行为,尽管如此,它仍然可以用语言来表达。(如果它以前是不可表达的,那么它就不是语法糖;它是一种新的语言特性)

C++11中确实添加了实际的语法糖.基于范围的循环是语法糖.

无论如何,关于精神的问题,要理解std::forward的实现,您需要了解两件事

  1. C++的引用折叠规则
  2. 只是“转发引用”与R值引用不同的一般概念-- Scott所称的“通用引用”。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62367255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档