谁能详细解释一下这句话是什么意思?
template< class U = T > optional& operator=( U&& value );
4) ...The function does not participate in overload resolution unless
std::decay_t<U>
(until C++20)std::remove_cvref_t<U>
(since C++20) is notstd::optional<T>
...
( source )
在第 4 版中,没有任何动词的“std::decay_t<U>
(C++20 前) std::remove_cvref_t<U>
(C++20 起)”是什么意思?有错字吗?
最佳答案
这很微妙——两个类周围有一个框,表示一个子短语。假装它们之间有一个“或”,然后这样读:
The function does not participate in overload resolution unless [
std::decay_t<U>
(until C++20) orstd::remove_cvref_t<U>
(since C++20) ] is notstd::optional<T>
...
你可以把它看成两个交替的句子:
函数不参与重载决策,除非
std::decay_t<U>
不是std::optional<T>
... (直到 C++20)函数不参与重载决策,除非
std::remove_cvref_t<U>
不是std::optional<T>
... (C++20 起)
(在 C++20 中,他们收紧了规范并将 decay
替换为 remove_cvref
。两者本质上做同样的事情,但后者更精确。 decay
,如 remove_cvref
, 删除了限定符;但它也将数组转换为指针,这与这里无关。)
在英语中,它本质上是说:
The function does not participate in overload resolution unless
U
—ignoring&
,&&
,const
, andvolatile
—is notstd::optional<T>
...
换句话说,重载 (4) 仅在特定条件下可用。如果不满足这些条件,那么完美转发将被取消;据推测,SFINAE用于禁用它。
关于c++ - "std::decay_t<U> (until C++20) std::remove_cvref_t<U> (since C++20)"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59022998/