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)
所以我不会通过以下方式理解这一点:
typename在这里做?只是声明以下部分是一种类型?std::remove_reference这里?我们没有在type&部件中添加参考吗?static_cast.template <class... Args>
constexpr storage_t( Args&&... args ) : value_(constexpr_forward<Args>(args)...) {},那么它对args做了什么?非常感谢.
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)
- 是什么
typename在这里做?只是声明以下部分是一种类型?
std::remove_reference<T>::type是依赖于模板参数的依赖类型T,因此我们需要typename告诉编译器我们正在尝试使用依赖名称,
- 我们为什么需要
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)
实际上,删除引用应该是多余的(阅读参考折叠);
- "std效用函数还不是constexpr"是什么意思?这个函数如何使它们成为constexpr?它的主体只是一个
static_cast.
它只是在函数和构造函数中转发非constexpr函数constexpr.
- 这个函数在很多构造函数中使用,它看起来像这样:
template <class... Args> constexpr storage_t( Args&&... args ) : value_(constexpr_forward<Args>(args)...) {},那么它对args做了什么?
基本上如上所述..
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |