std::意外的构造函数约束

Not*_*tMe 3 c++ c++23 std-expected

我正在阅读 cpp 23 标准,我偶然发现了std::unexpected.

Expected.un.cons部分定义

template<class Err = E>
constexpr explicit unexpected(Err&& e);
Run Code Online (Sandbox Code Playgroud)

具有以下约束(除其他外)

is_same_v<remove_cvref_t<Err>, unexpected> is false; 
Run Code Online (Sandbox Code Playgroud)

考虑到unexpected是一个类模板,这个表达式什么时候为真?

use*_*522 9

unexpected是类模板范围内的注入类名称。它指的是模板的当前专业化。它并不引用模板本身,因为在类范围之外具有相同的名称。

例如,如果你写

template<typename T>
struct X {
    static X x;
};
Run Code Online (Sandbox Code Playgroud)

那么X<T>::x是类型X<T>。您不必在 的声明中重复模板参数列表x。如果没有给出,那么它解析为注入类名,它引用具有相同模板参数列表的模板的当前特化。

该约束的存在使得在重载决策中不能选择构造函数而不是复制构造函数,否则对于非左const值参数可能会发生这种情况。