c++ - "std::decay_t<U> (until C++20) std::remove_cvref_t<U> (since C++20)"是什么意思?

标签 c++ option-type

谁能详细解释一下这句话是什么意思?

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 not std::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) or std::remove_cvref_t<U> (since C++20) ] is not std::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, and volatile—is not std::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/

相关文章:

properties - 需要和/或有条件需要的属性的 jsonschema 验证

与枚举和可选元组关联值的 Swift 模式匹配

c++ - 如何脱离 std::experimental::optional?

c++ - 不需要实例的类

c++ - 编译错误: Conversion from CSV to Libsvm format

swift - 如何保护可能失败的属性初始化

ios - 检查 `if let` 是否为零

c++ - SO_RCVTIME和SO_RCVTIMEO不影响Boost.Asio操作

c++ - 我的埃拉托色尼筛法耗时太长

c++ - 按值获取枚举关键字