const_forward在C++中的可选实现中做了什么?

dor*_*mon 3 c++ c++11 c++14 c++17

嗨,我std::optional这里看一下这里的一个实现,我发现这段代码片段让我困惑:

// workaround: std utility functions aren't constexpr yet
template <class T> inline constexpr T&& constexpr_forward(typename 
std::remove_reference<T>::type& t) noexcept
{
    return static_cast<T&&>(t);
}
Run Code Online (Sandbox Code Playgroud)

所以我不会通过以下方式理解这一点:

  1. 是什么typename在这里做?只是声明以下部分是一种类型?
  2. 我们为什么需要std::remove_reference这里?我们没有在type&部件中添加参考吗?
  3. "std效用函数还不是constexpr"是什么意思?这个函数如何使它们成为constexpr?它的主体只是一个static_cast.
  4. 这个函数在很多构造函数中使用,它看起来像这样:template <class... Args> constexpr storage_t( Args&&... args ) : value_(constexpr_forward<Args>(args)...) {},那么它对args做了什么?

非常感谢.

Whi*_*TiM 5

template <class T> inline constexpr T&& constexpr_forward(typename 
std::remove_reference<T>::type& t) noexcept
{
    return static_cast<T&&>(t);
}
Run Code Online (Sandbox Code Playgroud)
  1. 是什么typename在这里做?只是声明以下部分是一种类型?

std::remove_reference<T>::type是依赖于模板参数的依赖类型T,因此我们需要typename告诉编译器我们正在尝试使用依赖名称,

  1. 我们为什么需要std::remove_reference这里?我们没有在type&部件中添加参考吗?

如果您在此处检查此实用程序功能的示例用法

....
template <class... Args> explicit constexpr constexpr_optional_base(in_place_t, Args&&... args)
      : init_(true), storage_(constexpr_forward<Args>(args)...) {}
...
Run Code Online (Sandbox Code Playgroud)

您可以看到,可变参数类型参考类型用作显式模板参数constexpr_foward<Args>(args)....这将保留该类型的值类别.当任何参数是引用时,就好像我们调用了该实用程序函数一样constexpr_forward<Arg01&>(arg01).并且该模板的实例化将是

inline constexpr Arg01&&& constexpr_forward(Arg01& t) noexcept
{
    return static_cast<Arg01&&&>(t);
}
Run Code Online (Sandbox Code Playgroud)

通过参考折叠规则,我们有

inline constexpr Arg01& constexpr_forward(Arg01& t) noexcept
{
    return static_cast<Arg01&>(t);
}
Run Code Online (Sandbox Code Playgroud)

实际上,删除引用应该是多余的(阅读参考折叠);

  1. "std效用函数还不是constexpr"是什么意思?这个函数如何使它们成为constexpr?它的主体只是一个static_cast.

它只是在函数和构造函数中转发constexpr函数constexpr.

  1. 这个函数在很多构造函数中使用,它看起来像这样:template <class... Args> constexpr storage_t( Args&&... args ) : value_(constexpr_forward<Args>(args)...) {},那么它对args做了什么?

基本上如上所述..