首页 > 解决方案 > “std::decay_t (C++20 前)std::remove_cvref_t (C++20 起)”是什么意思?

问题描述

标签: c++optional

解决方案


这很微妙——两个类周围有一个框,表示子短语。假装它们之间有一个“或”,然后这样读:

该函数不参与重载决议,除非 [ std::decay_t<U>(until C++20) or std::remove_cvref_t<U>(since C++20) ] 不是std::optional<T>...

你可以把它读成两个替代句子:

  • 函数不参与重载决议,除非std::decay_t<U>is not std::optional<T>... (直到 C++20)

  • 函数不参与重载决议,除非std::remove_cvref_t<U>is not std::optional<T>... (C++20 起)

(在 C++20 中,他们收紧了规范并decayremove_cvref. .)decayremove_cvref

在英语中,它基本上是在说:

该函数不参与重载决议,除非U—ignoring &, &&, const, 和volatile—is not std::optional<T>...

换句话说,过载 (4) 仅在某些条件下可用。如果不满足这些条件,那么完美转发将被取消;据推测,SFINAE用于禁用它。


推荐阅读